Hey Evo Hackers, I've been working on updating the developmental component previously known as "brainread" to work with the current version of evolution. It is a feed aggregator component that I've hoped would be released with evolution sometime in the future, but had stalled in development. I've attached my current patch to evolution's cvs HEAD that should compile in nicely. The code is still rather mangled, but I'm cleaning that up. Also I'm sure I have a ton of problems as I'm fairly knew to programing evo and don't really know incredibly well how it does everything. You can check the feeds/TODO for more things that I'm planning and things I've done so far. So feel free to give me any feedback you have. Tell me what you hate, and what you think should be changed. I was more or less trying to build out what the gui should eventually be like, and was going to try and am working on filling in the coding behind it now that a fair amount of the design is done. If anyone is interested in working on this substantially let me know. If you want to make patches to my busted code, go ahead and submit it back to me. Things I'm trying to get done this month: * Finish building the new folder/feed data types to store in the sidebar. Right now it's just using ESource* data types, which can't form a forest or tree type strcuture to organize the feeds. Things I'd like from anyone interested: * Clarifications anywhere that I might have been confusing code * Any code corrections * If anyone wants to start working on a more generic feed support system to encompass atom and other feed types (currently only rss is supported) * If someone wants to help implement "Print", "Cut", "Copy", "Paste" commands * Anything anyone is interested in helping with anything else Note: You'll have to move the attached feed-icon.png into the evolution/feeds/ directory for it to build properly. -- Andrew Case
--- evolution-cvs/Makefile.am 2005-12-01 19:53:16.000000000 -0500 +++ evolution/Makefile.am 2006-05-15 09:58:17.000000000 -0400 @@ -46,6 +46,7 @@ SUBDIRS = \ calendar \ art \ composer \ + feeds \ mail \ plugins \ ui \ --- evolution-cvs/configure.in 2006-05-11 14:36:33.000000000 -0400 +++ evolution/configure.in 2006-05-15 09:58:17.000000000 -0400 @@ -1298,6 +1298,11 @@ EVO_SET_COMPILE_FLAGS(EVOLUTION_MAIL, ca AC_SUBST(EVOLUTION_MAIL_CFLAGS) AC_SUBST(EVOLUTION_MAIL_LIBS) +dnl --- evolution-feeds flags + +PKG_CHECK_MODULES(FEEDS_COMPONENT, libsoup-2.2 libebook-1.2 libgtkhtml-3.8 libxml-2.0 glib-2.0)AC_SUBST(FEEDS_COMPONENT_CFLAGS) +AC_SUBST(FEEDS_COMPONENT_LIBS) + dnl -- evolution-data-server IDL and version AC_DEFINE(DATASERVER_API_VERSION, "1.2", evolution-data-server API version) @@ -1701,6 +1706,7 @@ calendar/gui/Makefile calendar/gui/alarm-notify/Makefile calendar/gui/dialogs/Makefile composer/Makefile +feeds/Makefile mail/Makefile mail/default/Makefile mail/default/C/Makefile diff -Npru evolution-cvs/feeds/GNOME_Evolution_Feeds.server.in.in evolution/feeds/GNOME_Evolution_Feeds.server.in.in --- evolution-cvs/feeds/GNOME_Evolution_Feeds.server.in.in 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/GNOME_Evolution_Feeds.server.in.in 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,88 @@ +<!-- This file is preprocessed by Makefile.am to fill in the + - @variables@, and then processed again by intltool to add in + - any available translations for properties whose names + - start with "_". (eg, "_name"). + - + - The resulting file is installed into the bonobo-activation + - "servers" directory, where bonobo-activation will see it + - and learn about our component. + - + - You can use "xmllint" to make sure you don't have any XML + - syntax errors. (bonobo-activation will just silently ignore + - any .server file it can't parse cleanly). + --> + +<!-- ("oaf" is the old name for bonobo-activation) --> + +<oaf_info> + + <!-- Define the component factory (which is used to construct + - instances of the component). Factories are normally used + - when you want to be able to create multiple instances of + - something; the fact that we use one here (even though + - there will only ever be one instance of the component + - active at a time) is historical. + --> + <oaf_server iid="OAFIID:GNOME_Evolution_Feeds_Factory:@API_VERSION@" + type="shlib" + location="@COMPONENTDIR@/libevolution-feeds.so"> + + <!-- Declare that we implement the factory interface --> + <oaf_attribute name="repo_ids" type="stringv"> + <item value="IDL:GNOME/ObjectFactory:1.0"/> + </oaf_attribute> + + <!-- This string is mostly just informational. The user will + - probably never see it. + --> + <oaf_attribute name="name" type="string" + _value="Evolution Blog/RSS Viewer factory"/> + </oaf_server> + + <!-- Now define the component itself --> + <oaf_server iid="OAFIID:GNOME_Evolution_Feeds_Component:@API_VERSION@" + type="factory" + location="OAFIID:GNOME_Evolution_Feeds_Factory:@API_VERSION@"> + + <!-- Declare that we implement the Evolution Component interface + - so the evolution shell will load this component. + --> + <oaf_attribute name="repo_ids" type="stringv"> + <item value="IDL:GNOME/Evolution/Component:@API_VERSION@"/> + </oaf_attribute> + + <!-- This string is also mostly just informational, although + - if this was an out-of-process component like Ximian + - Connector, then this is the name that would be printed + - as the process was killed during a "force-shutdown". + --> + <oaf_attribute name="name" type="string" + _value="Evolution Blog/RSS Viewer"/> + + <!-- The short name of the component. Used internally by the + - shell. Should be the same as the component's GConf + - subtree (under /apps/evolution) and its local storage + - directory (under ~/.evolution) + --> + <oaf_attribute name="evolution:component_alias" type="string" + value="feeds"/> + + <!-- This determines the label and icon displayed on the + - component's sidebar button, and the ordering of that + - button relative to the others. + --> + <oaf_attribute name="evolution:button_label" type="string" + _value="Feeds"/> + <oaf_attribute name="evolution:button_icon" type="string" + value="@ICONDIR@/feed-icon.png"/> + <oaf_attribute name="evolution:button_sort_order" type="string" + value="10"/> + + <!-- This determines the label and shortcut displayed in the + - shell's view menu. + --> + <oaf_attribute name="evolution:menu_label" type="string" _value="_Feeds"/> + <oaf_attribute name="evolution:menu_accelerator" type="string" _value="*Control*F10"/> + </oaf_server> + +</oaf_info> diff -Npru evolution-cvs/feeds/Makefile.am evolution/feeds/Makefile.am --- evolution-cvs/feeds/Makefile.am 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/Makefile.am 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,108 @@ +component_LTLIBRARIES = libevolution-feeds.la +BASE_VERSION= BASE_VERSION@ + +libevolution_feeds_la_SOURCES = \ + $(MARSHAL_GENERATED) \ + $(IDL_GENERATED) \ + $(top_builddir) \ + ef-popup.c \ + ef-popup.h \ + feeds-blog-fetcher.c \ + feeds-blog-fetcher.h \ + feeds-component-factory.c \ + feeds-component.c \ + feeds-component.h \ + feed-type-rss.c \ + feed-type-rss.h \ + feeds-rss-fetcher.c \ + feeds-rss-fetcher.h \ + ef-feedlist.c \ + ef-feedlist.h \ + feeds-utils.c \ + feeds-utils.h \ + feeds-view.c \ + feeds-view.h + +libevolution_feeds_la_LIBADD = \ + $(top_builddir) \ + $(FEEDS_COMPONENT_LIBS) + +INCLUDES = \ + $(FEEDS_COMPONENT_CFLAGS) \ + -I$(top_builddir)/shell \ + -I$(top_srcdir)/shell \ + -I$(top_srcdir) \ + -I$(top_srcdir)/widgets/misc \ + -DEVOLUTION_UIDIR=\""$(evolutionuidir)"\" \ + -DPREFIX=\""$(prefix)"\" \ + -DFEEDS_ICONDIR="\"$(icondir)\"" \ + -DFEEDS_GLADEDIR="\"$(gladedir)\"" + + +feeds-marshal.h: feeds-marshal.list + ( @GLIB_GENMARSHAL@ --prefix=feeds_marshal feeds-marshal.list --header > feeds-marshal.h.tmp \ + && mv feeds-marshal.h.tmp feeds-marshal.h ) \ + || ( rm -f feeds-marshal.h.tmp && exit 1 ) + +feeds-marshal.c: feeds-marshal.h + ( (echo '#include "feeds-marshal.h"'; @GLIB_GENMARSHAL@ --prefix=feeds_marshal feeds-marshal.list --body) > feeds-marshal.c.tmp \ + && mv feeds-marshal.c.tmp feeds-marshal.c ) \ + || ( rm -f feeds-marshal.c.tmp && exit 1 ) + +MARSHAL_GENERATED = feeds-marshal.c feeds-marshal.h + EVO_MARSHAL_RULE@ + +EXTRA_DIST = \ + feeds-marshal.list \ + $(glade_DATA) + +BUILT_SOURCES = $(MARSHAL_GENERATED) +CLEANFILES = $(MARSHAL_GENERATED) +NODIST_FILES = $(MARSHAL_GENERATED) + +serverdir = $(libdir)/bonobo/servers +server_DATA = GNOME_Evolution_Feeds.server + +%.server.in: %.server.in.in + rm -f $@ + sed -e "s/@API_VERSION@/$(BASE_VERSION)/" \ + -e "s:@COMPONENTDIR@:$(componentdir):" \ + -e "s:@ICONDIR@:$(icondir):" \ + $^ > $@ + + INTLTOOL_SERVER_RULE@ + +CLEANFILES += $(server_DATA) +NODIST_FILES += $(server_DATA) + + +icondir = $(datadir)/feeds/$(BASE_VERSION) +icon_DATA = feed-icon.png + + +gladedir = $(datadir)/feeds/$(BASE_VERSION) +glade_DATA = feeds.glade + + +IDLS = +#IDLS = $(EVOLUTION_idldir)/Evolution-Addressbook-SelectNames.idl + +IDL_GENERATED = +#IDL_GENERATED = \ +# Evolution-Addressbook-SelectNames.h \ +# Evolution-Addressbook-SelectNames-common.c \ +# Evolution-Addressbook-SelectNames-skels.c \ +# Evolution-Addressbook-SelectNames-stubs.c + +$(IDL_GENERATED): $(IDLS) + $(ORBIT_IDL) $(EVOLUTION_IDL_INCLUDES) \ + $(EVOLUTION_idldir) +# $(ORBIT_IDL) $(EVOLUTION_IDL_INCLUDES) \ +# $(EVOLUTION_idldir)/Evolution-Addressbook-SelectNames.idl + +BUILT_SOURCES += $(IDL_GENERATED) +NODIST_FILES += $(IDL_GENERATED) +CLEANFILES += $(IDL_GENERATED) + +dist-hook: + cd $(distdir); rm -f $(NODIST_FILES) diff -Npru evolution-cvs/feeds/Makefile.in evolution/feeds/Makefile.in --- evolution-cvs/feeds/Makefile.in 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/Makefile.in 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,861 @@ +# Makefile.in generated by automake 1.9.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 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. + + SET_MAKE@ + + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = feeds +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in TODO +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(componentdir)" "$(DESTDIR)$(gladedir)" \ + "$(DESTDIR)$(icondir)" "$(DESTDIR)$(serverdir)" +componentLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(component_LTLIBRARIES) +am__DEPENDENCIES_1 = .. +am__DEPENDENCIES_2 = +libevolution_feeds_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) +am__objects_1 = feeds-marshal.lo +am__objects_2 = +am_libevolution_feeds_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ + $(am__objects_2) ef-popup.lo feeds-blog-fetcher.lo \ + feeds-component-factory.lo feeds-component.lo feed-type-rss.lo \ + feeds-rss-fetcher.lo ef-feedlist.lo feeds-utils.lo \ + feeds-view.lo +libevolution_feeds_la_OBJECTS = $(am_libevolution_feeds_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libevolution_feeds_la_SOURCES) +DIST_SOURCES = $(libevolution_feeds_la_SOURCES) +gladeDATA_INSTALL = $(INSTALL_DATA) +iconDATA_INSTALL = $(INSTALL_DATA) +serverDATA_INSTALL = $(INSTALL_DATA) +DATA = $(glade_DATA) $(icon_DATA) $(server_DATA) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +A11Y_CFLAGS = @A11Y_CFLAGS@ +A11Y_LIBS = @A11Y_LIBS@ +ACLOCAL = @ACLOCAL@ +ALL_LINGUAS = @ALL_LINGUAS@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BASE_VERSION = @BASE_VERSION@ +BONOBOUI_REQUIRED = @BONOBOUI_REQUIRED@ +CAMEL_CFLAGS = @CAMEL_CFLAGS@ +CAMEL_EXCHANGE_CFLAGS = @CAMEL_EXCHANGE_CFLAGS@ +CAMEL_EXCHANGE_LIBS = @CAMEL_EXCHANGE_LIBS@ +CAMEL_GROUPWISE_CFLAGS = @CAMEL_GROUPWISE_CFLAGS@ +CAMEL_GROUPWISE_LIBS = @CAMEL_GROUPWISE_LIBS@ +CAMEL_LIBS = @CAMEL_LIBS@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CERT_UI_CFLAGS = @CERT_UI_CFLAGS@ +CERT_UI_LIBS = @CERT_UI_LIBS@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DATASERVER_EXEC_VERSION = @DATASERVER_EXEC_VERSION@ +DATASERVER_IDL = @DATASERVER_IDL@ +DBUS_VERSION = @DBUS_VERSION@ +DEFAULT_BINARY_FALSE = @DEFAULT_BINARY_FALSE@ +DEFAULT_BINARY_TRUE = @DEFAULT_BINARY_TRUE@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEVELOPMENT = @DEVELOPMENT@ +DLLTOOL = @DLLTOOL@ +DTAPPINTEGRATE = @DTAPPINTEGRATE@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EDS_PACKAGE = @EDS_PACKAGE@ +EDS_REQUIRED = @EDS_REQUIRED@ +EGREP = @EGREP@ +ENABLE_EXCHANGE_FALSE = @ENABLE_EXCHANGE_FALSE@ +ENABLE_EXCHANGE_TRUE = @ENABLE_EXCHANGE_TRUE@ +ENABLE_GTK_DOC_FALSE = @ENABLE_GTK_DOC_FALSE@ +ENABLE_GTK_DOC_TRUE = @ENABLE_GTK_DOC_TRUE@ +ENABLE_IMAP4_FALSE = @ENABLE_IMAP4_FALSE@ +ENABLE_IMAP4_TRUE = @ENABLE_IMAP4_TRUE@ +ENABLE_IMAPP_FALSE = @ENABLE_IMAPP_FALSE@ +ENABLE_IMAPP_TRUE = @ENABLE_IMAPP_TRUE@ +ENABLE_LDAP_FALSE = @ENABLE_LDAP_FALSE@ +ENABLE_LDAP_TRUE = @ENABLE_LDAP_TRUE@ +ENABLE_NNTP_FALSE = @ENABLE_NNTP_FALSE@ +ENABLE_NNTP_TRUE = @ENABLE_NNTP_TRUE@ +ENABLE_PILOT_CONDUITS_FALSE = @ENABLE_PILOT_CONDUITS_FALSE@ +ENABLE_PILOT_CONDUITS_TRUE = @ENABLE_PILOT_CONDUITS_TRUE@ +ENABLE_PURIFY_FALSE = @ENABLE_PURIFY_FALSE@ +ENABLE_PURIFY_TRUE = @ENABLE_PURIFY_TRUE@ +ENABLE_SMIME_FALSE = @ENABLE_SMIME_FALSE@ +ENABLE_SMIME_TRUE = @ENABLE_SMIME_TRUE@ +ENABLE_TEST_COMPONENT_FALSE = @ENABLE_TEST_COMPONENT_FALSE@ +ENABLE_TEST_COMPONENT_TRUE = @ENABLE_TEST_COMPONENT_TRUE@ +EVOLUTION_ADDRESSBOOK_CFLAGS = @EVOLUTION_ADDRESSBOOK_CFLAGS@ +EVOLUTION_ADDRESSBOOK_CONDUIT_CFLAGS = @EVOLUTION_ADDRESSBOOK_CONDUIT_CFLAGS@ +EVOLUTION_ADDRESSBOOK_CONDUIT_LIBS = @EVOLUTION_ADDRESSBOOK_CONDUIT_LIBS@ +EVOLUTION_ADDRESSBOOK_LIBS = @EVOLUTION_ADDRESSBOOK_LIBS@ +EVOLUTION_CALENDAR_CFLAGS = @EVOLUTION_CALENDAR_CFLAGS@ +EVOLUTION_CALENDAR_CONDUIT_CFLAGS = @EVOLUTION_CALENDAR_CONDUIT_CFLAGS@ +EVOLUTION_CALENDAR_CONDUIT_LIBS = @EVOLUTION_CALENDAR_CONDUIT_LIBS@ +EVOLUTION_CALENDAR_LIBS = @EVOLUTION_CALENDAR_LIBS@ +EVOLUTION_DIR = @EVOLUTION_DIR@ +EVOLUTION_MAIL_CFLAGS = @EVOLUTION_MAIL_CFLAGS@ +EVOLUTION_MAIL_LIBS = @EVOLUTION_MAIL_LIBS@ +EVOLUTION_TEST_CFLAGS = @EVOLUTION_TEST_CFLAGS@ +EVOLUTION_TEST_LIBS = @EVOLUTION_TEST_LIBS@ +EXEEXT = @EXEEXT@ +EXTRA_GNOME_CFLAGS = @EXTRA_GNOME_CFLAGS@ +EXTRA_GNOME_LIBS = @EXTRA_GNOME_LIBS@ +E_NAME_CFLAGS = @E_NAME_CFLAGS@ +E_NAME_LIBS = @E_NAME_LIBS@ +E_UTIL_CFLAGS = @E_UTIL_CFLAGS@ +E_UTIL_LIBS = @E_UTIL_LIBS@ +E_WIDGETS_CFLAGS = @E_WIDGETS_CFLAGS@ +E_WIDGETS_LIBS = @E_WIDGETS_LIBS@ +F77 = @F77@ +FEEDS_COMPONENT_CFLAGS = @FEEDS_COMPONENT_CFLAGS@ +FEEDS_COMPONENT_LIBS = @FEEDS_COMPONENT_LIBS@ +FFLAGS = @FFLAGS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ +GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIT_CFLAGS = @GIT_CFLAGS@ +GIT_LIBS = @GIT_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GNOME_FULL_CFLAGS = @GNOME_FULL_CFLAGS@ +GNOME_FULL_LIBS = @GNOME_FULL_LIBS@ +GNOME_PILOT_CFLAGS = @GNOME_PILOT_CFLAGS@ +GNOME_PILOT_LIBS = @GNOME_PILOT_LIBS@ +GNOME_VFS_REQUIRED = @GNOME_VFS_REQUIRED@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GSTREAMER_CFLAGS = @GSTREAMER_CFLAGS@ +GSTREAMER_LIBS = @GSTREAMER_LIBS@ +GTKDOC = @GTKDOC@ +GTKHTML_CFLAGS = @GTKHTML_CFLAGS@ +GTKHTML_DATADIR = @GTKHTML_DATADIR@ +GTKHTML_LIBS = @GTKHTML_LIBS@ +GTKHTML_PACKAGE = @GTKHTML_PACKAGE@ +GTKHTML_REQUIRED = @GTKHTML_REQUIRED@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_DTAPPINTEGRATE_FALSE = @HAVE_DTAPPINTEGRATE_FALSE@ +HAVE_DTAPPINTEGRATE_TRUE = @HAVE_DTAPPINTEGRATE_TRUE@ +HAVE_JW = @HAVE_JW@ +HAVE_JW_FALSE = @HAVE_JW_FALSE@ +HAVE_JW_TRUE = @HAVE_JW_TRUE@ +HAVE_KDE_APPLNK_FALSE = @HAVE_KDE_APPLNK_FALSE@ +HAVE_KDE_APPLNK_TRUE = @HAVE_KDE_APPLNK_TRUE@ +HTML_DIR = @HTML_DIR@ +ICONV_CFLAGS = @ICONV_CFLAGS@ +ICONV_LIBS = @ICONV_LIBS@ +IDL_INCLUDES = @IDL_INCLUDES@ +IMPORTERS_CFLAGS = @IMPORTERS_CFLAGS@ +IMPORTERS_LIBS = @IMPORTERS_LIBS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTERFACE_VERSION = @INTERFACE_VERSION@ +INTLLIBS = @INTLLIBS@ +INTLTOOL_CAVES_RULE = @INTLTOOL_CAVES_RULE@ +INTLTOOL_DESKTOP_RULE = @INTLTOOL_DESKTOP_RULE@ +INTLTOOL_DIRECTORY_RULE = @INTLTOOL_DIRECTORY_RULE@ +INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ +INTLTOOL_ICONV = @INTLTOOL_ICONV@ +INTLTOOL_KBD_RULE = @INTLTOOL_KBD_RULE@ +INTLTOOL_KEYS_RULE = @INTLTOOL_KEYS_RULE@ +INTLTOOL_MERGE = @INTLTOOL_MERGE@ +INTLTOOL_MSGFMT = @INTLTOOL_MSGFMT@ +INTLTOOL_MSGMERGE = @INTLTOOL_MSGMERGE@ +INTLTOOL_OAF_RULE = @INTLTOOL_OAF_RULE@ +INTLTOOL_PERL = @INTLTOOL_PERL@ +INTLTOOL_PONG_RULE = @INTLTOOL_PONG_RULE@ +INTLTOOL_PROP_RULE = @INTLTOOL_PROP_RULE@ +INTLTOOL_SCHEMAS_RULE = @INTLTOOL_SCHEMAS_RULE@ +INTLTOOL_SERVER_RULE = @INTLTOOL_SERVER_RULE@ +INTLTOOL_SERVICE_RULE = @INTLTOOL_SERVICE_RULE@ +INTLTOOL_SHEET_RULE = @INTLTOOL_SHEET_RULE@ +INTLTOOL_SOUNDLIST_RULE = @INTLTOOL_SOUNDLIST_RULE@ +INTLTOOL_THEME_RULE = @INTLTOOL_THEME_RULE@ +INTLTOOL_UI_RULE = @INTLTOOL_UI_RULE@ +INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ +INTLTOOL_XAM_RULE = @INTLTOOL_XAM_RULE@ +INTLTOOL_XGETTEXT = @INTLTOOL_XGETTEXT@ +INTLTOOL_XML_NOMERGE_RULE = @INTLTOOL_XML_NOMERGE_RULE@ +INTLTOOL_XML_RULE = @INTLTOOL_XML_RULE@ +JW = @JW@ +KDE_APPLNK_DIR = @KDE_APPLNK_DIR@ +KRB4_CFLAGS = @KRB4_CFLAGS@ +KRB4_LDFLAGS = @KRB4_LDFLAGS@ +KRB5_CFLAGS = @KRB5_CFLAGS@ +KRB5_LDFLAGS = @KRB5_LDFLAGS@ +LDAP_CFLAGS = @LDAP_CFLAGS@ +LDAP_LIBS = @LDAP_LIBS@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBFILTER_CFLAGS = @LIBFILTER_CFLAGS@ +LIBFILTER_LIBS = @LIBFILTER_LIBS@ +LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@ +LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@ +LIBSOUP_LIBS = @LIBSOUP_LIBS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +MANUAL_NSPR_CFLAGS = @MANUAL_NSPR_CFLAGS@ +MANUAL_NSPR_LIBS = @MANUAL_NSPR_LIBS@ +MANUAL_NSS_CFLAGS = @MANUAL_NSS_CFLAGS@ +MANUAL_NSS_LIBS = @MANUAL_NSS_LIBS@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MOZILLA_NSS_CFLAGS = @MOZILLA_NSS_CFLAGS@ +MOZILLA_NSS_LIBS = @MOZILLA_NSS_LIBS@ +MSGFMT = @MSGFMT@ +NMN_CFLAGS = @NMN_CFLAGS@ +NMN_LIBS = @NMN_LIBS@ +NM_CFLAGS = @NM_CFLAGS@ +NM_LIBS = @NM_LIBS@ +NM_SUPPORT_FALSE = @NM_SUPPORT_FALSE@ +NM_SUPPORT_GLIB_FALSE = @NM_SUPPORT_GLIB_FALSE@ +NM_SUPPORT_GLIB_TRUE = @NM_SUPPORT_GLIB_TRUE@ +NM_SUPPORT_TRUE = @NM_SUPPORT_TRUE@ +NO_UNDEFINED = @NO_UNDEFINED@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORBIT_CFLAGS = @ORBIT_CFLAGS@ +ORBIT_CONFIG = @ORBIT_CONFIG@ +ORBIT_IDL = @ORBIT_IDL@ +ORBIT_LIBS = @ORBIT_LIBS@ +OS_WIN32_FALSE = @OS_WIN32_FALSE@ +OS_WIN32_TRUE = @OS_WIN32_TRUE@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PTHREAD_LIB = @PTHREAD_LIB@ +PURIFY = @PURIFY@ +RANLIB = @RANLIB@ +REGEX_LIBS = @REGEX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHELL_CFLAGS = @SHELL_CFLAGS@ +SHELL_LIBS = @SHELL_LIBS@ +SOEXT = @SOEXT@ +SOUPTEMP_CFLAGS = @SOUPTEMP_CFLAGS@ +SOUPTEMP_LIBS = @SOUPTEMP_LIBS@ +STRIP = @STRIP@ +THREADS_CFLAGS = @THREADS_CFLAGS@ +THREADS_LIBS = @THREADS_LIBS@ +TZDIALOG_CFLAGS = @TZDIALOG_CFLAGS@ +TZDIALOG_LIBS = @TZDIALOG_LIBS@ +UPGRADE_REVISION = @UPGRADE_REVISION@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARN_CFLAGS = @WARN_CFLAGS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_AS = @ac_ct_AS@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DLLTOOL = @ac_ct_DLLTOOL@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_OBJDUMP = @ac_ct_OBJDUMP@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@ +all_plugins_base = @all_plugins_base@ +all_plugins_experimental = @all_plugins_experimental@ +all_plugins_standard = @all_plugins_standard@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +bindir_in_server_file = @bindir_in_server_file@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +componentdir = @componentdir@ +componentdir_in_server_file = @componentdir_in_server_file@ +datadir = @datadir@ +etspecdir = @etspecdir@ +evolutionhelpdir = @evolutionhelpdir@ +evolutionuidir = @evolutionuidir@ +exec_prefix = @exec_prefix@ +gladedir = $(datadir)/feeds/$(BASE_VERSION) +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +idldir = @idldir@ +images16dir = @images16dir@ +images48dir = @images48dir@ +imagesdir = @imagesdir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +plugindir = @plugindir@ +plugins_enabled = @plugins_enabled@ +prefix = @prefix@ +privconduitdir = @privconduitdir@ +privdatadir = @privdatadir@ +privincludedir = @privincludedir@ +privlibdir = @privlibdir@ +privlibexecdir = @privlibexecdir@ +privlibexecdir_in_server_file = @privlibexecdir_in_server_file@ +privsolibdir = @privsolibdir@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +serverdir = $(libdir)/bonobo/servers +sharedstatedir = @sharedstatedir@ +soundsdir = @soundsdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +viewsdir = @viewsdir@ +component_LTLIBRARIES = libevolution-feeds.la +libevolution_feeds_la_SOURCES = \ + $(MARSHAL_GENERATED) \ + $(IDL_GENERATED) \ + $(top_builddir) \ + ef-popup.c \ + ef-popup.h \ + feeds-blog-fetcher.c \ + feeds-blog-fetcher.h \ + feeds-component-factory.c \ + feeds-component.c \ + feeds-component.h \ + feed-type-rss.c \ + feed-type-rss.h \ + feeds-rss-fetcher.c \ + feeds-rss-fetcher.h \ + ef-feedlist.c \ + ef-feedlist.h \ + feeds-utils.c \ + feeds-utils.h \ + feeds-view.c \ + feeds-view.h + +libevolution_feeds_la_LIBADD = \ + $(top_builddir) \ + $(FEEDS_COMPONENT_LIBS) + +INCLUDES = \ + $(FEEDS_COMPONENT_CFLAGS) \ + -I$(top_builddir)/shell \ + -I$(top_srcdir)/shell \ + -I$(top_srcdir) \ + -I$(top_srcdir)/widgets/misc \ + -DEVOLUTION_UIDIR=\""$(evolutionuidir)"\" \ + -DPREFIX=\""$(prefix)"\" \ + -DFEEDS_ICONDIR="\"$(icondir)\"" \ + -DFEEDS_GLADEDIR="\"$(gladedir)\"" + +MARSHAL_GENERATED = feeds-marshal.c feeds-marshal.h +EXTRA_DIST = \ + feeds-marshal.list \ + $(glade_DATA) + +# $(ORBIT_IDL) $(EVOLUTION_IDL_INCLUDES) \ +# $(EVOLUTION_idldir)/Evolution-Addressbook-SelectNames.idl +BUILT_SOURCES = $(MARSHAL_GENERATED) $(IDL_GENERATED) +CLEANFILES = $(MARSHAL_GENERATED) $(server_DATA) $(IDL_GENERATED) +NODIST_FILES = $(MARSHAL_GENERATED) $(server_DATA) $(IDL_GENERATED) +server_DATA = GNOME_Evolution_Feeds.server +icondir = $(datadir)/feeds/$(BASE_VERSION) +icon_DATA = feed-icon.png +glade_DATA = feeds.glade +IDLS = +#IDLS = $(EVOLUTION_idldir)/Evolution-Addressbook-SelectNames.idl +IDL_GENERATED = +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu feeds/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu feeds/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-componentLTLIBRARIES: $(component_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(componentdir)" || $(mkdir_p) "$(DESTDIR)$(componentdir)" + @list='$(component_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(componentLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(componentdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(componentLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(componentdir)/$$f"; \ + else :; fi; \ + done + +uninstall-componentLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(component_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(componentdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(componentdir)/$$p"; \ + done + +clean-componentLTLIBRARIES: + -test -z "$(component_LTLIBRARIES)" || rm -f $(component_LTLIBRARIES) + @list='$(component_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libevolution-feeds.la: $(libevolution_feeds_la_OBJECTS) $(libevolution_feeds_la_DEPENDENCIES) + $(LINK) -rpath $(componentdir) $(libevolution_feeds_la_LDFLAGS) $(libevolution_feeds_la_OBJECTS) $(libevolution_feeds_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + + AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/ef-feedlist Plo am__quote@ + AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/ef-popup Plo am__quote@ + AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/feed-type-rss Plo am__quote@ + AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/feeds-blog-fetcher Plo am__quote@ + AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/feeds-component-factory Plo am__quote@ + AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/feeds-component Plo am__quote@ + AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/feeds-marshal Plo am__quote@ + AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/feeds-rss-fetcher Plo am__quote@ + AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/feeds-utils Plo am__quote@ + AMDEP_TRUE@@am__include@ @am__quote /$(DEPDIR)/feeds-view Plo am__quote@ + +.c.o: + am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ + am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi + AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ + AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: + am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ + am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi + AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ + AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: + am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ + am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi + AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ + AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: +install-gladeDATA: $(glade_DATA) + @$(NORMAL_INSTALL) + test -z "$(gladedir)" || $(mkdir_p) "$(DESTDIR)$(gladedir)" + @list='$(glade_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(gladeDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(gladedir)/$$f'"; \ + $(gladeDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(gladedir)/$$f"; \ + done + +uninstall-gladeDATA: + @$(NORMAL_UNINSTALL) + @list='$(glade_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(gladedir)/$$f'"; \ + rm -f "$(DESTDIR)$(gladedir)/$$f"; \ + done +install-iconDATA: $(icon_DATA) + @$(NORMAL_INSTALL) + test -z "$(icondir)" || $(mkdir_p) "$(DESTDIR)$(icondir)" + @list='$(icon_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(iconDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(icondir)/$$f'"; \ + $(iconDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(icondir)/$$f"; \ + done + +uninstall-iconDATA: + @$(NORMAL_UNINSTALL) + @list='$(icon_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(icondir)/$$f'"; \ + rm -f "$(DESTDIR)$(icondir)/$$f"; \ + done +install-serverDATA: $(server_DATA) + @$(NORMAL_INSTALL) + test -z "$(serverdir)" || $(mkdir_p) "$(DESTDIR)$(serverdir)" + @list='$(server_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(serverDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(serverdir)/$$f'"; \ + $(serverDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(serverdir)/$$f"; \ + done + +uninstall-serverDATA: + @$(NORMAL_UNINSTALL) + @list='$(server_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(serverdir)/$$f'"; \ + rm -f "$(DESTDIR)$(serverdir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(componentdir)" "$(DESTDIR)$(gladedir)" "$(DESTDIR)$(icondir)" "$(DESTDIR)$(serverdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-componentLTLIBRARIES clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-componentLTLIBRARIES install-gladeDATA \ + install-iconDATA install-serverDATA + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-componentLTLIBRARIES uninstall-gladeDATA \ + uninstall-iconDATA uninstall-info-am uninstall-serverDATA + +.PHONY: CTAGS GTAGS all all-am check check-am clean \ + clean-componentLTLIBRARIES clean-generic clean-libtool ctags \ + dist-hook distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am \ + install-componentLTLIBRARIES install-data install-data-am \ + install-exec install-exec-am install-gladeDATA \ + install-iconDATA install-info install-info-am install-man \ + install-serverDATA install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-componentLTLIBRARIES \ + uninstall-gladeDATA uninstall-iconDATA uninstall-info-am \ + uninstall-serverDATA + + +feeds-marshal.h: feeds-marshal.list + ( @GLIB_GENMARSHAL@ --prefix=feeds_marshal feeds-marshal.list --header > feeds-marshal.h.tmp \ + && mv feeds-marshal.h.tmp feeds-marshal.h ) \ + || ( rm -f feeds-marshal.h.tmp && exit 1 ) + +feeds-marshal.c: feeds-marshal.h + ( (echo '#include "feeds-marshal.h"'; @GLIB_GENMARSHAL@ --prefix=feeds_marshal feeds-marshal.list --body) > feeds-marshal.c.tmp \ + && mv feeds-marshal.c.tmp feeds-marshal.c ) \ + || ( rm -f feeds-marshal.c.tmp && exit 1 ) + EVO_MARSHAL_RULE@ + +%.server.in: %.server.in.in + rm -f $@ + sed -e "s/@API_VERSION@/$(BASE_VERSION)/" \ + -e "s:@COMPONENTDIR@:$(componentdir):" \ + -e "s:@ICONDIR@:$(icondir):" \ + $^ > $@ + + INTLTOOL_SERVER_RULE@ +#IDL_GENERATED = \ +# Evolution-Addressbook-SelectNames.h \ +# Evolution-Addressbook-SelectNames-common.c \ +# Evolution-Addressbook-SelectNames-skels.c \ +# Evolution-Addressbook-SelectNames-stubs.c + +$(IDL_GENERATED): $(IDLS) + $(ORBIT_IDL) $(EVOLUTION_IDL_INCLUDES) \ + $(EVOLUTION_idldir) + +dist-hook: + cd $(distdir); rm -f $(NODIST_FILES) +# 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 -Npru evolution-cvs/feeds/TODO evolution/feeds/TODO --- evolution-cvs/feeds/TODO 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/TODO 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,85 @@ +TODO and BUGS: + + +TOOLBAR ISSUES +-------------- +Implement "Edit" +Implement "Cut" +Implement "Copy" +Implement "Paste" +Implement "Stop" +Implement "Print" +Make toolbar and menu sensitivity appropriate to source selection + +SOURCE LIST ISSUES +------------------ +Editable source list folders +Allow naming of blogs in source selector instead of "url:http://...." +Allow group selection +Allow multiple feed selections +Implement Right Click on Selection Source Popup for... + associate with contact + edit + delete + cut + copy + paste + New group + Delete a group + Edit a group + + +VIEW ISSUES +----------- +Add a search bar in the view_control +implement a 2 vs 3 pane views option + +MENU ISSUES +----------- +Menu option for how to view the feeds. (2 vs 3 pane) +Menu option for reading based on chronology instead of by feed (LJ style) + +OTHER ISSUES +------------ +* Better feed finding for links in pages to the actual feed data +* Implement "Associate Feed with Contact" +* Associate blog field in contacts with the feeder +* Add other Feed support besides RSS (Atom, etc) +* Seperate GUI/Component from source list, stored read information +* Store Read/Unread on view data +* Move GUI related objects into ./gui/ +* Move Backend related objects into ./backend/ +* If a user has no email but has a web log stored in the address book, they aren't showing up in "Add Feed"->"Add Contact" option. +* Until I figure out a better way to do this, the blog urls won't be linked with the person in the addressbook, I just read the blog field and then store it along with the other URLs. The problem here is that this causes trouble if the contact's blog url changes this should change in the feed reader too. This seems to be because contacts don't have any type of unique identifier in eds?! Is this for real?! +* If different blog entries are selected in rapid succussion, sometimes a slower to respond site may display last even if another blog is currently selected. +* Hitting OK in the "Add Feed" dialog when no source or contact was selected adds an empty entry into the source list +* http://rss.slashdot.org/Slashdot/slashdot "Data is XML, but not RSS" +* Arrow keys don't work in source list +* view's e-info-label feed icon isn't displaying + +Fixed 2006.04.21 - Feed count doesn't update when feeds are added +Fixed 2006.04.21 - New Feed popup action doesn't work when no source_list item is selected +Fixed 2006.04.20 - If numlock is on "DEL" hotkey doesn't delete from source list +Fixed 2006.04.16 - Feed count doesn't update when feeds are deleted +Fixed 2006.04.15 - Popup menu icon for "New Feed" isn't displaying +Fixed 2006.03.20 - Can't add multiple contacts all at the same time +Fixed 2006.03.20 - If a contact with no blog entry field is added, it crashes evo +Fixed 2006.03.05 - Hitting cancel in the "Add Feed" dialog crashes evo +Fixed 2006.03.06 - Hitting OK in the "Add Feed" dialog when no source or contact was selected crashes evo +Fixed - Use a Better Icon that represents a feed instead of a "wave" +Fixed - New URL detection +Fixed - e-info-label added (the label at the top of the sidebar) +Fixed - new "New" interface with source selection. +Fixed - Change all the name references from Brainread to Feeds. +Fixed - Change all the name references from Blogs to Feeds. +Fixed - Update the glade layout +Fixed - Make rss support a bit more lenient +Fixed - Implement "Delete Feed" with delete key +Fixed - Create Toolbar icon for "Delete" +Fixed - Create Toolbar icon for "Edit" +Fixed - Create Toolbar icon for "Cut" +Fixed - Create Toolbar icon for "Copy" +Fixed - Create Toolbar icon for "Paste" +Fixed - Create Toolbar icon for "Stop" +Fixed - Create toolbar icon for "Print" +Fixed - Feed count in E_INFO_LABEL diff -Npru evolution-cvs/feeds/ef-feedlist.c evolution/feeds/ef-feedlist.c --- evolution-cvs/feeds/ef-feedlist.c 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/ef-feedlist.c 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,404 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * Copyright (C) 2004, 2005, 2006 Novell, Inc. + * + * Some code used from liferea is copyrighted as follows: + * Copyright (C) 2004-2005 Nathan J. Conrad <t98502 users sourceforge net> + * Copyright (C) 2004-2005 Lars Lindner <lars lindner gmx net> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public 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 "ef-feedlist.h" +#include "feeds-utils.h" +#include "feeds-view.h" + +#include <bonobo/bonobo-exception.h> +#include <bonobo/bonobo-widget.h> +#include <glade/glade-xml.h> +#include <gtk/gtkbox.h> +#include <gtk/gtkdialog.h> +#include <libgnome/gnome-i18n.h> +#include <shell/Evolution.h> +#include <libedataserverui/e-name-selector.h> +#include <libedataserverui/e-destination-store.h> + +enum { + FEED_TYPE_CONTACT, + FEED_TYPE_URL, + FEED_TYPE_COMMAND, + FEED_TYPE_FILE +}; + +typedef struct { + ESourceGroup *source_group; + ENameSelector *name_selector; + + GtkDialog *dialog; + GtkEntry *source_entry; + + int feed_type; +// gchar *source; + + FeedsView *view; // Used to update the view after changes +} FeedsFeedSourceData; + +static void addressbook_clicked (GtkWidget *widget, gpointer data); +static void addressbook_dialog_response (ENameSelectorDialog *name_selector_dialog, gint response, gpointer user_data); +static void get_dests_source_entry (GList *destination, gpointer user_data); +static void feeds_source_new_dialog_response (GtkDialog *dialog, int response_id, gpointer data); + +ESourceList * +//ESourceGroup * +ef_feedlist_new (void) +{ +/* This is test data for a different data structure type and for using a standard + * OPML file to store the feed data in. I'm keeping it around for now, while I'm + * working on this functionality + */ +/* + gchar *filename; + //ESourceList *source_list = e_source_list_new(); + ESourceGroup *source_list = e_source_group_new("cow","cow"); + + filename = g_strdup_printf("%s" G_DIR_SEPARATOR_S ".evolution" G_DIR_SEPARATOR_S "feeds" G_DIR_SEPARATOR_S "feedlist.opml", g_get_home_dir()); + if(!g_file_test(filename, G_FILE_TEST_EXISTS)) { + // if there is no feedlist.opml we provide a default feed list + g_free(filename); + + // "feedlist.opml" is translatable so that translators can provide a localized default feed list + //TODO: Create a FEED_DATA_DIR const in Makefile + //filename = g_strdup_printf( FEEDS_DATAT_DIR G_DIR_SEPARATOR_S PACKAGE G_DIR_SEPARATOR_S "feeds" G_DIR_SEPARATOR_S "%s", _("feedlist.opml")); + filename = g_strdup_printf( G_DIR_SEPARATOR_S PACKAGE G_DIR_SEPARATOR_S "feeds" G_DIR_SEPARATOR_S "%s", _("feedlist.opml")); + } + import_OPML_feedlist(filename, source_list, NULL, FALSE, TRUE); + g_free(filename); + + fprintf(stderr,"done import_OPML_feedlist\n"); + return NULL; +*/ + + ESourceGroup *group; + ESourceList *source_list; + + //FIXME: This is not the place where we should be storing our sources + // This is being updated to use an opml file from .evolution/ instead + source_list = e_source_list_new_for_gconf_default ("/apps/evolution/feeds/sources"); + + if (!e_source_list_peek_groups (source_list)) { + // If we don't have any groups, then create a default group + group = e_source_group_new (_("Example Feeds"), + "feeds://Example Feeds/"); + e_source_list_add_group (source_list, group, 0); + e_source_list_sync (source_list, NULL); + } + + + return source_list; + +} + +static void +feeds_source_new_dialog_response (GtkDialog *dialog, int response_id, gpointer data) +{ + fprintf(stderr,"newdialog_response\n"); + FeedsFeedSourceData *fsd = data; + ESourceGroup *source_group; + ESource *new_source; + char *dests; + char *source_uri; + xmlChar *book_uri = NULL; + GtkEntry *source_entry; + fprintf(stderr,"variables declared.\n"); + + + if (response_id == GTK_RESPONSE_OK) { + /* + TODO: Set type by which "feed_loc_contact" radiobutton + is selected. + TODO: Check to see if source was... + Contact (Contacts are handled by address_book callback) + URL + Command + or Local File + */ + + /* For right now, we're grabbing the blog url from the address book + and then using it as if it were a pure URL. This functionality may + change in the not too distant future so we can more accurately + determine if a feed source is associated with a contact or not + */ + + /* + fsd->source_type = dialog + if (fsd->source_type == SOURCE_TYPE_CONTACT) { + ENameSelectorModel *ens_model; + ens_model = e_name_selector_peek_model (fsd->name_selector); + + source_entry = e_name_selector_model_peek_section (ens_model, + "Add User", "Add User", destination_store); + destinations = e_destination_store_list_destinations (destination_store); + + if (destinations) + fprintf (stderr, "So the f'ing destination is not NULL"); + // Get the XML data describing the selected user + //bah you need to read the widget here apparently + //bonobo_widget_get_property (fsd->entry, "destinations", + // TC_CORBA_string, &dests, + // NULL); + //name_selector_entry = e_name_selector_peek_section_entry (fsd->name_selector, "Add User"); + } else if (adb->source_type == SOURCE_TYPE_URL) { + source_entry = fsd->source_entry; + } else if (adb->source_type == SOURCE_TYPE_COMMAND) { + } else if (adb->source_type == SOURCE_TYPE_FILE) { + } else { + //ERROR MSG + } +*/ + /*fprintf(stderr,"finding source entry...\n");*/ + source_entry = fsd->source_entry; + if (!source_entry) { + /*fprintf(stderr,"No source entry!\n");*/ + return; + } + if (strlen (gtk_entry_get_text (source_entry)) == 0) { + /*fprintf(stderr,"No source entry!\n");*/ + return; + } + dests = g_strconcat("url:",gtk_entry_get_text (source_entry),NULL); + /*fprintf(stderr,"dests:%s\n",dests);*/ + } else { + gtk_widget_destroy (GTK_WIDGET (dialog)); + g_free (fsd); + return; + } + + /*fprintf(stderr,"response recieved.\n");*/ + + gtk_widget_destroy (GTK_WIDGET (dialog)); + source_group = fsd->source_group; + FeedsView *view = fsd->view; + g_free (fsd); + + if (!dests) { + g_object_unref (source_group); + return; + } + + source_uri = g_strdup (dests); + /*fprintf(stderr,"source_uri:%s\n", source_uri);*/ + new_source = e_source_new (source_uri, source_uri); + e_source_group_add_source (source_group, new_source, -1); + feeds_view_update_e_info_label(view); + g_object_unref (new_source); + g_free(dests); + g_free (source_uri); + g_object_unref (source_group); +} +static void +addressbook_dialog_response (ENameSelectorDialog *name_selector_dialog, gint response, gpointer user_data) +{ + /* Get the data from the addressbook dialog + * and fill the data into the "source" entry + */ + fprintf(stderr,"Addressbook Dialog Response\n"); + + FeedsFeedSourceData *fsd = user_data; + ENameSelectorModel *ens_model; + EDestinationStore *destination_store; + GList *destinations; + const gchar *name = "Add User"; + gchar *pretty_name; + gboolean found; + GtkEntry *source_entry; + ESourceGroup *source_group; + ESource *new_source; + char *source_uri; + + gtk_widget_hide (GTK_WIDGET (name_selector_dialog)); + ens_model = e_name_selector_peek_model (fsd->name_selector); + + found = e_name_selector_model_peek_section (ens_model, + name, &pretty_name, &destination_store); + + if (found) + destinations = e_destination_store_list_destinations (destination_store); + else + fprintf(stderr,"Did not find the model section.\n"); + + if (destinations != NULL) { + fprintf(stderr,"%d:destinations\n", e_destination_store_get_destination_count (destination_store)); + g_list_foreach(destinations, (GFunc)get_dests_source_entry, fsd); + } + + /* Update our view */ + FeedsView *view = fsd->view; + feeds_view_update_e_info_label(view); +} + +static void +addressbook_clicked (GtkWidget *widget, gpointer data) +{ + /* Popup a dialog for the user to select what contact to add to their + * list of feeds */ + FeedsFeedSourceData *fsd = data; + ENameSelectorDialog *name_selector_dialog; + name_selector_dialog = e_name_selector_peek_dialog (fsd->name_selector); + + g_signal_connect (name_selector_dialog, "response", G_CALLBACK (addressbook_dialog_response), fsd); + + name_selector_dialog = e_name_selector_peek_dialog (fsd->name_selector); + gtk_widget_show (GTK_WIDGET (name_selector_dialog)); +} + +static void +get_dests_source_entry (GList *destination, gpointer user_data) +{ + FeedsFeedSourceData *fsd = user_data; + GtkEntry *source_entry; + ESourceGroup *source_group; + ESource *new_source; + char *source_uri; + gchar *dests; + gchar *contacts_blog; + EContact *contact; + + fsd = user_data; + source_entry = fsd->source_entry; + contact = e_destination_get_contact(destination); + + contacts_blog = e_contact_get(contact, E_CONTACT_BLOG_URL); + /* + //gchar *contact_uid; + //gchar *contact_ebook_uri; + //contact_uid = e_contact_get(contact, E_CONTACT_UID); + //contact_ebook_uri = e_contact_get(contact, E_CONTACT_BOOK_URI); + // ebook_uri and contact_uid don't seem to be working. + // I'm not sure they are implemented at all. + // I would expect that each Econtact would have a Unique ID to + // directly access it. However, this just doesn't seem to be + // the case. Why not?! I have no idea, seems like it would be a lot + // easier to deal with that way. Maybe the EDS peeps can shed some + // light on why I have to pass EContact pointers or EDestinations + // around instead of being able to just store a unique ID. I'm + // just complaining, because I'll have to store this shit in xml + // and there doesn't appear to be an Econtact to xml function or + // anything. Maybe I'm suppose to use VCards? Any suggestions would + // be helpful. + // TODO: Until I figure out a better way to do this, the blog urls + // won't be linked with the person in the addressbook, I just read the + // blog field and then store it along with the other URLs. The problem + // here is that this causes trouble if the contact's blog url changes + // this should change in the feed reader too. A bad hack to semi link + // a stored URL with a user is lets say, if you try to edit a blog URL + // and then we search or contacts for that URL, and if we find a match + // then we can update the Contact or notify them that that URL is + // associated with a contact. It might even be good to just store + // that this is associated with a contact along with the URL in the xml + // and then we wont even have to look it up. + //dests = g_strconcat(gtk_entry_get_text (source_entry), contact_ebook_uri, "#", contact_uid, NULL); + */ + if (!contacts_blog) + dests = NULL; + else + dests = g_strconcat(gtk_entry_get_text (source_entry), "url", ":", contacts_blog, NULL); + + + source_group = fsd->source_group; + gtk_widget_hide (GTK_WIDGET (fsd->dialog)); + /* We don't want to destroy the dialog if we have multiple people to add + // we should destroy this in the callback that gets this data. + // TODO: I think I've done, this. Verify so I'm not leaking memory + //gtk_widget_destroy (GTK_WIDGET (fsd->dialog)); + //g_free (fsd); + */ + + if (!dests) { + g_object_unref (source_group); + return; + } + fprintf(stderr,"dests:%s\n",dests); + source_uri = g_strdup (dests); + fprintf(stderr,"source_uri:%s\n", source_uri); + new_source = e_source_new (source_uri, source_uri); + e_source_group_add_source (source_group, new_source, -1); + +} + +void +ef_feedlist_source_add (GtkWindow *window, ESourceGroup *source_group, FeedsView *view) +{ + fprintf(stderr,"feeds_source_add"); + FeedsFeedSourceData *fsd; + ENameSelectorModel *name_selector_model; + GtkWidget *source_entry; + GtkWidget *dialog; + GtkWidget *hbox, *button; + GladeXML *glade; + + glade = glade_xml_new (FEEDS_GLADEDIR "/feeds.glade", + "newdialog", GETTEXT_PACKAGE); + + dialog = glade_xml_get_widget (glade, "newdialog"); + hbox = glade_xml_get_widget (glade, "hbox92232"); + button = glade_xml_get_widget (glade, "selectSourceContactButton"); + source_entry = glade_xml_get_widget(glade, "sourceEntry"); + + g_object_unref (glade); + + fsd = g_new0 (FeedsFeedSourceData, 1); + fsd->source_group = g_object_ref (source_group); + fsd->source_entry = g_object_ref (source_entry); + fsd->name_selector = e_name_selector_new (); + fsd->dialog = g_object_ref (dialog); + fsd->view = g_object_ref (view); + + /* (We ref the source_group since otherwise it could [at least + * theoretically] be destroyed before the callback was called. + */ + name_selector_model = e_name_selector_peek_model (fsd->name_selector); + e_name_selector_model_add_section (name_selector_model, "Add User", "Add User", NULL); + + if (GTK_IS_WINDOW (window)) { + /* Tell the window manager that the new dialog is + * associated with the given window. + */ + gtk_window_set_transient_for (GTK_WINDOW (dialog), window); + } + + + /* Connect to the "Addressbook" button */ + g_signal_connect (button, "clicked", + G_CALLBACK (addressbook_clicked), fsd); + + /* Connect to the Dialog's response buttons */ + g_signal_connect (dialog, "response", + G_CALLBACK (feeds_source_new_dialog_response), fsd); + + /* And run */ + gtk_widget_show (dialog); + gtk_widget_grab_focus ((GtkWidget *) source_entry); +} + + +void +ef_feedlist_source_edit (GtkWindow *window, ESourceGroup *source_group) +{ +} + diff -Npru evolution-cvs/feeds/ef-feedlist.h evolution/feeds/ef-feedlist.h --- evolution-cvs/feeds/ef-feedlist.h 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/ef-feedlist.h 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,30 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* Copyright (C) 2004 Novell, Inc. */ + +#ifndef __EF_FEEDLIST_H__ +#define __EF_FEEDLIST_H__ + +#include <gtk/gtkwindow.h> +#include <libedataserver/e-source-list.h> +#include <libedataserver/e-source-group.h> +#include "feeds-view.h" + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +ESourceList *ef_feedlist_new (void); +//ESourceGroup *ef_feedlist_new (void); + +void ef_feedlist_source_add (GtkWindow *window, + ESourceGroup *source_group, + FeedsView *view); +void ef_feedlist_source_edit (GtkWindow *window, + ESourceGroup *source_group); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __EF_FEEDLIST_H__ */ diff -Npru evolution-cvs/feeds/ef-popup.c evolution/feeds/ef-popup.c --- evolution-cvs/feeds/ef-popup.c 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/ef-popup.c 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,288 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Authors: Michael Zucchi <notzed ximian com> + * Authors: Andrew Case <case andrew gmail com> + * + * Copyright 2004 Ximian, Inc. (www.ximian.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string.h> +#include <stdlib.h> +#include <glib.h> +#include "ef-popup.h" +#include "libedataserver/e-msgport.h" +#include <e-util/e-icon-factory.h> +#include <e-util/e-util.h> +#include <libedataserverui/e-source-selector.h> +#include <libedataserver/e-source.h> + +static void efp_standard_menu_factory(EPopup *efp, void *data); + +static GObjectClass *efp_parent; + +static void +efp_init(GObject *o) +{ + EFPopup *efp = (EFPopup *)o; +} + +static void +efp_finalise(GObject *o) +{ + ((GObjectClass *)efp_parent)->finalize(o); +} + +static void +efp_target_free(EPopup *ep, EPopupTarget *t) +{ + switch (t->type) { + case EF_POPUP_TARGET_SELECT: { + EFPopupTargetSelect *s = (EFPopupTargetSelect *)t; + g_ptr_array_free(s->urls, TRUE); + break; } + case EF_POPUP_TARGET_SOURCE: { + EFPopupTargetSource *s = (EFPopupTargetSource *)t; + g_object_unref(s->selector); + break; } + } + ((EPopupClass *)efp_parent)->target_free(ep, t); +} + +static void +efp_class_init(GObjectClass *klass) +{ + klass->finalize = efp_finalise; + ((EPopupClass *)klass)->target_free = efp_target_free; + e_popup_class_add_factory((EPopupClass *)klass, NULL, efp_standard_menu_factory, NULL); +} + +GType +ef_popup_get_type(void) +{ + static GType type = 0; + + if (type == 0) { + static const GTypeInfo info = { + sizeof(EFPopupClass), + NULL, NULL, + (GClassInitFunc)efp_class_init, + NULL, NULL, + sizeof(EFPopup), 0, + (GInstanceInitFunc)efp_init + }; + efp_parent = g_type_class_ref(e_popup_get_type()); + type = g_type_register_static(e_popup_get_type(), "EFPopup", &info, 0); + } + + return type; +} + +EFPopup *ef_popup_new(const char *menuid) +{ + EFPopup *efp = g_object_new(ef_popup_get_type(), 0); + e_popup_construct(&efp->popup, menuid); + return efp; +} + +/** + * ef_popup_target_new_select: + * @uris: The selection will free this when done with it. + * + * Create a new selection popup target. + * + * Return value: + **/ +EFPopupTargetSelect * +ef_popup_target_new_select(EFPopup *efp, /*TODO:Anything else to pass? ,*/ GPtrArray *urls) +{ + EFPopupTargetSelect *t = e_popup_target_new(&efp->popup, EF_POPUP_TARGET_SELECT, sizeof(*t)); + guint32 mask = ~0; + const char *tmp; + + t->urls = urls; + t->target.mask = mask; + + return t; +} + +/* ********************************************************************** */ + +static void +efp_apps_popup_free(EPopup *ep, GSList *free_list, void *data) +{ + while (free_list) { + GSList *n = free_list->next; + EPopupItem *item = free_list->data; + + g_free(item->path); + g_free(item->label); + g_free(item); + g_slist_free_1(free_list); + + free_list = n; + } +} + +static void +efp_standard_items_free(EPopup *ep, GSList *items, void *data) +{ + g_slist_free(items); +} + +static void +efp_standard_menu_factory(EPopup *efp, void *data) +{ + int i, len; + EPopupItem *items; + GSList *menus = NULL; + GList *apps = NULL; + char *mime_type = NULL; + const char *filename = NULL; + + switch (efp->target->type) { + default: + items = NULL; + len = 0; + } + for (i=0;i<len;i++) { + if ((items[i].visible & efp->target->mask) == 0) + menus = g_slist_prepend(menus, &items[i]); + } + + if (menus) + e_popup_add_items(efp, menus, NULL, efp_standard_items_free, NULL); +} + +/* ********************************************************************** */ + +/* Popup menu plugin handler */ + +/* +<e-plugin + class="org.gnome.mail.plugin.popup:1.0" + id="org.gnome.mail.plugin.popup.item:1.0" + type="shlib" + location="/opt/gnome2/lib/camel/1.0/libcamelimap.so" + name="imap" + description="IMAP4 and IMAP4v1 mail store"> + <hook class="org.gnome.mail.popupMenu:1.0" + handler="HandlePopup"> + <menu id="any" target="select"> + <item + type="item|toggle|radio|image|submenu|bar" + active + path="foo/bar" + label="label" + icon="foo" + mask="select_one" + activate="efp_view_emacs"/> + </menu> + </extension> + +*/ + +static void *efph_parent_class; +#define efph ((EFPopupHook *)eph) + +static const EPopupHookTargetMask efph_select_masks[] = { + { "one", EF_POPUP_SELECT_ONE }, + { "many", EF_POPUP_SELECT_MANY }, + { "mark_read", EF_POPUP_SELECT_MARK_READ }, + { "mark_unread", EF_POPUP_SELECT_MARK_UNREAD }, + { 0 } +}; + +static const EPopupHookTargetMask efph_source_masks[] = { + { "primary", EF_POPUP_SOURCE_PRIMARY }, + { "system", EF_POPUP_SOURCE_SYSTEM }, + { 0 } +}; + +static const EPopupHookTargetMap efph_targets[] = { + { "select", EF_POPUP_TARGET_SELECT, efph_select_masks }, + { "source", EF_POPUP_TARGET_SOURCE, efph_source_masks }, + { 0 } +}; + +static void +efph_finalise(GObject *o) +{ + /*EPluginHook *eph = (EPluginHook *)o;*/ + + ((GObjectClass *)efph_parent_class)->finalize(o); +} + +static void +efph_class_init(EPluginHookClass *klass) +{ + int i; + + ((GObjectClass *)klass)->finalize = efph_finalise; + ((EPluginHookClass *)klass)->id = "org.gnome.evolution.mail.popup:1.0"; + + for (i=0;efph_targets[i].type;i++) + e_popup_hook_class_add_target_map((EPopupHookClass *)klass, &efph_targets[i]); + + ((EPopupHookClass *)klass)->popup_class = g_type_class_ref(ef_popup_get_type()); +} + +GType +ef_popup_hook_get_type(void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof(EFPopupHookClass), NULL, NULL, + (GClassInitFunc) efph_class_init, NULL, NULL, + sizeof(EFPopupHook), 0, (GInstanceInitFunc) NULL, + }; + + efph_parent_class = g_type_class_ref(e_popup_hook_get_type()); + type = g_type_register_static(e_popup_hook_get_type(), "EFPopupHook", &info, 0); + } + + return type; +} + +EFPopupTargetSource *ef_popup_target_new_source(EFPopup *efp, struct _ESourceSelector *selector) +{ + EFPopupTargetSource *t = e_popup_target_new(&efp->popup, EF_POPUP_TARGET_SOURCE, sizeof(*t)); + guint32 mask = ~0; + const char *source_uri; + ESource *source; + + t->selector = selector; + g_object_ref(selector); + + source = e_source_selector_peek_primary_selection(selector); + if (source) + mask &= ~EF_POPUP_SOURCE_PRIMARY; + + source_uri = e_source_peek_relative_uri(source); + + source = e_source_selector_peek_primary_selection (selector); + + t->target.mask = mask; + return t; + +} diff -Npru evolution-cvs/feeds/ef-popup.h evolution/feeds/ef-popup.h --- evolution-cvs/feeds/ef-popup.h 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/ef-popup.h 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,167 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * + * Authors: Michel Zucchi <notzed ximian com> + * + * Copyright 2003 Ximian, Inc. (www.ximian.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef __EF_POPUP_H__ +#define __EF_POPUP_H__ + +#include <glib-object.h> + +#include "e-util/e-popup.h" + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +typedef struct _EFPopup EFPopup; +typedef struct _EPopupItem EFPopupItem; +typedef struct _EFPopupClass EFPopupClass; +typedef struct _EFPopupTargetSelect EFPopupTargetSelect; +typedef struct _EFPopupTargetSource EFPopupTargetSource; + +struct _FeedView; + +/** + * enum _ef_popup_target_t - A list of mail popup target types. + * + * @EF_POPUP_TARGET_SELECT: A selection of feed items. + * @EF_POPUP_TARGET_SOURCE: A source selection + * + * Defines the value of the targetid for all EFPopup target types. + **/ +enum _ef_popup_target_t { + EF_POPUP_TARGET_SELECT, + EF_POPUP_TARGET_SOURCE +}; + +/** + * enum _ef_popup_target_select_t - EFPopupTargetSelect qualifiers. + * + * @EF_POPUP_SELECT_ONE: Only one item is selected. + * @EF_POPUP_SELECT_MANY: One ore more items are selected. + * @EF_POPUP_SELECT_MARK_READ: Message(s) are unseen and can be + * marked seen. + * @EF_POPUP_SELECT_MARK_UNREAD: Message(s) are seen and can be + * marked unseen. + * @EF_POPUP_SELECT_DELETE: Message(s) are undeleted and can + * be marked deleted. + * @EF_POPUP_SELECT_UNDELETE: Message(s) are deleted and can be + * undeleted. + * @EF_POPUP_SELECT_EDIT: The message can be opened for editing (the + * folder is a sent folder). + * @EF_POPUP_SELECT_MARK_IMPORTANT: Message(s) are not marked + * important. + * @EF_POPUP_SELECT_MARK_UNIMPORTANT: Message(s) are marked + * important. + * @EF_POPUP_SELECT_ADD_SENDER: The message contains sender addresses + * which might be added to the addressbook. i.e. it isn't a message in + * the Sent or Drafts folders. + * + **/ +enum _ef_popup_target_select_t { + EF_POPUP_SELECT_ONE = 1<<1, + EF_POPUP_SELECT_MANY = 1<<2, + EF_POPUP_SELECT_MARK_READ = 1<<3, + EF_POPUP_SELECT_MARK_UNREAD = 1<<4, +// EF_POPUP_SELECT_DELETE = 1<<5, +// EF_POPUP_SELECT_UNDELETE = 1<<6, +// EF_POPUP_SELECT_EDIT = 1<<8, +// EF_POPUP_SELECT_MARK_IMPORTANT = 1<<9, +// EF_POPUP_SELECT_MARK_UNIMPORTANT = 1<<10, +// EF_POPUP_SELECT_ADD_SENDER = 1<<14, +}; + +/** + * enum _e_cal_popup_target_source_t - ECalPopupTargetSource qualifiers. + * + * @EF_POPUP_SOURCE_PRIMARY: Has a primary selection. + * @EF_POPUP_SOURCE_SYSTEM: Is a 'system' folder. + * + **/ +enum _e_cal_popup_target_source_t { + EF_POPUP_SOURCE_PRIMARY = 1<<0, + EF_POPUP_SOURCE_SYSTEM = 1<<1, /* system folder (can't delete these? what?) */ +}; + + + +/** + * struct _EFPopupTargetSelect - A list of messages. + * + * @target: Superclass. + * @folder: The CamelFolder of the selected messages. + * @uri: The encoded URI represending this folder. + * @uids: An array of UID strings of messages within @folder. + * + * Used to represent a selection of messages as context for a popup + * menu. All items may be NULL if the current view has no active + * folder selected. + **/ +struct _EFPopupTargetSelect { + EPopupTarget target; + GPtrArray *urls; +}; + +struct _EFPopupTargetSource { + EPopupTarget target; + struct _ESourceSelector *selector; +}; + + +/* The object */ +struct _EFPopup { + EPopup popup; + + struct _EFPopupPrivate *priv; +}; + +struct _EFPopupClass { + EPopupClass popup_class; +}; + +GType ef_popup_get_type(void); + +EFPopup *ef_popup_new(const char *menuid); + +EFPopupTargetSelect *ef_popup_target_new_select(EFPopup *efp, GPtrArray *urls); +EFPopupTargetSource *ef_popup_target_new_source(EFPopup *efp, struct _ESourceSelector *selector); + +/* ********************************************************************** */ + +typedef struct _EFPopupHook EFPopupHook; +typedef struct _EFPopupHookClass EFPopupHookClass; + +struct _EFPopupHook { + EPopupHook hook; +}; + +struct _EFPopupHookClass { + EPopupHookClass hook_class; +}; + +GType ef_popup_hook_get_type(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __EF_POPUP_H__ */ diff -Npru evolution-cvs/feeds/ef-print.c evolution/feeds/ef-print.c --- evolution-cvs/feeds/ef-print.c 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/ef-print.c 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,264 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Authors: Jeffrey Stedfast <fejj ximian com> + * + * Copyright 2004 Ximian, Inc. (www.ximian.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string.h> + +#include <libgnomeprint/gnome-print-job.h> +#include <libgnomeprintui/gnome-print-job-preview.h> + +#include <gtkhtml/gtkhtml.h> +#include <gtk/gtkwindow.h> + +#include <camel/camel-i18n.h> +#include "mail-ops.h" +#include "mail-mt.h" +#include "em-format-html-print.h" + +static void efhp_builtin_init(EMFormatHTMLPrintClass *efhc); + +static EMFormatHTMLClass *efhp_parent; + +static void +efhp_init(GObject *o) +{ + EMFormatHTMLPrint *efhp = (EMFormatHTMLPrint *)o; + GtkWidget *html = (GtkWidget *)efhp->formathtml.html; + + /* ?? */ + gtk_widget_set_name(html, "EvolutionMailPrintHTMLWidget"); + + /* gtk widgets don't like to be realized outside top level widget + so we put new html widget into gtk window */ + efhp->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_container_add((GtkContainer *)efhp->window, html); + gtk_widget_realize(html); + efhp->formathtml.show_rupert = FALSE; +} + +static void +efhp_finalise(GObject *o) +{ + EMFormatHTMLPrint *efhp = (EMFormatHTMLPrint *)o; + + gtk_widget_destroy(efhp->window); + if (efhp->config) + g_object_unref(efhp->config); + if (efhp->source) + g_object_unref(efhp->source); + + ((GObjectClass *)efhp_parent)->finalize(o); +} + +static void +efhp_base_init(EMFormatHTMLPrintClass *efhpklass) +{ + efhp_builtin_init(efhpklass); +} + +static void +efhp_class_init(GObjectClass *klass) +{ + klass->finalize = efhp_finalise; +} + +GType +em_format_html_print_get_type(void) +{ + static GType type = 0; + + if (type == 0) { + static const GTypeInfo info = { + sizeof(EMFormatHTMLPrintClass), + (GBaseInitFunc)efhp_base_init, NULL, + (GClassInitFunc)efhp_class_init, + NULL, NULL, + sizeof(EMFormatHTMLPrint), 0, + (GInstanceInitFunc)efhp_init + }; + efhp_parent = g_type_class_ref(em_format_html_get_type()); + type = g_type_register_static(em_format_html_get_type(), "EMFormatHTMLPrint", &info, 0); + } + + return type; +} + +EMFormatHTMLPrint *em_format_html_print_new(void) +{ + EMFormatHTMLPrint *efhp; + + efhp = g_object_new(em_format_html_print_get_type(), 0); + + return efhp; +} + +struct footer_info { + GnomeFont *local_font; + gint page_num, pages; +}; + +static void +efhp_footer_cb(GtkHTML *html, GnomePrintContext *print_context, double x, double y, double width, double height, void *data) +{ + struct footer_info *info = data; + + /* do we want anything nicer here, like who its from, etc? */ + if (info->local_font) { + char *text = g_strdup_printf (_("Page %d of %d"), info->page_num, info->pages); + /*gdouble tw = gnome_font_get_width_string (info->local_font, text);*/ + /* FIXME: work out how to measure this */ + gdouble tw = strlen(text) * 8; + + gnome_print_gsave(print_context); + gnome_print_newpath(print_context); + gnome_print_setrgbcolor(print_context, .0, .0, .0); + gnome_print_moveto(print_context, x + width - tw, y - gnome_font_get_ascender(info->local_font)); + gnome_print_setfont(print_context, info->local_font); + gnome_print_show(print_context, text); + gnome_print_grestore(print_context); + + g_free(text); + info->page_num++; + } +} + +/* perform preview, or print */ +/* returns GNOME_PRINT_OK on success */ +static void +emfhp_complete(EMFormatHTMLPrint *efhp, void *data) +{ + GnomePrintContext *print_context; + GnomePrintJob *print_job; + gdouble line = 0.0; + struct footer_info info; + int res = GNOME_PRINT_OK; + + print_job = gnome_print_job_new(efhp->config); + print_context = gnome_print_job_get_context(print_job); + + gtk_html_print_set_master(efhp->formathtml.html, print_job); + info.local_font = gnome_font_find_closest("Sans Regular", 10.0); + if (info.local_font) { + line = gnome_font_get_ascender(info.local_font) - gnome_font_get_descender(info.local_font); + info.page_num = 1; + info.pages = gtk_html_print_get_pages_num(efhp->formathtml.html, print_context, 0.0, line); + gtk_html_print_with_header_footer(efhp->formathtml.html, print_context, 0.0, line, NULL, efhp_footer_cb, &info); + gnome_font_unref(info.local_font); + } else { + gtk_html_print(efhp->formathtml.html, print_context); + } + gtk_html_print_set_master(efhp->formathtml.html, NULL); + + gnome_print_job_close(print_job); + + if (efhp->preview) + gtk_widget_show(gnome_print_job_preview_new(print_job, _("Print Preview"))); + else + res = gnome_print_job_print(print_job); + + g_object_unref(print_job); + g_object_unref(efhp); +} + +int em_format_html_print_print(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct _GnomePrintConfig *print_config, int preview) +{ + EMFormat *emfs = (EMFormat *)source; + + efhp->config = print_config; + if (print_config) + g_object_ref(print_config); + efhp->preview = preview; + + ((EMFormatHTML *)efhp)->load_http = source->load_http_now; + + g_signal_connect(efhp, "complete", G_CALLBACK(emfhp_complete), efhp); + + g_object_ref(efhp); + em_format_format_clone((EMFormat *)efhp, emfs->folder, emfs->uid, emfs->message, (EMFormat *)source); + + return 0; /* damn async ... */ +} + +static void +emfhp_got_message(struct _CamelFolder *folder, const char *uid, struct _CamelMimeMessage *msg, void *data) +{ + EMFormatHTMLPrint *efhp = data; + + if (msg) { + if (efhp->source) + ((EMFormatHTML *)efhp)->load_http = efhp->source->load_http_now; + g_signal_connect(efhp, "complete", G_CALLBACK(emfhp_complete), efhp); + em_format_format_clone((EMFormat *)efhp, folder, uid, msg, (EMFormat *)efhp->source); + } else { + g_object_unref(efhp); + } +} + +int em_format_html_print_message(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct _GnomePrintConfig *print_config, struct _CamelFolder *folder, const char *uid, int preview) +{ + efhp->config = print_config; + if (print_config) + g_object_ref(print_config); + efhp->preview = preview; + efhp->source = source; + if (source) + g_object_ref(source); + g_object_ref(efhp); + + mail_get_message(folder, uid, emfhp_got_message, efhp, mail_thread_new); + + return 0; /* damn async ... */ +} + +int em_format_html_print_raw_message(EMFormatHTMLPrint *efhp, struct _GnomePrintConfig *print_config, struct _CamelMimeMessage *msg, int preview) +{ + efhp->config = print_config; + if (print_config) + g_object_ref(print_config); + efhp->source = NULL; + efhp->preview = preview; + g_object_ref(efhp); + + emfhp_got_message(NULL, NULL, msg, efhp); + + return 0; +} + +/* ********************************************************************** */ + +/* if only ... but i doubt this is possible with gnome print/gtkhtml */ +static EMFormatHandler type_builtin_table[] = { + /*{ "application/postscript", (EMFormatFunc)efhp_application_postscript },*/ +}; + +static void +efhp_builtin_init(EMFormatHTMLPrintClass *efhc) +{ + int i; + + for (i=0;i<sizeof(type_builtin_table)/sizeof(type_builtin_table[0]);i++) + em_format_class_add_handler((EMFormatClass *)efhc, &type_builtin_table[i]); +} diff -Npru evolution-cvs/feeds/ef-print.h evolution/feeds/ef-print.h --- evolution-cvs/feeds/ef-print.h 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/ef-print.h 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,41 @@ + +/* + Concrete class for formatting feeds to displayed html for printing +*/ + +#ifndef _EF_FORMAT_HTML_PRINT_H +#define _EF_FORMAT_HTML_PRINT_H + +//TODO:We shouldn't really need this so because our feeds have already been converted to html +#include "mail/em-format-html.h" + +struct _GnomePrintConfig; + +typedef struct _EMFormatHTMLPrint EMFormatHTMLPrint; +typedef struct _EMFormatHTMLPrintClass EMFormatHTMLPrintClass; + +struct _CamelFolder; + +struct _EMFormatHTMLPrint { + EMFormatHTML formathtml; + + struct _GtkWidget *window; /* used to realise the gtkhtml in a toplevel, i dont know why */ + struct _GnomePrintConfig *config; + struct _EMFormatHTML *source; /* used for print_message */ + + guint preview:1; +}; + +struct _EMFormatHTMLPrintClass { + EMFormatHTMLClass formathtml_class; +}; + +GType em_format_html_print_get_type(void); + +EMFormatHTMLPrint *em_format_html_print_new(void); + +int em_format_html_print_print(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct _GnomePrintConfig *print_config, int preview); +int em_format_html_print_message(EMFormatHTMLPrint *efhp, EMFormatHTML *source, struct _GnomePrintConfig *print_config, struct _CamelFolder *folder, const char *uid, int preview); +int em_format_html_print_raw_message(EMFormatHTMLPrint *efhp, struct _GnomePrintConfig *print_config, struct _CamelMimeMessage *msg, int preview); + +#endif /* ! _EF_FORMAT_HTML_PRINT_H */ Files evolution-cvs/feeds/feed-icon.png and evolution/feeds/feed-icon.png differ diff -Npru evolution-cvs/feeds/feed-type-rss.c evolution/feeds/feed-type-rss.c --- evolution-cvs/feeds/feed-type-rss.c 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feed-type-rss.c 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,332 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * Copyright (C) 2004 Novell, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +/* feeds-type-rss.c + * + * Routines to parse RSS data, and create and destroy RSS-related + * data structures. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "feed-type-rss.h" +#include "feeds-utils.h" + +#include <string.h> + +#include <glib.h> +#include <libgnome/gnome-i18n.h> +#include <libxml/parser.h> +#include <libxml/xmlmemory.h> + +static gboolean +string_is_set (char **string, gboolean validate) +{ + /* Make sure *string is set. If it's not, either set it + * or return an error, depending on the value of + * validate. + */ + if (!*string) { + if (validate) + return FALSE; + *string = g_strdup (""); + } + return TRUE; +} + +FeedsRSS * +feeds_rss_new (const char *rss_data, int len, + gboolean validate, GError **err) +{ + xmlDoc *doc; + xmlNode *node, *channel, *inode; + xmlChar *tmp; + FeedsRSS *rss; + FeedsRSSItem *item; + + /* libxml provides two interfaces, the DOM interface, where it + * returns a complete tree all at once, and the SAX interface, + * where you give it a bunch of callback functions and it + * calls them as it parses various parts of the input. We use + * the DOM interface here, since it's much easier to deal + * with, and RSS feeds should never be so huge that we would + * mind having the whole tree in memory at once. + * + * xmlParseMemory does validation and will return NULL if the + * input data is not strictly valid XML. xmlRecoverMemory does + * not. + */ + + if (validate) + doc = xmlParseMemory (rss_data, len); + else + doc = xmlRecoverMemory (rss_data, len); + + if (!doc) { + g_set_error (err, FEEDS_RSS_ERROR, + FEEDS_RSS_ERROR_NOT_RSS, + _("Data is not valid XML")); + return NULL; + } + + node = feeds_xml_find_next (doc, NULL, "rss", FALSE); + + if (!node) { + g_set_error (err, FEEDS_RSS_ERROR, + FEEDS_RSS_ERROR_NOT_RSS, + _("Data is XML, but not RSS")); + return NULL; + } + + /* Find the channel node. */ + channel = feeds_xml_find_next (node, node, "channel", FALSE); + if (!channel) { + g_set_error (err, FEEDS_RSS_ERROR, + FEEDS_RSS_ERROR_NOT_RSS, + _("No <channel> node in RSS data")); + return NULL; + } + + rss = g_new0 (FeedsRSS, 1); + rss->items = g_ptr_array_new (); + + node = feeds_xml_find_next (channel, channel, "title", FALSE); + if (node) + rss->title = xmlNodeGetContent (node); + + node = feeds_xml_find_next (channel, channel, "link", FALSE); + if (node) + rss->link = xmlNodeGetContent (node); + + node = feeds_xml_find_next (channel, channel, "description", FALSE); + if (node) + rss->description = xmlNodeGetContent (node); + + /* Integrity checks. */ + if (!string_is_set (&rss->title, validate) || + !string_is_set (&rss->link, validate) || + !string_is_set (&rss->description, validate)) { + g_set_error (err, FEEDS_RSS_ERROR, + FEEDS_RSS_ERROR_BAD_RSS, + _("RSS data is missing one or more required " + "<channel> elements")); + goto fail; + } + + node = feeds_xml_find_next (channel, channel, "image", FALSE); + if (node) { + inode = feeds_xml_find_next (node, node, "title", FALSE); + if (inode) + rss->image_title = xmlNodeGetContent (inode); + + inode = feeds_xml_find_next (node, node, "link", FALSE); + if (inode) + rss->image_link = xmlNodeGetContent (inode); + + inode = feeds_xml_find_next (node, node, "url", FALSE); + if (inode) + rss->image_url = xmlNodeGetContent (inode); + + inode = feeds_xml_find_next (node, node, "description", FALSE); + if (inode) + rss->image_description = xmlNodeGetContent (inode); + + inode = feeds_xml_find_next (node, node, "width", FALSE); + if (inode) { + tmp = xmlNodeGetContent (inode); + rss->image_width = atoi (tmp); + xmlFree (tmp); + } + + inode = feeds_xml_find_next (node, node, "height", FALSE); + if (inode) { + tmp = xmlNodeGetContent (inode); + rss->image_height = atoi (tmp); + xmlFree (tmp); + } + + if (!string_is_set (&rss->image_url, validate) || + !string_is_set (&rss->image_title, validate) || + !string_is_set (&rss->image_link, validate)) { + g_set_error (err, FEEDS_RSS_ERROR, + FEEDS_RSS_ERROR_BAD_RSS, + _("RSS data is missing one or more required " + "elements of the <image> node")); + goto fail; + } + } + + for (node = feeds_xml_find_next (channel, channel, "item", FALSE); + node; + node = feeds_xml_find_next (node, channel, "item", FALSE)) { + item = g_new0 (FeedsRSSItem, 1); + g_ptr_array_add (rss->items, item); + + inode = feeds_xml_find_next (node, node, "title", FALSE); + if (inode) + item->title = xmlNodeGetContent (inode); + inode = feeds_xml_find_next (node, node, "link", FALSE); + if (inode) + item->link = xmlNodeGetContent (inode); + inode = feeds_xml_find_next (node, node, "description", FALSE); + if (inode) + item->description = xmlNodeGetContent (inode); + + if (!string_is_set (&item->title, validate) || + !string_is_set (&item->description, validate)) { + g_set_error (err, FEEDS_RSS_ERROR, + FEEDS_RSS_ERROR_BAD_RSS, + _("RSS item found with neither title nor description")); + goto fail; + } + } + + xmlFreeDoc (doc); + return rss; + + fail: + /* We end up here if there was a parse error */ + xmlFreeDoc (doc); + feeds_rss_free (rss); + return NULL; +} + +char * +feeds_rss_to_html (FeedsRSS *rss) +{ + GString *html; + char *ret; + int i; + + /* First the header... perhaps we could add a CSS stylesheet? */ + html = g_string_new ("<html>\n"); + g_string_append (html, "<head>\n<title>"); + feeds_append_to_html (html, rss->title); + g_string_append (html, "</title>\n"); + g_string_append (html, "</head><body>\n"); + + /* If there is an image, build a table to contain the image + * and the title, and write out the information for the image. + */ + if (rss->image_url) { + g_string_append (html, "<table><tr><td><a href=\""); + feeds_append_to_html (html, rss->image_link); + g_string_append (html, "\""); + if (rss->image_description) { + g_string_append (html, " alt=\""); + feeds_append_to_html (html, rss->image_description); + g_string_append (html, "\""); + } + g_string_append (html, "><img src=\""); + feeds_append_to_html (html, rss->image_url); + g_string_append (html, "\" alt=\""); + feeds_append_to_html (html, rss->image_title); + g_string_append (html, "\""); + if (rss->image_width > 0 && rss->image_height > 0) { + g_string_append_printf (html, " width=%d height=%d", + rss->image_width, + rss->image_height); + } + g_string_append (html, "></td><td>"); + } + + /* Now do the title */ + g_string_append (html, "<h1>"); + g_string_append (html, "<a href=\""); + feeds_append_to_html (html, rss->link); + g_string_append (html, "\">"); + feeds_append_to_html (html, rss->title); + g_string_append (html, "</a>"); + g_string_append (html, "</h1>"); + + /* And close off the table if there was one */ + if (rss->image_url) + g_string_append (html, "</td></tr></table>"); + g_string_append_c (html, '\n'); + + /* The description, as a subheading */ + g_string_append (html, "<h2>"); + feeds_append_to_html (html, rss->description); + g_string_append (html, "</h2>\n\n"); + + /* And finally the items, in a "description list". */ + g_string_append (html, "<dl>\n"); + for (i = 0; i < rss->items->len; i++) { + FeedsRSSItem *item = rss->items->pdata[i]; + + g_string_append (html, " <dt><a href=\""); + feeds_append_to_html (html, item->link); + g_string_append (html, "\">"); + feeds_append_to_html (html, item->title); + g_string_append (html, "</a></dt>\n"); + g_string_append (html, " <dd><p>"); + g_string_append (html, item->description); + g_string_append (html, "</p></dd>\n\n"); + } + g_string_append (html, "</dl>\n\n"); + + g_string_append (html, "</body>\n</html>\n"); + + ret = html->str; + /* Pass FALSE to g_string_free to tell it to free the GString + * structure, but not the string itself. + */ + g_string_free (html, FALSE); + return ret; +} + +void +feeds_rss_free (FeedsRSS *rss) +{ + FeedsRSSItem *item; + int i; + + /* It's safe to call xmlFree with NULL */ + + xmlFree (rss->title); + xmlFree (rss->link); + xmlFree (rss->description); + + xmlFree (rss->image_title); + xmlFree (rss->image_link); + xmlFree (rss->image_url); + + for (i = 0; i < rss->items->len; i++) { + item = rss->items->pdata[i]; + xmlFree (item->title); + xmlFree (item->link); + xmlFree (item->description); + g_free (item); + } + g_ptr_array_free (rss->items, TRUE); + + g_free (rss); +} + +GQuark +feeds_rss_error_quark (void) +{ + static GQuark error_quark; + + if (!error_quark) + error_quark = g_quark_from_static_string ("FEEDS_RSS_ERROR"); + return error_quark; +} diff -Npru evolution-cvs/feeds/feed-type-rss.h evolution/feeds/feed-type-rss.h --- evolution-cvs/feeds/feed-type-rss.h 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feed-type-rss.h 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,74 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* Copyright (C) 2004 Novell, Inc. */ + +#ifndef __FEEDS_RSS_H__ +#define __FEEDS_RSS_H__ + +#include <glib.h> +#include <libxml/parser.h> + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +/* Structures to implement the data in the RSS 2.0 specification, + * currently hosted at http://blogs.law.harvard.edu/tech/rss + * + * Note that we ignore many of the fields. + */ +typedef struct { + /* Title text and the URL it should link to */ + char *title; + char *link; + + /* Description of the channel */ + char *description; + + /* Image to go with the channel */ + char *image_url; + char *image_title; + char *image_link; + char *image_description; + int image_width, image_height; + + /* The <item>s */ + GPtrArray *items; +} FeedsRSS; + +typedef struct { + /* The item's title */ + char *title; + + /* The link to the full article */ + char *link; + + /* A brief abstract of the article */ + char *description; +} FeedsRSSItem; + + +/* Error handling */ +GQuark feeds_rss_error_quark (void); +#define FEEDS_RSS_ERROR feeds_rss_error_quark() +enum { + FEEDS_RSS_ERROR_NOT_RSS, + FEEDS_RSS_ERROR_BAD_RSS +}; + + +FeedsRSS *feeds_rss_new (const char *rss_data, + int length, + gboolean validate, + GError **err); + +char *feeds_rss_to_html (FeedsRSS *rss); + +void feeds_rss_free (FeedsRSS *rss); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __FEEDS_RSS_H__ */ diff -Npru evolution-cvs/feeds/feeds-blog-fetcher.c evolution/feeds/feeds-blog-fetcher.c --- evolution-cvs/feeds/feeds-blog-fetcher.c 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feeds-blog-fetcher.c 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,171 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * Copyright (C) 2004 Novell, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +/* feeds-blog-fetcher.c + * + * A subclass of FeedsRSSFetcher that handles a single contact + * whose blog we are tracking. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "feeds-blog-fetcher.h" +#include "feeds-utils.h" + +#include <e-util/e-util.h> +#include <libebook/e-contact.h> + +struct FeedsBlogFetcherPrivate { + char *name; + char *photo_url; +}; + +static void fetched_data (FeedsRSSFetcher *rf, SoupMessage *msg, + FeedsRSS *rss, GError *err); + +#define PARENT_TYPE FEEDS_TYPE_RSS_FETCHER +static FeedsRSSFetcherClass *parent_class = NULL; + +static void +init (GObject *object) +{ + FeedsBlogFetcher *bf = FEEDS_BLOG_FETCHER (object); + + bf->priv = g_new0 (FeedsBlogFetcherPrivate, 1); +} + +/* FeedsBlogFetcher doesn't have its own dispose implementation, + * because it doesn't reference any other objects itself. + */ + +static void +finalize (GObject *object) +{ + FeedsBlogFetcher *bf = FEEDS_BLOG_FETCHER (object); + + g_free (bf->priv->name); + g_free (bf->priv->photo_url); + g_free (bf->priv); + + /* This will call FeedsRSSFetcher's finalize method + * (because "parent_class" points to the + * FeedsRSSFetcherClass that + * feeds-rss-fetcher.c:class_init() initialized). + */ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +class_init (GObjectClass *object_class) +{ + FeedsRSSFetcherClass *fetcher_class = + FEEDS_RSS_FETCHER_CLASS (object_class); + + parent_class = g_type_class_peek_parent (object_class); + + /* Override some GObject methods */ + object_class->finalize = finalize; + + /* And a FeedsRSSFetcher signal */ + fetcher_class->fetched_data = fetched_data; +} + +E_MAKE_TYPE (feeds_blog_fetcher, "FeedsBlogFetcher", FeedsBlogFetcher, class_init, init, PARENT_TYPE) + + +/* This is our overridden default signal handler implementation + * for "fetched_data". Because feeds-rss-fetcher.c declared + * this signal to be "G_SIGNAL_RUN_FIRST", this function will + * be called before any actual signal handlers are. + */ +static void +fetched_data (FeedsRSSFetcher *rf, SoupMessage *msg, + FeedsRSS *rss, GError *err) +{ + FeedsBlogFetcher *bf = FEEDS_BLOG_FETCHER (rf); + + /* If we got RSS data with no image, and we have a + * photo from the EContact, substitute that in. + */ + if (rss && !rss->image_url && bf->priv->photo_url) { + rss->image_url = g_strdup (bf->priv->photo_url); + + /* Fill in the other mandatory image fields */ + rss->image_link = g_strdup (rss->link); + rss->image_title = g_strdup (bf->priv->name); + } +} + +/** + * feeds_blog_fetcher_new: + * @session: #SoupSession to use for HTTP + * @contact: an #EContact + * + * Creates a new #FeedsBlogFetcher based on @contact + * + * Return value: the new blog_fetcher + **/ +FeedsRSSFetcher * +feeds_blog_fetcher_new (SoupSession *session, EContact *contact) +{ + fprintf(stderr,"feeds_blog_fetcher_new\n"); + FeedsBlogFetcher *bf; + const char *url; + EContactPhoto *photo; + + /* Try the "Blog URL" field first, but fallback to the + * "Homepage URL" field if the blog field is empty. + */ + url = e_contact_get_const (contact, E_CONTACT_BLOG_URL); + if (!url || !*url) + url = e_contact_get_const (contact, E_CONTACT_HOMEPAGE_URL); + if (!url || !*url) + return NULL; + + bf = g_object_new (FEEDS_TYPE_BLOG_FETCHER, + "session", session, + "url", url, + NULL); + + bf->priv->name = e_contact_get (contact, E_CONTACT_FULL_NAME); + + /* If there's a picture associated with the contact, keep a copy + * of it. (At the time of writing [2004-03-24] there's no way + * to associate a picture with a contact, but this is supposed + * to be fixed eventually.) + */ + photo = e_contact_get (contact, E_CONTACT_PHOTO); + if (photo) { + char *base64photo; + + base64photo = feeds_base64_encode (photo->data, photo->length); + bf->priv->photo_url = + g_strdup_printf ("data:;base64,%s", base64photo); + g_free (base64photo); + e_contact_photo_free (photo); + } + + /* We know bf can safely be cast to FeedsRSSFetcher, so + * it's safe (and faster) to use a direct C typecast rather + * than "FEEDS_RSS_FETCHER (bf)". + */ + return (FeedsRSSFetcher *)bf; +} diff -Npru evolution-cvs/feeds/feeds-blog-fetcher.h evolution/feeds/feeds-blog-fetcher.h --- evolution-cvs/feeds/feeds-blog-fetcher.h 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feeds-blog-fetcher.h 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,56 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* Copyright (C) 2004 Novell, Inc. */ + +#ifndef __FEEDS_BLOG_FETCHER_H__ +#define __FEEDS_BLOG_FETCHER_H__ + +/* FeedsBlogFetcher is a subclass of FeedsRSSFetcher + * that specifically handles finding the blog for a person. + */ + +#include "feeds-rss-fetcher.h" +#include <libebook/e-contact.h> + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +#define FEEDS_TYPE_BLOG_FETCHER (feeds_blog_fetcher_get_type ()) +#define FEEDS_BLOG_FETCHER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FEEDS_TYPE_BLOG_FETCHER, FeedsBlogFetcher)) +#define FEEDS_BLOG_FETCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FEEDS_TYPE_BLOG_FETCHER, FeedsBlogFetcherClass)) +#define FEEDS_IS_BLOG_FETCHER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FEEDS_TYPE_BLOG_FETCHER)) +#define FEEDS_IS_BLOG_FETCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FEEDS_TYPE_BLOG_FETCHER)) + +typedef struct FeedsBlogFetcher FeedsBlogFetcher; +typedef struct FeedsBlogFetcherPrivate FeedsBlogFetcherPrivate; +typedef struct FeedsBlogFetcherClass FeedsBlogFetcherClass; + +/* FeedsRSSFetcher is our base class */ +struct FeedsBlogFetcher { + FeedsRSSFetcher parent; + + FeedsBlogFetcherPrivate *priv; +}; + +struct FeedsBlogFetcherClass { + FeedsRSSFetcherClass parent_class; + +}; + +GType feeds_blog_fetcher_get_type (void); + +/* Note that we return a FeedsRSSFetcher rather than a + * FeedsBlogFetcher. This is because the caller is likely to + * want to use it as a FeedsRSSFetcher. Gtk does the same + * thing with widgets (virtually all widget constructors return + * a GtkWidget *, not a GtkVBox *, etc). + */ +FeedsRSSFetcher *feeds_blog_fetcher_new (SoupSession *session, + EContact *contact); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __FEEDS_BLOG_FETCHER_H__ */ diff -Npru evolution-cvs/feeds/feeds-component-factory.c evolution/feeds/feeds-component-factory.c --- evolution-cvs/feeds/feeds-component-factory.c 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feeds-component-factory.c 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,58 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * Copyright (C) 2004 Novell, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +/* feeds-component-factory.c + * + * This initializes the libevolution-feeds.so component and sets + * up a CORBA "factory" for creating FeedsComponent objects. Most + * of the work is done by the BONOBO_ACTIVATION_SHLIB_FACTORY macro, + * which creates the registration function that will be called when + * another component uses bonobo-activation to activate this + * component. That registration function will declare that the + * feeds_factory() function can be called to create a new + * FeedsComponent object. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "feeds-component.h" + +#include <string.h> +#include <bonobo/bonobo-shlib-factory.h> + +#define FEEDS_FACTORY_ID "OAFIID:GNOME_Evolution_Feeds_Factory:" BASE_VERSION +#define FEEDS_COMPONENT_ID "OAFIID:GNOME_Evolution_Feeds_Component:" BASE_VERSION + +static BonoboObject * +feeds_factory (BonoboGenericFactory *factory, + const char *component_id, + gpointer user_data) +{ + /* Make sure it's asking for what we expected. */ + if (strcmp (component_id, FEEDS_COMPONENT_ID) != 0) { + g_warning (FEEDS_FACTORY_ID ": Dont't know how to activate %s", component_id); + return NULL; + } + + return g_object_new (FEEDS_TYPE_COMPONENT, NULL); +} + +BONOBO_ACTIVATION_SHLIB_FACTORY (FEEDS_FACTORY_ID, "Feeds component factory", feeds_factory, NULL) diff -Npru evolution-cvs/feeds/feeds-component.c evolution/feeds/feeds-component.c --- evolution-cvs/feeds/feeds-component.c 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feeds-component.c 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,287 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * Copyright (C) 2004 Novell, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +/* feeds-component.c + * + * This declares a BonoboObject subclass that implements the + * GNOME::Evolution::Component CORBA interface, which allows it to act + * as an Evolution shell component. feeds-component-factory.c + * handles registering with bonobo-activation, and creates a + * FeedsComponent when one is requested by the shell. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <string.h> + +#include "feeds-component.h" +#include "ef-feedlist.h" +#include "feeds-utils.h" +#include "feeds-view.h" +#include "ef-popup.h" + +#include <bonobo/bonobo-control.h> +#include <bonobo/bonobo-exception.h> +#include <e-util/e-dialog-utils.h> +#include <libgnome/gnome-i18n.h> +#include <libgnome/gnome-util.h> +#include <libsoup/soup-session-async.h> +#include <shell/evolution-shell-component-utils.h> +#include <shell/e-component-view.h> +#include <libedataserver/e-source-group.h> + +#define d(x) + +#define PARENT_TYPE bonobo_object_get_type () +static BonoboObjectClass *parent_class = NULL; + +typedef struct +{ + ESourceGroup *source_list; + + BonoboControl *view_control; + BonoboControl *sidebar_control; + BonoboControl *statusbar_control; +} FeedsComponentView; + +struct FeedsComponentPrivate { + SoupSession *session; + ESourceGroup *source_list; +}; + +/* GObject methods */ + +static void +dispose (GObject *object) +{ + FeedsComponentPrivate *priv = FEEDS_COMPONENT (object)->priv; + + if (priv->session) { + g_object_unref (priv->session); + priv->session = NULL; + } + if (priv->source_list) { + g_object_unref (priv->source_list); + priv->source_list = NULL; + } + + /* Chain to the parent class's implementation */ + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +finalize (GObject *object) +{ + FeedsComponentPrivate *priv = FEEDS_COMPONENT (object)->priv; + + g_free (priv); + + /* Chain to the parent class's implementation. Eventually this + * will reach GObjectClass's finalize method, which will free + * the object itself. + */ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +/* Evolution::Component CORBA methods. */ + +static void +impl_upgradeFromVersion (PortableServer_Servant servant, + const CORBA_short major, + const CORBA_short minor, + const CORBA_short revision, + CORBA_Environment *ev) +{ + /* This is the first version, so there won't be anything + * to upgrade regardless of what version the user is coming + * from. + */ +} + +static CORBA_boolean +impl_requestQuit (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + /* The shell calls this to ask each component if it's OK + * to quit. The mailer would return FALSE if there was a + * composer window open, for instance. We can always + * return TRUE. + */ + return TRUE; +} + +static CORBA_boolean +impl_quit (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + /* Likewise, we never have any state to save, so we can + * just quit. + */ + return TRUE; +} + +static GNOME_Evolution_CreatableItemTypeList * +impl__get_userCreatableItems (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + GNOME_Evolution_CreatableItemTypeList *list = GNOME_Evolution_CreatableItemTypeList__alloc (); + + list->_length = 1; + list->_maximum = list->_length; + list->_buffer = GNOME_Evolution_CreatableItemTypeList_allocbuf (list->_length); + + CORBA_sequence_set_release (list, FALSE); + + list->_buffer[0].id = "feeds"; + list->_buffer[0].description = _("New Feed"); + list->_buffer[0].menuDescription = _("_Feed"); + list->_buffer[0].tooltip = _("Add a new feed"); + list->_buffer[0].menuShortcut = 'f'; + list->_buffer[0].iconName = FEEDS_ICONDIR "/feed-icon.png"; + list->_buffer[0].type = GNOME_Evolution_CREATABLE_OBJECT; + + return list; +} + +static void +impl_requestCreateItem (PortableServer_Servant servant, + const CORBA_char *item_type_name, + CORBA_Environment *ev) +{ + /*fprintf(stderr, "imp_requestCreateItem...\n");*/ + FeedsComponent *component = + FEEDS_COMPONENT (bonobo_object_from_servant (servant)); + ESourceGroup *feeds_group; + + if (strcmp (item_type_name, "feeds") != 0) + CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Component_Failed, NULL); + + feeds_group = e_source_group_peek_sources(component->priv->source_list)->data; + g_return_if_fail (feeds_group != NULL); + + ef_feedlist_source_add (NULL, feeds_group, NULL); + /*fprintf(stderr, "imp_requestCreateItem...done\n");*/ +} +/*TODO: Verify*/ +static void +destroy_component_view (FeedsComponentView *component_view) +{ + if (component_view->source_list) + g_object_unref (component_view->source_list); +} + +static void +view_destroyed_cb (gpointer data, GObject *where_the_object_was) +{ +/* TODO: FIXME + * FeedsComponent *feeds_component = data; + FeedsComponentPrivate *priv; + GList *l; + + priv = feeds_component->priv; + SoupSession *session; + ESourceList *source_list; + + // /* Feeds doesn't have a GLIST of views + for (l = priv->views; l; l = l->next) { + FeedsView *component_view = l->data; + + if (G_OBJECT (component_view->view_control) == where_the_object_was) { + priv->views = g_list_remove (priv->views, component_view); + destroy_component_view (component_view); + + break; + } + } +*/ +} + + +static GNOME_Evolution_ComponentView +impl_createView (PortableServer_Servant servant, + GNOME_Evolution_ShellView parent, + CORBA_Environment *ev) +{ + /*fprintf(stderr, "imp_createView...\n");*/ + FeedsComponent *feeds_component = + FEEDS_COMPONENT (bonobo_object_from_servant (servant)); + FeedsComponentPrivate *priv = feeds_component->priv; + FeedsView *view; + view = feeds_view_new(priv->session, priv->source_list); + + g_object_weak_ref (G_OBJECT (view), view_destroyed_cb, feeds_component); + + EComponentView *component_view; + component_view = e_component_view_new_controls (parent, "feeds", + feeds_view_peek_sidebar(view), + feeds_view_peek_view(view), + feeds_view_peek_statusbar(view) + ); + + /*fprintf(stderr, "imp_createView...done\n");*/ + return BONOBO_OBJREF(component_view); + +} + +static void +feeds_component_class_init (FeedsComponentClass *klass) +{ + POA_GNOME_Evolution_Component__epv *epv = &klass->epv; + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + /* Override some methods in one of our parent classes. */ + object_class->dispose = dispose; + object_class->finalize = finalize; + + /* Declare implementations for the GNOME::Evolution::Component + * methods. + */ + epv->upgradeFromVersion = impl_upgradeFromVersion; + epv->createView = impl_createView; + epv->requestQuit = impl_requestQuit; + epv->quit = impl_quit; + epv->_get_userCreatableItems = impl__get_userCreatableItems; + epv->requestCreateItem = impl_requestCreateItem; +} + +static void +feeds_component_init (FeedsComponent *component) +{ + /*fprintf(stderr, "feeds_component_init...\n");*/ + FeedsComponentPrivate *priv; + + priv = g_new0 (FeedsComponentPrivate, 1); + component->priv = priv; + + priv->session = soup_session_async_new (); + priv->source_list = ef_feedlist_new (); + /*fprintf(stderr, "feeds_component_init...done\n");*/ +} + + +/* BONOBO_TYPE_FUNC_FULL is defined in <bonobo/bonobo-object.h>. + * It expands out to define feeds_component_get_type() for us, + * filling in all of the boilerplate. (PARENT_TYPE was defined + * above to be BONOBO_TYPE_OBJECT.) + */ +BONOBO_TYPE_FUNC_FULL (FeedsComponent, GNOME_Evolution_Component, PARENT_TYPE, feeds_component) diff -Npru evolution-cvs/feeds/feeds-component.h evolution/feeds/feeds-component.h --- evolution-cvs/feeds/feeds-component.h 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feeds-component.h 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,51 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* Copyright (C) 2004 Novell, Inc. */ + +#ifndef __FEEDS_COMPONENT_H__ +#define __FEEDS_COMPONENT_H__ + +/* This header is basically all GObject/BonoboObject-related + * boilerplate. Basically all we are doing is declaring a subclass of + * BonoboObject that implements the GNOME::Evolution::Component + * interface. See feeds-rss-fetcher.h for more details of the + * GObject-specific parts. + */ + +#include <bonobo/bonobo-object.h> +#include <shell/Evolution.h> + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +#define FEEDS_TYPE_COMPONENT (feeds_component_get_type ()) +#define FEEDS_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FEEDS_TYPE_COMPONENT, FeedsComponent)) +#define FEEDS_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FEEDS_TYPE_COMPONENT, FeedsComponentClass)) +#define FEEDS_IS_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FEEDS_TYPE_COMPONENT)) +#define FEEDS_IS_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FEEDS_TYPE_COMPONENT)) + +typedef struct FeedsComponent FeedsComponent; +typedef struct FeedsComponentPrivate FeedsComponentPrivate; +typedef struct FeedsComponentClass FeedsComponentClass; + +struct FeedsComponent { + BonoboObject parent; + + FeedsComponentPrivate *priv; +}; + +struct FeedsComponentClass { + BonoboObjectClass parent_class; + + /* This is part of the BonoboObject boilerplate. */ + POA_GNOME_Evolution_Component__epv epv; +}; + +GType feeds_component_get_type (void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __FEEDS_COMPONENT_H__ */ diff -Npru evolution-cvs/feeds/feeds-marshal.list evolution/feeds/feeds-marshal.list --- evolution-cvs/feeds/feeds-marshal.list 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feeds-marshal.list 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1 @@ +NONE:OBJECT,POINTER,POINTER diff -Npru evolution-cvs/feeds/feeds-rss-fetcher.c evolution/feeds/feeds-rss-fetcher.c --- evolution-cvs/feeds/feeds-rss-fetcher.c 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feeds-rss-fetcher.c 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,648 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * Copyright (C) 2004 Novell, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +/* feeds-rss-fetcher.c + * + * Fetches and parses RSS feeds on demand. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <ctype.h> +#include <string.h> + +#include "feeds-rss-fetcher.h" +#include "feeds-marshal.h" +#include "feeds-utils.h" + +#include <e-util/e-util.h> +#include <libgnome/gnome-i18n.h> +#include <libsoup/soup-session.h> +#include <libsoup/soup-uri.h> +#include <libxml/HTMLparser.h> + +struct FeedsRSSFetcherPrivate { + SoupSession *session; + char *url; + SoupMessage *pending_msg; + gboolean be_clever; +}; + +/* Signals */ +enum { + FETCHED_DATA, + LAST_SIGNAL +}; +static guint signals [LAST_SIGNAL] = { 0 }; + +/* Properties */ +enum { + PROP_SESSION = 1, + PROP_RSS_URL, + PROP_BE_CLEVER, + LAST_PROP +}; + +/* Prototypes for the methods we implement. */ +static void set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec); +static void get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec); + +static void fetch (FeedsRSSFetcher *rf); + +#define PARENT_TYPE G_TYPE_OBJECT +static GObjectClass *parent_class = NULL; + +/* This is the initializer for new FeedsRSSFetcher objects, + * which gets called automatically as part of g_object_new(). + */ +static void +init (GObject *object) +{ + FeedsRSSFetcher *rf = FEEDS_RSS_FETCHER (object); + + rf->priv = g_new0 (FeedsRSSFetcherPrivate, 1); + rf->priv->be_clever = TRUE; +} + +/* "dispose" is the early stage of object destruction. When dispose is + * called, the object should unreference any other objects it is + * currently holding references to (but not widgets, because they are + * destroyed when their parent is destroyed). Beware that dispose may + * be called multiple times during destruction. + */ +static void +dispose (GObject *object) +{ + FeedsRSSFetcher *rf = FEEDS_RSS_FETCHER (object); + + if (rf->priv->pending_msg) { + soup_message_set_status (rf->priv->pending_msg, + SOUP_STATUS_CANCELLED); + soup_session_cancel_message (rf->priv->session, + rf->priv->pending_msg); + rf->priv->pending_msg = NULL; + } + + if (rf->priv->session) { + g_object_unref (rf->priv->session); + rf->priv->session = NULL; + } + + /* Chain to the parent class's implementation. (This + * is an important idiom in the GNOME object system.) + */ + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +/* "finalize" is the very last stage of object destruction, in + * which the object must free any remaining memory it has allocated. + */ +static void +finalize (GObject *object) +{ + FeedsRSSFetcher *rf = FEEDS_RSS_FETCHER (object); + + g_free (rf->priv->url); + g_free (rf->priv); + + /* Chain to the parent class's implementation. Eventually this + * will reach GObjectClass's finalize method, which will free + * the object itself. + */ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +/* This initializes the FeedsComponentClass object, + * setting up default method implementations, signal handlers, + * etc. Each of the class's ancestor classes will also have + * their class_init function called on the class object, + * starting with GObject, and working its way down to your + * class_init. (In this case, it would be just GObject's + * and then this one.) So this means each subclass has the + * opportunity to override the methods set up by its + * parent classes. + */ +static void +class_init (GObjectClass *object_class) +{ + FeedsRSSFetcherClass *fetcher_class = + FEEDS_RSS_FETCHER_CLASS (object_class); + + /* Get a pointer to our parent class (which will be used + * to chain to the parent implementations of dispose + * and finalize. + */ + parent_class = g_type_class_peek_parent (object_class); + + /* Override some GObject methods */ + object_class->dispose = dispose; + object_class->finalize = finalize; + object_class->set_property = set_property; + object_class->get_property = get_property; + + /* Initialize our own virtual method */ + fetcher_class->fetch = fetch; + + /* Define our signal. Again mostly boilerplate. */ + signals[FETCHED_DATA] = + g_signal_new ("fetched_data", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (FeedsRSSFetcherClass, fetched_data), + NULL, NULL, + feeds_marshal_NONE__OBJECT_POINTER_POINTER, + G_TYPE_NONE, 3, + SOUP_TYPE_MESSAGE, + G_TYPE_POINTER, + G_TYPE_POINTER); + + /* Define our properties. Properties are special because + * they can be introspected by the program and the type + * system. Among other things, this makes them much easier + * to handle when writing a wrapper for the class in + * another programming language. Properties also give a + * standard way to pass construct-time data to an object. + */ + g_object_class_install_property ( + object_class, PROP_SESSION, + g_param_spec_object ("session", "Session", + "The SoupSession to use for HTTP", + SOUP_TYPE_SESSION, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property ( + object_class, PROP_RSS_URL, + g_param_spec_string ("url", "RSS URL", + "The URL of the RSS feed to fetch", + NULL, + G_PARAM_READWRITE)); + g_object_class_install_property ( + object_class, PROP_BE_CLEVER, + g_param_spec_boolean ("be_clever", "Be clever", + "Whether or not to try to parse HTML looking for RSS", + TRUE, + G_PARAM_READWRITE)); +} + +/* This is a macro (defined in <gal/util/e-util.h>) that creates the + * feeds_rss_fetcher_get_type function for us, saving us from + * a little bit of additional cut+pastage. + */ +E_MAKE_TYPE (feeds_rss_fetcher, "FeedsRSSFetcher", FeedsRSSFetcher, class_init, init, PARENT_TYPE) + +/* More boilerplate-ish code, to implement getting and setting our + * properties. + */ +static void +set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec) +{ + FeedsRSSFetcher *rf = FEEDS_RSS_FETCHER (object); + + switch (prop_id) { + case PROP_SESSION: + /* Since this is construct-only, we know rf->priv->session + * must currently be NULL, so we don't have to worry + * about unreffing it. + */ + rf->priv->session = SOUP_SESSION (g_value_dup_object (value)); + break; + case PROP_RSS_URL: + if (rf->priv->url) + g_free (rf->priv->url); + rf->priv->url = g_value_dup_string (value); + + /* Maybe we should check if there's a request pending + * and cancel it if so? + */ + + break; + default: + break; + } +} + +static void +get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + FeedsRSSFetcher *rf = FEEDS_RSS_FETCHER (object); + + switch (prop_id) { + case PROP_SESSION: + g_value_set_object (value, rf->priv->session); + break; + case PROP_RSS_URL: + g_value_set_string (value, rf->priv->url); + break; + default: + break; + } +} + + +/** + * feeds_rss_fetcher: + * @session: the #SoupSession to use for HTTP requests + * @rss_url: the URL of the RSS feed to fetch + * + * Creates a new #FeedsRSSFetcher object. + * + * Return value: the #FeedsRSSFetcher + **/ +FeedsRSSFetcher * +feeds_rss_fetcher_new (SoupSession *session, const char *rss_url) +{ + fprintf(stderr,"feeds_rss_fetcher_new.\n"); + return g_object_new (FEEDS_TYPE_RSS_FETCHER, + "session", session, + "url", rss_url, + NULL); +} + + +/* Utility function used to decide if from_url and to_url point + * to the same domain or not. + */ +static gboolean +same_domain (const char *from_url, const char *to_url) +{ + char *p; + int len; + + /* If to_url is relative, it's the same domain as from_url + * basically by definition. + */ + if (!strchr (to_url, ':')) + return TRUE; + + /* If it's not http, it's no good */ + if (g_ascii_strncasecmp (to_url, "http://", 7) != 0 && + g_ascii_strncasecmp (to_url, "https://", 8) != 0) + return FALSE; + + /* Otherwise find the domain part of from_url and compare + * to to_url. + */ + p = strstr (from_url, "://"); + g_return_val_if_fail (p != NULL, FALSE); + p = strchr (p + 3, '/'); + if (p) + len = p - from_url; + else { + /* Must be something like "http://foo.com" */ + len = strlen (from_url); + } + + return g_ascii_strncasecmp (from_url, to_url, len) == 0; +} + +/* utility function to get the last pathname component of a URL */ +static xmlChar * +url_basename (xmlChar *url) +{ + xmlChar *p; + + p = strrchr (url, '/'); + if (p) + return p + sizeof('/'); + else + return url; +} + +#define non_word_char(x) ((x) > 127 || !isalpha ((unsigned char)(x))) + +/* Search @body looking for something that looks like an RSS URL. */ +static xmlChar * +find_rss_link (const char *source_url, const char *body, int length) +{ + char *body_copy; + xmlDoc *doc; + xmlNode *link, *img; + xmlChar *href, *prop, *text, *p; + + /* Unfortunately, libxml doesn't have an HTML parser interface + * that takes a buffer and a length, so we have to copy the + * response body into a '\0'-terminated string. + */ + body_copy = g_malloc (length + 1); + memcpy (body_copy, body, length); + body_copy[length] = '\0'; + + doc = htmlParseDoc (body_copy, NULL); + g_free (body_copy); + + if (!doc) { + /* Must have not been HTML */ + return NULL; + } + + /* The "official" way to find an RSS feed is to look for + * <link rel="alternate" type="application/rss+xml" + * title="RSS" href="..." /> + * + * feeds_xml_find_next() is explained fully in + * feeds-utils.c. + */ + link = doc->children; + while ((link = feeds_xml_find_next (link, NULL, "link", TRUE))) { + prop = xmlGetProp (link, "rel"); + if (!prop || g_ascii_strcasecmp (prop, "alternate") != 0) { + xmlFree (prop); + continue; + } + xmlFree (prop); + + prop = xmlGetProp (link, "type"); + if (!prop || g_ascii_strcasecmp (prop, "application/rss+xml") != 0) { + xmlFree (prop); + continue; + } + xmlFree (prop); + + prop = xmlGetProp (link, "title"); + if (!prop || g_ascii_strcasecmp (prop, "RSS") != 0) { + xmlFree (prop); + continue; + } + xmlFree (prop); + + href = xmlGetProp (link, "href"); + if (href) + return href; + } + + /* If that doesn't work, we try to find an explicit + * <a href="..."> link in the page that looks like it's + * probably a link to an RSS feed. First we try for a link to + * "rss.xml" or "*.rss*" + */ + link = doc->children; + while ((link = feeds_xml_find_next (link, NULL, "a", TRUE))) { + href = xmlGetProp (link, "href"); + if (!href) + continue; + if (!same_domain (source_url, href)) { + xmlFree (href); + continue; + } + + p = url_basename (href); + if (!g_ascii_strcasecmp (p, "rss.xml")) + return href; + + p = strrchr (p, '.'); + if (p && !g_ascii_strncasecmp (p, ".rss", 4)) + return href; + + xmlFree (href); + } + + /* Failing that, we look at the content of the links, looking + * for one of: + * - the word "RSS" (case insensitive) + * - the word "syndicate" (case insensitive) as the first word + * - <img src="xml.gif"> (the widely-used little orange button) + */ + link = doc->children; + while ((link = feeds_xml_find_next (link, NULL, "a", TRUE))) { + href = xmlGetProp (link, "href"); + if (!href) + continue; + if (!same_domain (source_url, href)) { + xmlFree (href); + continue; + } + + text = xmlNodeGetContent (link); + if (text) { + if (!g_ascii_strncasecmp (text, "syndicate", 9) && + non_word_char (text[9])) { + xmlFree (text); + return href; + } + + for (p = text; *p; p++) { + if (!g_ascii_strncasecmp (p, "rss", 3) && + (p == text || non_word_char (p[-1])) && + non_word_char (p[3])) { + xmlFree (text); + return href; + } + } + xmlFree (text); + } + + img = link; + while ((img = feeds_xml_find_next (img, link, "img", TRUE))) { + prop = xmlGetProp (img, "src"); + if (!prop) + continue; + + if (g_ascii_strcasecmp (url_basename (prop), "xml.gif") == 0) { + xmlFree (prop); + return href; + } + xmlFree (prop); + } + + xmlFree (href); + } + + /* Oh well. Give up. */ + return NULL; +} + +/* Given a SoupMessage that doesn't contain an RSS feed, see if we + * can find a better URL. + */ +static gboolean +try_fix_url (FeedsRSSFetcher *rf, SoupMessage *msg) +{ + const char *content_type; + xmlChar *href; + const SoupUri *base_uri; + SoupUri *new_uri; + char *new_uri_str, *source_url; + + if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) + return FALSE; + + /* If the data is explicitly marked as being something other + * than HTML, ignore it. + */ + content_type = soup_message_get_header (msg->response_headers, + "Content-Type"); + if (content_type && + g_ascii_strncasecmp (content_type, "text/html", 9) != 0 && + g_ascii_strncasecmp (content_type, "text/xhtml+xml", 14) != 0) + return FALSE; + + /* OK, let's try... */ + base_uri = soup_message_get_uri (msg); + source_url = soup_uri_to_string (base_uri, FALSE); + href = find_rss_link (source_url, + msg->response.body, msg->response.length); + g_free (source_url); + if (!href) + return FALSE; + + /* Success! But the href may be relative... */ + new_uri = soup_uri_new_with_base (base_uri, href); + new_uri_str = soup_uri_to_string (new_uri, FALSE); + + /* Update our URL */ + g_object_set (G_OBJECT (rf), + "url", new_uri_str, + NULL); + g_free (new_uri_str); + soup_uri_free (new_uri); + xmlFree (href); + + return TRUE; +} + +/* Callback for soup_session_queue_message. Called when either a + * response has been received or the message has failed due to some + * transport problem. (Eg, "can't connect to host".) + */ +static void +got_rss_feed (SoupMessage *msg, gpointer user_data) +{ + fprintf(stderr,"got_rss_feed\n"); + FeedsRSSFetcher *rf = user_data; + FeedsRSS *rss; + GError *err = NULL; + + rf->priv->pending_msg = NULL; + + if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) { + g_set_error (&err, FEEDS_RSS_FETCHER_ERROR_HTTP, + msg->status_code, + _("Could not retrieve RSS feed: %s"), + msg->reason_phrase); + rss = NULL; + } else { + rss = feeds_rss_new (msg->response.body, + msg->response.length, + FALSE, &err); + + /* If we didn't get RSS data, try (once) to be clever + * and find an RSS link in the HTML data. + */ + if (!rss && rf->priv->be_clever) { + rf->priv->be_clever = FALSE; + if (try_fix_url (rf, msg)) { + /* We think we found something, so try + * again. + */ + feeds_rss_fetcher_fetch (rf); + return; + } + } + } + + /* Now emit our "fetched_data" signal so that whoever asked + * us to fetch the data can do what they need to do with it. + */ + g_signal_emit (rf, signals[FETCHED_DATA], 0, msg, rss, err); + + if (err) + g_error_free (err); + if (rss) + feeds_rss_free (rss); +} + +static void +fetch (FeedsRSSFetcher *rf) +{ + fprintf(stderr,"fetch\n"); + /* If we're already fetching, we don't need to do anything */ + if (rf->priv->pending_msg) + return; + + /* Create a new soup message to get the contents of the URL + * and queue it to be sent asynchronously. Soup will call + * "got_rss_feed" when the response comes back. + */ + rf->priv->pending_msg = soup_message_new ("GET", rf->priv->url); + soup_session_queue_message (rf->priv->session, rf->priv->pending_msg, + got_rss_feed, rf); +} + +/** + * feeds_rss_fetcher_fetch: + * @rf: the RSS fetcher + * + * Asks @rf to asynchronously fetch RSS data from its associated + * RSS feed. It will emit a %fetched_data signal when it has the + * data (or if an error occurs). + **/ +void +feeds_rss_fetcher_fetch (FeedsRSSFetcher *rf) +{ + fprintf(stderr,"feeds_rss_fetcher_fetch.\n"); + /* Try to protect against crashing in the event of a + * programmer error. If either of these fail, they will + * spew a warning to stderr and then return. Note the + * explicit "!= NULL" in the second one, which is used + * because it makes the "assertion failed" error message + * more understandable. + */ + g_return_if_fail (FEEDS_IS_RSS_FETCHER (rf)); + g_return_if_fail (rf->priv->url != NULL); + + /* This function is just a wrapper for a virtual method. It + * should not do anything except call the virtual method, + * because if it does, then authors of language bindings + * (for python, C++, etc) will need to special-case the + * method. + * + * Since we set the FeedsRSSFetcherClass's "fetch" + * member to point to the "fetch" function above, that is + * what will be called (unless this is being called on + * a subclass of FeedsRSSFetcher, and that subclass + * overrode the method). + */ + + FEEDS_RSS_FETCHER_GET_CLASS (rf)->fetch (rf); +} + +const char * +feeds_rss_fetcher_url (FeedsRSSFetcher *rss_fetcher) +{ + g_return_val_if_fail (FEEDS_IS_RSS_FETCHER (rss_fetcher), NULL); + + return rss_fetcher->priv->url; +} + + +GQuark +feeds_rss_fetcher_error_quark (void) +{ + static GQuark error_quark; + + if (!error_quark) + error_quark = g_quark_from_static_string ("FEEDS_RSS_FETCHER_ERROR"); + return error_quark; +} + diff -Npru evolution-cvs/feeds/feeds-rss-fetcher.h evolution/feeds/feeds-rss-fetcher.h --- evolution-cvs/feeds/feeds-rss-fetcher.h 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feeds-rss-fetcher.h 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,123 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* Copyright (C) 2004 Novell, Inc. */ + +#ifndef __FEEDS_RSS_FETCHER_H__ +#define __FEEDS_RSS_FETCHER_H__ + +/* This header is almost entirely GObject-related boilerplate. + * Generally when writing a new class, you would copy+paste from + * an existing class and then find+replace. + */ + +#include <glib-object.h> +#include <libsoup/soup-message.h> + +#include "feed-type-rss.h" + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +/* The standard GObject macros: + * + * FEEDS_TYPE_RSS_FETCHER: returns the GType for FeedsRSSFetcher + * FEEDS_RSS_FETCHER(obj): casts "obj" to FeedsRSSFetcher *, + * emitting a warning and returning NULL if obj is NULL or points to a + * GObject that is not a FeedsRSSFetcher. + * FEEDS_RSS_FETCHER_CLASS(klass): likewise, to cast a class object + * to FeedsRSSFetcherClass *. (We say "klass" here and elsewhere + * because "class" would cause syntax errors in C++.) + * FEEDS_IS_RSS_FETCHER(obj): tests if a GObject is a + * FeedsRSSFetcher. + * FEEDS_IS_RSS_FETCHER_CLASS(obj): likewise, tests if a class object + * is a FeedsRSSFetcherClass. + * FEEDS_RSS_FETCHER_GET_CLASS(obj): given an object, extract its + * class as a FeedsRSSFetcherClass. Used to implement virtual + * methods. (See feeds-rss-fetcher.c.) + * + * Note the use of namespacing: the standard naming scheme assumes + * that each class name has a namespace ("Feeds") and a name + * inside that namespace ("RSSFetcher"). + */ + +#define FEEDS_TYPE_RSS_FETCHER (feeds_rss_fetcher_get_type ()) +#define FEEDS_RSS_FETCHER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FEEDS_TYPE_RSS_FETCHER, FeedsRSSFetcher)) +#define FEEDS_RSS_FETCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FEEDS_TYPE_RSS_FETCHER, FeedsRSSFetcherClass)) +#define FEEDS_IS_RSS_FETCHER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FEEDS_TYPE_RSS_FETCHER)) +#define FEEDS_IS_RSS_FETCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FEEDS_TYPE_RSS_FETCHER)) +#define FEEDS_RSS_FETCHER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FEEDS_TYPE_RSS_FETCHER, FeedsRSSFetcherClass)) + +typedef struct FeedsRSSFetcher FeedsRSSFetcher; +typedef struct FeedsRSSFetcherPrivate FeedsRSSFetcherPrivate; +typedef struct FeedsRSSFetcherClass FeedsRSSFetcherClass; + + +/* Define the FeedsRSSFetcher structure. Note that the "parent" + * field is a GObject structure, *NOT* a pointer to a GObject. + * This means that a FeedsRSSFetcher * can be cast to a + * GObject *. + * + * If FeedsRSSFetcher had any public fields, they would also be + * listed here. We use the convention of just having a "priv" pointer + * pointing to private data, so that other code can't muck up our + * internal state. Also, that lets us add or change fields later + * without breaking ABI compatibility by changing the size of the + * structure. + */ +struct FeedsRSSFetcher { + GObject parent; + + FeedsRSSFetcherPrivate *priv; +}; + +/* Likewise, this defines the class structure. Any signals or + * methods implemented by the class will be prototyped here. + * (There's no way to tell just from looking at the prototype + * whether something is a signal or a method, so it's customary + * to label them with a comment.) + * + * If you wanted to have the equivalent of static class members, + * you could also include them in the class structure, but this + * is not commonly done. + */ +struct FeedsRSSFetcherClass { + GObjectClass parent_class; + + /* signals */ + void (*fetched_data) (FeedsRSSFetcher *, SoupMessage *, + FeedsRSS *, GError *); + + /* methods */ + void (*fetch) (FeedsRSSFetcher *); +}; + +/* The standard type-getting macro. Outside code may assume that + * it has exactly this name format, though technically, they should + * be using FEEDS_RSS_FETCHER_TYPE rather than calling this + * directly. + */ +GType feeds_rss_fetcher_get_type (void); + + +/* A "constructor" and some methods. */ +FeedsRSSFetcher *feeds_rss_fetcher_new (SoupSession *session, + const char *rss_url); + +void feeds_rss_fetcher_fetch (FeedsRSSFetcher *rss_fetcher); + +const char *feeds_rss_fetcher_url (FeedsRSSFetcher *rss_fetcher); + + +/* Error handling */ +GQuark feeds_rss_fetcher_error_quark (void); +#define FEEDS_RSS_FETCHER_ERROR feeds_rss_fetcher_error_quark() +enum { + FEEDS_RSS_FETCHER_ERROR_HTTP +}; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __FEEDS_RSS_FETCHER_H__ */ diff -Npru evolution-cvs/feeds/feeds-utils.c evolution/feeds/feeds-utils.c --- evolution-cvs/feeds/feeds-utils.c 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feeds-utils.c 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,248 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * Copyright (C) 2004 Novell, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#include "feeds-utils.h" + +#include <string.h> + +static const char *b64_alphabet = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +/** + * feeds_base64_encode: + * @data: binary data + * @length: the length of @data + * + * Base64-encodes @length bytes of data at @data. + * + * Return value: the base64-encoded representation of @data, which the + * caller must free. + **/ +char * +feeds_base64_encode (const guint8 *data, int length) +{ + char *buf, *p; + + p = buf = g_malloc (((length + 2) / 3) * 4 + 1); + while (length >= 3) { + p[0] = b64_alphabet[ (data[0] >> 2) & 0x3f]; + p[1] = b64_alphabet[((data[0] << 4) & 0x30) + + ((data[1] >> 4) & 0x0f)]; + p[2] = b64_alphabet[((data[1] << 2) & 0x3c) + + ((data[2] >> 6) & 0x03)]; + p[3] = b64_alphabet[ data[2] & 0x3f]; + + data += 3; + p += 4; + length -= 3; + } + + switch (length) { + case 2: + p[0] = b64_alphabet[ (data[0] >> 2) & 0x3f]; + p[1] = b64_alphabet[((data[0] << 4) & 0x30) + + ((data[1] >> 4) & 0xf)]; + p[2] = b64_alphabet[ (data[1] << 2) & 0x3c]; + p[3] = '='; + p += 4; + break; + case 1: + p[0] = b64_alphabet[ (data[0] >> 2) & 0x3f]; + p[1] = b64_alphabet[ (data[0] << 4) & 0x30]; + p[2] = '='; + p[3] = '='; + p += 4; + break; + } + + *p = '\0'; + return buf; +} + +static guint8 base64_unphabet[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2, -2, -2, -2, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, + -1, 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, -1, -1, -1, -1, -1, + -1, 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, -1, -1, -1, -1, -1, +}; +#define FEEDS_B64_SPACE ((guint8)-2) +#define FEEDS_B64_BAD ((guint8)-1) + +/** + * feeds_base64_decode: + * @string: base64-encoded data + * + * Decodes the base64-encoded data in @string. + * + * Return value: the binary data encoded in @string + **/ +GByteArray * +feeds_base64_decode (const char *string) +{ + GByteArray *rc; + int bits, length, qw = 0; + guint8 *data; + + rc = g_byte_array_new (); + + length = strlen (string); + if (length == 0) + return rc; + + g_byte_array_set_size (rc, ((length / 4) + 1) * 3); + + data = rc->data; + for (; *string; string++) { + if ((unsigned char)*string > 127) + break; + bits = base64_unphabet[(unsigned char)*string]; + if (bits == FEEDS_B64_BAD) + break; + else if (bits == FEEDS_B64_SPACE) + continue; + + switch (qw++) { + case 0: + data[0] = (bits << 2) & 0xfc; + break; + case 1: + data[0] |= (bits >> 4) & 0x03; + data[1] = (bits << 4) & 0xf0; + break; + case 2: + data[1] |= (bits >> 2) & 0x0f; + data[2] = (bits << 6) & 0xc0; + break; + case 3: + data[2] |= bits & 0x3f; + data += 3; + qw = 0; + break; + } + } + + rc->len = data - rc->data; + if (qw > 1) + rc->len += qw - 1; + return rc; +} + + +/** + * feeds_xml_find_next: + * @start: the starting node + * @top: the root of the subtree to search + * @name: the name of the element to find + * @case_insensitive: whether or not to match names case- + * insensitively + * + * This is a utility function for searching a subtree of an XML + * document for a node with the given name. @top is the top of the + * subtree to search. (If %NULL, the whole tree will be searched.) + * @start is the node to start from, though @start itself will not + * be checked. + * + * To search the complete tree under a given node, pass that node as + * both @start and @top on the first call, and then on each successive + * call, pass the previous match as @start (with the original top node + * still as @top). + * + * Note that when searching HTML, you must pass @name in all caps, + * because libxml's HTML parser normalizes all HTML tags that way. + * + * Return value: the first matching element after @node, or %NULL when + * there are no more matches. + **/ +xmlNode * +feeds_xml_find_next (xmlNode *start, xmlNode *top, + const char *name, gboolean case_insensitive) +{ + xmlNode *node = start; + + g_return_val_if_fail (name != NULL, NULL); + + /* We do a pre-order depth-first search: so s = start + * first we go down the left edge of the / \ + * tree, checking each node in turn, until we 1 6 + * hit a leaf. Then, if the current node has /|\ \ + * no younger siblings, we climb up until we 2 3 5 7 + * find a node that does, at which point we | / \ + * check the sibling and then recurse. 4 8 9 + */ + + while (node) { + if (node->children) + node = node->children; + else { + while (node && !node->next && node != top) + node = node->parent; + if (!node || node == top) + return NULL; + node = node->next; + } + + if (node->name) { + if (!strcmp (node->name, name) || + (case_insensitive && + !g_ascii_strcasecmp (node->name, name))) + return node; + } + } + + return NULL; +} + +/** + * feeds_append_to_html: + * @str: a %GString containing HTML text + * @text: text to append to @str + * + * Appends @str to @text, escaping any characters that might be + * interpreted as HTML special characters (<>&"). + **/ +void +feeds_append_to_html (GString *str, const char *text) +{ + while (*text) { + switch (*text) { + case '<': + g_string_append (str, "<"); + break; + case '>': + g_string_append (str, ">"); + break; + case '&': + g_string_append (str, "&"); + break; + case '"': + g_string_append (str, """); + break; + + default: + g_string_append_c (str, *text); + break; + } + text++; + } +} + diff -Npru evolution-cvs/feeds/feeds-utils.h evolution/feeds/feeds-utils.h --- evolution-cvs/feeds/feeds-utils.h 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feeds-utils.h 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,31 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* Copyright (C) 2004 Novell, Inc. */ + +#ifndef __FEEDS_UTILS_H__ +#define __FEEDS_UTILS_H__ + +#include <glib.h> +#include <libxml/tree.h> + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +char *feeds_base64_encode (const guint8 *data, + int length); +GByteArray *feeds_base64_decode (const char *string); + +xmlNode *feeds_xml_find_next (xmlNode *start, + xmlNode *top, + const char *name, + gboolean case_insensitive); + +void feeds_append_to_html (GString *str, + const char *text); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __FEEDS_UTILS_H__ */ diff -Npru evolution-cvs/feeds/feeds-view.c evolution/feeds/feeds-view.c --- evolution-cvs/feeds/feeds-view.c 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feeds-view.c 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,1071 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* + * Copyright (C) 2004 Novell, Inc. + * Copyright (C) 2006 Andrew Case <case andrew gmail com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +/* feeds-view.c + * + * This manages a view of the Feeds component. There will be one + * of these for each open Evolution window in which the Feeds + * component is being viewed. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "feeds-view.h" +#include "feeds-blog-fetcher.h" +#include "ef-feedlist.h" +#include "feeds-utils.h" +#include "ef-popup.h" + +#include <gtk/gtk.h> +#include <string.h> +#include <gdk/gdkkeysyms.h> +#include <e-util/e-icon-factory.h> +#include <e-util/e-dialog-utils.h> +#include <e-util/e-util.h> +#include <gtk/gtkscrolledwindow.h> +#include <gtk/gtkvbox.h> +#include <gtkhtml/gtkhtml.h> +#include <libebook/e-book.h> +#include <libgnome/gnome-i18n.h> +#include <libgnome/gnome-url.h> +#include <shell/e-user-creatable-items-handler.h> +#include <shell/evolution-shell-component-utils.h> +#include <libedataserverui/e-source-selector.h> +#include <widgets/misc/e-activity-handler.h> +#include <widgets/misc/e-task-bar.h> +#include <widgets/misc/e-info-label.h> + +struct FeedsViewPrivate { + /* Grabs web content */ + SoupSession *session; + + /* Fetchers for web content */ + GHashTable *rss_fetchers; + + /* Data from web content/fetcher */ + GSList *msgs; + + /* Selection Sidebar Controls */ + ESourceList *source_list; + ESourceSelector *source_selector; + BonoboControl *sidebar_control; + + /* Main window view */ + GtkHTML *html; + BonoboControl *view_control; + + /* Status Bar control */ + ETaskBar *task_bar; + BonoboControl *statusbar_control; + + /* Toolbar buttons */ + //EMenu *menu; + + /* Evolution Shtuff ? */ + EActivityHandler *activity_handler; + + /* Adds Functionality to New Toolbar button */ + EUserCreatableItemsHandler *creatable_items_handler; +}; + +/* Properties */ +enum { + PROP_SESSION = 1, + PROP_SOURCE_LIST, + LAST_PROP +}; + +static void set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec); +static void get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec); + +/* Callbacks */ +static void print_cb (BonoboUIComponent *uih, void *user_data, const char *path); +static void delete_cb (BonoboUIComponent *uih, void *user_data, const char *path); +static void stop_cb (BonoboUIComponent *uih, void *user_data, const char *path); +static void edit_properties_cb (BonoboUIComponent *uih, void *user_data, const char *path); +static void cut_cb (BonoboUIComponent *uih, void *user_data, const char *path); +static void copy_cb (BonoboUIComponent *uih, void *user_data, const char *path); +static void paste_cb (BonoboUIComponent *uih, void *user_data, const char *path); +static int get_number_feeds(ESourceList* source_list); + + +#define PARENT_TYPE G_TYPE_OBJECT +static GObjectClass *parent_class = NULL; + +static void feeds_view_add_feed (EUserCreatableItemsHandler *handler, const char *item_type_name, gpointer data); + +static void +init (GObject *object) +{ + /*fprintf(stderr, "feeds-view init()...\n");*/ + FeedsView *view = FEEDS_VIEW (object); + FeedsViewPrivate *priv; + + priv = view->priv = g_new0 (FeedsViewPrivate, 1); + priv->rss_fetchers = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, g_object_unref); + priv->creatable_items_handler = e_user_creatable_items_handler_new ("feeds", feeds_view_add_feed, view); + /*fprintf(stderr, "feeds-view init()...done\n");*/ +} + +static void +dispose (GObject *object) +{ + FeedsView *view = FEEDS_VIEW (object); + FeedsViewPrivate *priv = view->priv; + + while (priv->msgs) { + SoupMessage *msg; + + msg = priv->msgs->data; + priv->msgs = g_slist_remove (priv->msgs, msg); + soup_message_set_status (msg, SOUP_STATUS_CANCELLED); + soup_session_cancel_message (priv->session, msg); + } + + if (priv->session) { + g_object_unref (priv->session); + priv->session = NULL; + } + if (priv->rss_fetchers) { + g_hash_table_destroy (priv->rss_fetchers); + priv->rss_fetchers = NULL; + } + if (priv->source_list) { + g_object_unref (priv->source_list); + priv->source_list = NULL; + } + if (priv->activity_handler) { + g_object_unref (priv->activity_handler); + priv->activity_handler = NULL; + } + + if (priv->sidebar_control) { + bonobo_object_unref (priv->sidebar_control); + priv->sidebar_control = NULL; + } + if (priv->view_control) { + bonobo_object_unref (priv->view_control); + priv->view_control = NULL; + } + if (priv->statusbar_control) { + bonobo_object_unref (priv->statusbar_control); + priv->statusbar_control = NULL; + } + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +finalize (GObject *object) +{ + FeedsView *view = FEEDS_VIEW (object); + + g_free (view->priv); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +class_init (GObjectClass *object_class) +{ + /*fprintf(stderr, "feeds-view class_init()...\n");*/ + parent_class = g_type_class_peek_parent (object_class); + + /* Override some GObject methods */ + object_class->dispose = dispose; + object_class->finalize = finalize; + object_class->set_property = set_property; + object_class->get_property = get_property; + + /* Define our properties */ + g_object_class_install_property ( + object_class, PROP_SESSION, + g_param_spec_object ("session", "Session", + "The SoupSession to use for HTTP", + SOUP_TYPE_SESSION, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property ( + object_class, PROP_SOURCE_LIST, + g_param_spec_object ("source_list", "Source list", + "The ESourceList of blog sourcers", + E_TYPE_SOURCE_LIST, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + /*fprintf(stderr, "feeds-view class_init()...done\n");*/ +} + +E_MAKE_TYPE (feeds_view, "FeedsView", FeedsView, class_init, init, + PARENT_TYPE) + +static void +set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec) +{ + FeedsView *view = FEEDS_VIEW (object); + + switch (prop_id) { + case PROP_SESSION: + view->priv->session = (SoupSession *)g_value_dup_object (value); + break; + case PROP_SOURCE_LIST: + view->priv->source_list = (ESourceList *)g_value_dup_object (value); + break; + default: + break; + } +} + +static void +get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + FeedsView *view = FEEDS_VIEW (object); + + switch (prop_id) { + case PROP_SESSION: + g_value_set_object (value, view->priv->session); + break; + case PROP_SOURCE_LIST: + g_value_set_object (value, view->priv->source_list); + break; + default: + break; + } +} + + +BonoboControl * +feeds_view_peek_sidebar (FeedsView *view) +{ + /*fprintf(stderr,"feeds_view_peek_sidebar\n");*/ + g_return_val_if_fail (FEEDS_IS_VIEW (view), NULL); + + return view->priv->sidebar_control; +} + +BonoboControl * +feeds_view_peek_view (FeedsView *view) +{ + /*fprintf(stderr,"feeds_view_peek_view\n");*/ + g_return_val_if_fail (FEEDS_IS_VIEW (view), NULL); + + return view->priv->view_control; +} + +BonoboControl * +feeds_view_peek_statusbar (FeedsView *view) +{ + /*fprintf(stderr,"feeds_view_peek_statusbar\n");*/ + g_return_val_if_fail (FEEDS_IS_VIEW (view), NULL); + + return view->priv->statusbar_control; +} + + +static void +feeds_view_add_feed (EUserCreatableItemsHandler *handler, + const char *item_type_name, + gpointer user_data) +{ + /*fprintf(stderr,"feeds_view_add_feed()\n");*/ + FeedsView *view = user_data; + FeedsViewPrivate *priv = view->priv; + ESourceGroup *feeds_group; + GtkWidget *window; + + /* What the hell else would it be?! */ + if (strcmp (item_type_name, "feeds") != 0) + return; + + /* Get the first feed in our list */ + feeds_group = e_source_list_peek_groups (priv->source_list)->data; + + g_return_if_fail (feeds_group != NULL); + + window = gtk_widget_get_toplevel (GTK_WIDGET (priv->html)); + ef_feedlist_source_add ((GtkWindow *)window, feeds_group, view); + /* fprintf(stderr, "feeds_view_add_feed...done\n"); */ + +} + +static void +fv_delete_feed_popup_cb (EPopup *ep, EPopupItem *pitem, void *data) +{ + FeedsView *view = data; + FeedsViewPrivate *priv = view->priv; + ESource *selected_source; + ESourceGroup *source_group; + + selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->source_selector)); + if (!selected_source) + return; + + source_group = e_source_peek_group(selected_source); + e_source_group_remove_source(source_group, selected_source); + feeds_view_update_e_info_label(view); +} + +static void +fv_add_feed_popup_cb (EPopup *ep, EPopupItem *pitem, void *data) +{ + FeedsView *view = data; + FeedsViewPrivate *priv = view->priv; + ESource *selected_source; + ESourceGroup *feeds_group; + + selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->source_selector)); + if (!selected_source) + feeds_group = e_source_list_peek_groups (priv->source_list)->data; + else /* TODO: Grab the group that has focus instead! */ + feeds_group = e_source_list_peek_groups (priv->source_list)->data; + + ef_feedlist_source_add (GTK_WINDOW (gtk_widget_get_toplevel(ep->target->widget)), feeds_group, view); + +} + +static void +fv_edit_feed_popup_cb (EPopup *ep, EPopupItem *pitem, void *data) +{ + FeedsView *view = data; + FeedsViewPrivate *priv = view->priv; + ESource *selected_source; + ESourceGroup *source_group; + GtkWidget *window; + + selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->source_selector)); + source_group = e_source_peek_group(selected_source); + g_return_if_fail (source_group != NULL); + + window = gtk_widget_get_toplevel (GTK_WIDGET (priv->html)); + ef_feedlist_source_edit ((GtkWindow *)window, source_group); +} + +static void +feeds_view_edit_feed (BonoboUIComponent *uih, void *user_data, const char *path) +{ + /*fprintf(stderr,"feeds_view_edit_feed()\n");*/ + FeedsView *view = (FeedsView *) user_data; + FeedsViewPrivate *priv = view->priv; + ESourceGroup *feeds_group; + GtkWidget *window; + + /* TODO: Get the selected group instead */ + feeds_group = e_source_list_peek_groups (priv->source_list)->data; + g_return_if_fail (feeds_group != NULL); + + window = gtk_widget_get_toplevel (GTK_WIDGET (priv->html)); + ef_feedlist_source_edit ((GtkWindow *)window, feeds_group); +} + +/* Toolbar Bonobo Controls */ +static BonoboUIVerb verbs [] = { + BONOBO_UI_VERB ("FeedPrint", print_cb), + BONOBO_UI_VERB ("FeedDelete", delete_cb), + BONOBO_UI_VERB ("FeedStop", stop_cb), + BONOBO_UI_VERB ("FeedEdit", feeds_view_edit_feed), + BONOBO_UI_VERB ("FeedsCut", cut_cb), + BONOBO_UI_VERB ("FeedsCopy", copy_cb), + BONOBO_UI_VERB ("FeedsPaste", paste_cb), + + BONOBO_UI_VERB_END +}; + +/* Toolbar Images */ +static EPixmap pixmaps [] = { + + E_PIXMAP ("/Toolbar/FeedPrint", "stock_print", E_ICON_SIZE_MENU), + E_PIXMAP ("/Toolbar/FeedDelete", "stock_delete", E_ICON_SIZE_MENU), + E_PIXMAP ("/Toolbar/FeedStop", "stock_cancel", E_ICON_SIZE_MENU), + E_PIXMAP ("/Toolbar/FeedEdit", "stock_edit", E_ICON_SIZE_MENU), + E_PIXMAP ("/Toolbar/FeedsCopy", "stock_copy", E_ICON_SIZE_MENU), + E_PIXMAP ("/Toolbar/FeedsCut", "stock_cut", E_ICON_SIZE_MENU), + E_PIXMAP ("/Toolbar/FeedsPaste", "stock_paste", E_ICON_SIZE_MENU), + E_PIXMAP_END + +}; + +static EPopupItem efv_source_popups[] = { + { E_POPUP_ITEM, "10.new_feed", N_("_New Feed"), fv_add_feed_popup_cb, NULL, FEEDS_ICONDIR "/feed-icon.png", 0, 0 }, + { E_POPUP_ITEM, "20.delete", N_("_Delete"), fv_delete_feed_popup_cb, NULL, "stock_delete", 0, EF_POPUP_SOURCE_PRIMARY }, + { E_POPUP_ITEM, "30.properties", N_("_Edit..."), fv_edit_feed_popup_cb, NULL, "stock_folder-properties", 0, EF_POPUP_SOURCE_PRIMARY }, +/* TODO: Implement Folders + { E_POPUP_ITEM, "40.new_folder", N_("_New Folder"), fv_add_folder_popup_cb, NULL, FEEDS_ICONDIR "/feed-icon.png", 0, 0 }, + { E_POPUP_ITEM, "40.rename", N_("_Rename"), fv_rename_popup_cb, NULL, FEEDS_ICONDIR "/feed-icon.png", 0, 0 }, +*/ +}; + +static void +efv_source_popup_free(EPopup *ep, GSList *list, void *data) +{ + g_slist_free(list); +} + +static gboolean +popup_event_cb(ESourceSelector *selector, ESource *insource, GdkEventButton *event, FeedsView *component_view) +{ + EFPopup *ep; + EFPopupTargetSource *t; + GSList *menus = NULL; + int i; + GtkMenu *menu; + + /** @HookPoint-ECalPopup: Calendar Source Selector Context Menu + * @Id: org.gnome.evolution.calendar.source.popup + * @Class: org.gnome.evolution.calendar.popup:1.0 + * @Target: ECalPopupTargetSource + * + * The context menu on the source selector in the calendar window. + */ + ep = ef_popup_new("org.gnome.evolution.feeds.source.popup"); + t = ef_popup_target_new_source(ep, selector); + /*t->target.widget = (GtkWidget *)component_view->feeds; */ + + for (i=0;i<sizeof(efv_source_popups)/sizeof(efv_source_popups[0]);i++) + menus = g_slist_prepend(menus, &efv_source_popups[i]); + + e_popup_add_items((EPopup *)ep, menus, NULL, efv_source_popup_free, component_view); + + menu = e_popup_create_menu_once((EPopup *)ep, (EPopupTarget *)t, 0); + gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event?event->button:0, event?event->time:gtk_get_current_event_time()); + + return TRUE; +} + + +/* Callbacks */ +static void +source_selection_changed_cb (ESourceSelector *selector, FeedsView *component_view) +{ +/* update_uris_for_selection (component_view);*/ +} + +static void +primary_source_selection_changed_cb (ESourceSelector *selector, FeedsView *component_view) +{ +/* update_uri_for_primary_selection (component_view);*/ +} + +static void +source_added_cb (/*GnomeCalendar *calendar, EFSourceType source_type,*/ ESource *source, FeedsView *component_view) +{ +/* + switch (source_type) { + case E_CAL_SOURCE_TYPE_EVENT: + e_source_selector_select_source (E_SOURCE_SELECTOR (component_view->source_selector), source); + break; + default: + break; + } +*/ +} + +static void +source_removed_cb (/*GnomeCalendar *calendar, ECalSourceType source_type,*/ ESource *source, FeedsView *component_view) +{ +/* + switch (source_type) { + case E_CAL_SOURCE_TYPE_EVENT: + e_source_selector_unselect_source (E_SOURCE_SELECTOR (component_view->source_selector), source); + break; + default: + break; + } +*/ +} + + +static void +print_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ +/* FeedsView *view = (FeedsView *) user_data;*/ +} + +static void +delete_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ + FeedsView *view = (FeedsView *) user_data; + FeedsViewPrivate *p = view->priv; + ESourceSelector *source_selector = p->source_selector; + ESource *source = e_source_selector_peek_primary_selection (source_selector); + ESourceGroup *source_group = e_source_peek_group(source); + e_source_group_remove_source(source_group, source); + feeds_view_update_e_info_label(view); + +} + +static void +stop_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ +/* FeedsView *view = (FeedsView *) user_data;*/ +} + +static void +edit_properties_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ +/* FeedsView *view = (FeedsView *) user_data;*/ +} + +static void +cut_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ +/* FeedsView *view = (FeedsView *) user_data;*/ +} + +static void +copy_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ +/* FeedsView *view = (FeedsView *) user_data;*/ +} + +static void +paste_cb (BonoboUIComponent *uih, void *user_data, const char *path) +{ +/* FeedsView *view = (FeedsView *) user_data;*/ +} + + +static void +setup_toolbar (FeedsView *view, BonoboUIComponent *uic) +{ + /*fprintf(stderr,"setup_toolbar...");*/ + gchar *xmlfile; + + bonobo_ui_component_add_verb_list_with_data (uic, verbs, view); + +/*TODO: I don't know what this does, but it breaks it... I should look this up. + bonobo_ui_component_freeze (uic, NULL); +*/ + + xmlfile = g_build_filename (EVOLUTION_UIDIR, + "evolution-feeds.xml", + NULL); + bonobo_ui_util_set_ui (uic, PREFIX, xmlfile, + "evolution-feeds", + NULL); + g_free (xmlfile); + /*fprintf(stderr,"finished\n");*/ +} + +static int +get_number_feeds(ESourceList* source_list) +{ + /*fprintf(stderr,"get_number_feeds...");*/ + GSList *groups = e_source_list_peek_groups(source_list); + ESourceGroup *source_group; + guint count = 0; + + while (groups != NULL) { + source_group = groups->data; + /*fprintf(stderr," %s ", e_source_group_peek_name(source_group));*/ + count += g_slist_length(e_source_group_peek_sources(source_group)); + groups = g_slist_next(groups); + } + /*fprintf(stderr,"finished\n");*/ + return count; + +} + +static void +view_activated (BonoboControl *control, gboolean activated, gpointer user_data) +{ + /*fprintf(stderr,"view_activated...");*/ + FeedsView *view = user_data; + FeedsViewPrivate *priv = view->priv; + BonoboUIComponent *uic; + Bonobo_UIContainer container; + + uic = bonobo_control_get_ui_component (control); + + if (activated) { + container = bonobo_control_get_remote_ui_container (control, NULL); + bonobo_ui_component_set_container (uic, container, NULL); + bonobo_object_release_unref (container, NULL); + if (view) + setup_toolbar (view, uic); + + e_pixmaps_update (uic, pixmaps); + + e_user_creatable_items_handler_activate (priv->creatable_items_handler, uic); + } else + bonobo_ui_component_unset_container (uic, NULL); + /*fprintf(stderr,"finished\n");*/ +} + +static void +fetched_data (FeedsRSSFetcher *fetcher, SoupMessage *msg, + FeedsRSS *rss, GError *err, gpointer user_data) +{ + /*fprintf(stderr,"fetched_data\n");*/ + FeedsView *view = user_data; + FeedsViewPrivate *priv = view->priv; + GtkHTMLStream *stream; + char *output; + + e_activity_handler_unset_message (priv->activity_handler); + + if (rss) + output = feeds_rss_to_html (rss); + else { + /* Write out some error text */ + GString *errmsg; + + errmsg = g_string_new ("<html><body><h1>"); + g_string_append (errmsg, _("Error")); + g_string_append (errmsg, "</h1>\n<p>"); + g_string_append_printf (errmsg, _("An error occurred while trying to display %s:"), + feeds_rss_fetcher_url (fetcher)); + g_string_append (errmsg, "</p>\n<pre>"); + feeds_append_to_html (errmsg, err->message); + g_string_append (errmsg, "</pre>\n</body>\n</html>"); + + output = errmsg->str; + g_string_free (errmsg, FALSE); + } + + stream = gtk_html_begin (priv->html); + gtk_html_write (priv->html, stream, output, strlen (output)); + gtk_html_end (priv->html, stream, GTK_HTML_STREAM_OK); + g_free (output); + /*fprintf(stderr,"finished\n");*/ +} +static void +on_key_release_of_source (ESourceSelector *source_selector, GdkEventKey *event, gpointer user_data) +{ + /*fprintf(stderr,"Key release=%d, state=%d, type=%d\n", event->keyval, event->state, event->type);*/ + FeedsView *view = user_data; + if(event->type == GDK_KEY_PRESS) + { + ESource *source; + ESourceGroup *source_group; + + switch (event->keyval) { + case GDK_BackSpace: + case GDK_Delete: + /* TODO: Call delete_cb() instead (we should only have one place + in our code where we do any deleting of feeds. Having two + places just makes the code harder to maintain. + */ + /* For "Delete" Key: Delete this source*/ + /*fprintf(stderr,"Trying to delete source.\n");*/ + source = e_source_selector_peek_primary_selection (source_selector); + source_group = e_source_peek_group(source); + e_source_group_remove_source(source_group, source); + feeds_view_update_e_info_label(view); + break; + case GDK_Up: + /* TODO: select previous source*/ + break; + case GDK_Down: + /* TODO: select next source*/ + break; + case GDK_R: + /* TODO: For "r": refresh*/ + break; + case GDK_Return: + case GDK_space: + /* TODO: For Enter/Space: Bring up source properties dialog*/ + break; + default: /* Do nothing*/ + break; + } + } + + + /*fprintf(stderr,"exit on_key_release_of_source\n.");*/ +} +static void +source_selected (ESourceSelector *source_selector, gpointer user_data) +{ + /*fprintf(stderr,"source_selected...");*/ + FeedsView *view = user_data; + FeedsViewPrivate *priv = view->priv; + FeedsRSSFetcher *rss_fetcher; + ESource *source; + EBook *book; + EContact *contact; + char *uri, *url, *ebook_uri, *uid, *msg; + GError *err = NULL; + + /* "peek" in a function name means we're getting back a + * pointer to one of the source_selector's internal variables, + * so we shouldn't unref it when we're done. + */ + source = e_source_selector_peek_primary_selection (source_selector); + + uri = e_source_get_uri (source); + /*fprintf(stderr,"uri:%s\n",uri);*/ + + if (uri == NULL) + return; + + rss_fetcher = g_hash_table_lookup (priv->rss_fetchers, uri); + if (rss_fetcher) { + g_free (uri); + goto got_fetcher; + } + + /* The uri should look like: + * feeds://SECTION/ebook-uri#contact-uid + * feeds://SECTION/url:http://gnomejournal.org/?rss=1§ion=article + */ + if (strncmp (uri, "feeds://", strlen("feeds://")) != 0) { + g_free (uri); + return; + } + + ebook_uri = uri + sizeof ("feeds://"); + ebook_uri = strchr (ebook_uri, '/'); + if (!ebook_uri) { + g_free (uri); + return; + } + ebook_uri++; + + /* TODO: Fix for url's with "#" in them! */ + /* TODO: This is code incase a blog entry could have a Unique ID for a contact */ + uid = strchr (ebook_uri, '#'); + if (!uid) + { + /* Remove "feeds://SECTION/url:" from the uri */ + url = strstr(uri, "url:"); + if (!url) { + + msg = g_strdup_printf (_("Invalid URI:%s"), uri); + e_activity_handler_set_message (priv->activity_handler, msg); + g_free (msg); + g_free (uri); + return; + } + url = url + strlen("url:"); + /*fprintf(stderr,"url: %s\n", url);*/ + rss_fetcher = feeds_rss_fetcher_new (priv->session, url); + g_hash_table_insert (priv->rss_fetchers, uri, rss_fetcher); + g_signal_connect (rss_fetcher, "fetched_data", + G_CALLBACK (fetched_data), view); + goto got_fetcher; + } + *uid = '\0'; + uid++; + + if (ebook_uri && *ebook_uri) + book = e_book_new (source, NULL); + else + book = e_book_new_system_addressbook (&err); + if (err) { + e_notice (source_selector, GTK_MESSAGE_ERROR, + _("Could not get address book:\n%s"), + err->message); + g_error_free (err); + g_object_unref (book); + return; + } + + e_book_open (book, TRUE, &err); + if (err) { + e_notice (source_selector, GTK_MESSAGE_ERROR, + _("Could not open address book:\n%s"), + err->message); + g_error_free (err); + g_object_unref (book); + return; + } + if (!e_book_get_contact (book, uid, &contact, &err)) { + e_notice (source_selector, GTK_MESSAGE_ERROR, + _("Could not find contact:\n%s"), + err->message); + g_error_free (err); + g_object_unref (book); + return; + } + g_object_unref (book); + + rss_fetcher = feeds_blog_fetcher_new (priv->session, contact); + g_object_unref (contact); + g_hash_table_insert (priv->rss_fetchers, uri, rss_fetcher); + g_signal_connect (rss_fetcher, "fetched_data", + G_CALLBACK (fetched_data), view); + + got_fetcher: + msg = g_strdup_printf (_("Loading %s..."), + feeds_rss_fetcher_url (rss_fetcher)); + e_activity_handler_set_message (priv->activity_handler, msg); + g_free (msg); + feeds_rss_fetcher_fetch (rss_fetcher); + /*fprintf(stderr,"finished\n");*/ +} + + +struct fetch_image_data { + FeedsView *view; + GtkHTML *html; + GtkHTMLStream *handle; +}; + +static void +free_fid (gpointer user_data, GObject *ex_msg) +{ + /*fprintf(stderr,"free_fid...");*/ + struct fetch_image_data *fid = user_data; + + fid->view->priv->msgs = g_slist_remove (fid->view->priv->msgs, ex_msg); + g_free (fid); + /*fprintf(stderr,"done\n");*/ +} + +static void +got_image (SoupMessage *msg, gpointer user_data) +{ + /*fprintf(stderr,"got_image...");*/ + struct fetch_image_data *fid = user_data; + + gtk_html_end (fid->html, fid->handle, + SOUP_STATUS_IS_SUCCESSFUL (msg->status_code) ? + GTK_HTML_STREAM_OK : + GTK_HTML_STREAM_ERROR); + /*fprintf(stderr,"done\n");*/ +} + +static void +got_chunk (SoupMessage *msg, gpointer user_data) +{ + /*fprintf(stderr,"got_chunk");*/ + struct fetch_image_data *fid = user_data; + + gtk_html_write (fid->html, fid->handle, + msg->response.body, msg->response.length); + /*fprintf(stderr,"done\n");*/ +} + +static void +url_requested (GtkHTML *html, const char *url, GtkHTMLStream *handle, + gpointer user_data) +{ + /*fprintf(stderr,"url_requested...");*/ + FeedsView *view = user_data; + FeedsViewPrivate *priv = view->priv; + + if (!strncmp (url, "data:;base64,", 13)) { + GByteArray *image; + + /* This is a "data:" URL (for inline image data + * from the EContact record). Just decode it. + */ + image = feeds_base64_decode (url + 13); + gtk_html_write (html, handle, image->data, image->len); + g_byte_array_free (image, TRUE); + gtk_html_end (html, handle, GTK_HTML_STREAM_OK); + } else if (!strncmp (url, "http", 4)) { + SoupMessage *msg; + struct fetch_image_data *fid; + + /* Queue an async HTTP request */ + msg = soup_message_new ("GET", url); + + fid = g_new0 (struct fetch_image_data, 1); + fid->view = view; + fid->html = html; + fid->handle = handle; + soup_session_queue_message (priv->session, msg, + got_image, fid); + /* Connect to the "got_chunk" signal so we can render + * the images incrementally. + */ + g_signal_connect (msg, "got_chunk", + G_CALLBACK (got_chunk), fid); + + /* Keep track of the message so we can free the data + * when we're done, or cancel it if the view is freed. + */ + g_object_weak_ref (G_OBJECT (msg), free_fid, fid); + priv->msgs = g_slist_prepend (priv->msgs, msg); + } + /*fprintf(stderr,"done.\n");*/ +} + + +static void +link_clicked (GtkHTML *html, const char *url, gpointer user_data) +{ + /*fprintf(stderr,"link_clicked...");*/ + GError *err = NULL; + + gnome_url_show (url, &err); + if (err) { + e_notice (html, GTK_MESSAGE_ERROR, + "%s", err->message); + g_error_free (err); + } + /*fprintf(stderr,"done.\n");*/ +} + +static void +on_url (GtkHTML *html, const char *url, gpointer user_data) +{ + /*fprintf(stderr,"on_url...");*/ + FeedsView *view = user_data; + FeedsViewPrivate *priv = view->priv; + + if (url && *url) + e_activity_handler_set_message (priv->activity_handler, url); + else + e_activity_handler_unset_message (priv->activity_handler); + /*fprintf(stderr,"done.\n");*/ +} + +void feeds_view_update_e_info_label(FeedsView *view) +{ + /*fprintf(stderr,"feeds_view_update_e_info_label...");*/ + FeedsViewPrivate *priv = view->priv; + char buf[6]; + sprintf(buf, "%d", get_number_feeds(priv->source_list)); + gchar *message; + message = g_strconcat(buf, " feeds", NULL); + e_info_label_set_info (view->info_label, _("Feeds"), message); + g_free(message); + /*fprintf(stderr,"done.\n");*/ +} + +FeedsView * +feeds_view_new (SoupSession *session, ESourceList *source_list) +{ + /*fprintf(stderr,"feeds_view_new...\n");*/ + FeedsView *view; + FeedsViewPrivate *priv; + GtkWidget *scrolled, *source_selector, *vbox, *selector_scrolled_window; + GtkWidget *widget; + + view = g_object_new (FEEDS_TYPE_VIEW, + "session", session, + "source_list", source_list, + NULL); + priv = view->priv; + + /* Our sidebar is an EInfoLabel followed by an ESourceSelector + * stuffed inside of a vbox */ + /* TODO: There is no "feed-icon" recognized by gnome */ + /* TODO: Clean this mess up */ + view->info_label = (EInfoLabel *)e_info_label_new(FEEDS_ICONDIR "/feed-icon.png"); + feeds_view_update_e_info_label(view); +/* +TODO: The SOURCE_SELECTOR is not ment for nested data + it can not handle nested data. This has to replaced by + something that can handle a tree like setup!!! +*/ + source_selector = e_source_selector_new (priv->source_list); + priv->source_selector = E_SOURCE_SELECTOR (source_selector); + e_source_selector_show_selection (priv->source_selector, FALSE); + selector_scrolled_window = gtk_scrolled_window_new (NULL, NULL); + gtk_container_add (GTK_CONTAINER (selector_scrolled_window), source_selector); + +/* Work in progress: + GtkWidget *feedlist = gtk_tree_view_new (); + GtkWidget *scrolledwindow = gtk_scrolled_window_new (NULL, NULL); + gtk_container_add (GTK_CONTAINER (scrolledwindow), feedlist); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (feedlist), FALSE); + gtk_tree_view_set_reorderable (GTK_TREE_VIEW (feedlist), TRUE); +*/ + + gtk_scrolled_window_set_policy ( + GTK_SCROLLED_WINDOW (selector_scrolled_window), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type ( + GTK_SCROLLED_WINDOW (selector_scrolled_window), + GTK_SHADOW_IN); +/* + gtk_scrolled_window_set_policy ( + GTK_SCROLLED_WINDOW (scrolledwindow), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type ( + GTK_SCROLLED_WINDOW (scrolledwindow), + GTK_SHADOW_IN); +*/ + vbox = gtk_vbox_new(FALSE,0); + gtk_box_pack_start(GTK_BOX (vbox), GTK_WIDGET (view->info_label), + FALSE, TRUE, 0); + gtk_box_pack_start(GTK_BOX (vbox), selector_scrolled_window, TRUE, + TRUE, 0); +/* + gtk_box_pack_start(GTK_BOX (vbox), scrolledwindow, TRUE, + TRUE, 0); +*/ + gtk_widget_show (GTK_WIDGET (view->info_label)); + gtk_widget_show (source_selector); + gtk_widget_show (selector_scrolled_window); +/* + gtk_widget_show (scrolledwindow); + gtk_widget_show (feedlist); +*/ + gtk_widget_show (vbox); + + /* Connect to its signal */ + g_signal_connect (priv->source_selector, "primary_selection_changed", + G_CALLBACK (source_selected), view); + g_signal_connect (priv->source_selector, "popup_event", + G_CALLBACK (popup_event_cb), view); + g_signal_connect (priv->source_selector, "key-press-event", + G_CALLBACK (on_key_release_of_source), view); + + /* Now, create a BonoboControl wrapper for the sidebar. + * BonoboControl is a class that implements the Bonobo::Control + * CORBA interface for a widget. + */ + priv->sidebar_control = bonobo_control_new (vbox); + + /* Now for the view, a GtkHTML */ + /* TODO: Create a Search Bar */ + scrolled = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_ALWAYS); + gtk_widget_show (scrolled); + widget = gtk_html_new (); + gtk_widget_show (widget); + gtk_container_add (GTK_CONTAINER (scrolled), widget); + priv->html = GTK_HTML (widget); + g_signal_connect (priv->html, "url_requested", + G_CALLBACK (url_requested), view); + g_signal_connect (priv->html, "link_clicked", + G_CALLBACK (link_clicked), view); + g_signal_connect (priv->html, "on_url", + G_CALLBACK (on_url), view); + priv->view_control = bonobo_control_new (scrolled); + + /* Connect to the view control's "activate" signal so we know + * when it is activated and deactivated. + */ + g_signal_connect (priv->view_control, "activate", + G_CALLBACK (view_activated), view); + + priv->activity_handler = e_activity_handler_new (); + widget = e_task_bar_new (); + gtk_widget_show (widget); + priv->task_bar = E_TASK_BAR (widget); + e_activity_handler_attach_task_bar (priv->activity_handler, + priv->task_bar); + priv->statusbar_control = bonobo_control_new (widget); + + /*fprintf(stderr,"feeds_view_new...finished\n");*/ + return view; +} + diff -Npru evolution-cvs/feeds/feeds-view.h evolution/feeds/feeds-view.h --- evolution-cvs/feeds/feeds-view.h 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feeds-view.h 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,58 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* Copyright (C) 2004 Novell, Inc. */ + +#ifndef __FEEDS_VIEW_H__ +#define __FEEDS_VIEW_H__ + +/* This header is mostly GObject-related boilerplate. See + * feeds-rss-fetcher.h for more information. + */ + +#include <bonobo/bonobo-control.h> +#include <libedataserver/e-source-list.h> +#include <libsoup/soup-session.h> +#include <widgets/misc/e-info-label.h> + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +#define FEEDS_TYPE_VIEW (feeds_view_get_type ()) +#define FEEDS_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FEEDS_TYPE_VIEW, FeedsView)) +#define FEEDS_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FEEDS_TYPE_VIEW, FeedsViewClass)) +#define FEEDS_IS_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FEEDS_TYPE_VIEW)) +#define FEEDS_IS_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FEEDS_TYPE_VIEW)) + +typedef struct FeedsView FeedsView; +typedef struct FeedsViewPrivate FeedsViewPrivate; +typedef struct FeedsViewClass FeedsViewClass; + +struct FeedsView { + GObject parent; + EInfoLabel *info_label; + + FeedsViewPrivate *priv; +}; + +struct FeedsViewClass { + GObjectClass parent_class; + +}; + +GType feeds_view_get_type (void); + +FeedsView *feeds_view_new (SoupSession *session, + ESourceList *source_list); + +BonoboControl *feeds_view_peek_sidebar (FeedsView *view); +BonoboControl *feeds_view_peek_view (FeedsView *view); +BonoboControl *feeds_view_peek_statusbar (FeedsView *view); + +void feeds_view_update_e_info_label(FeedsView *view); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __FEEDS_VIEW_H__ */ diff -Npru evolution-cvs/feeds/feeds.glade evolution/feeds/feeds.glade --- evolution-cvs/feeds/feeds.glade 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feeds.glade 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,7583 @@ +<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> +<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> + +<glade-interface> +<requires lib="gnome"/> + +<widget class="GtkWindow" id="mainwindow"> + <property name="visible">True</property> + <property name="title" translatable="yes">Liferea</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="default_width">640</property> + <property name="default_height">480</property> + <property name="resizable">True</property> + <property name="destroy_with_parent">False</property> + <property name="icon">liferea.png</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <signal name="delete_event" handler="on_close" last_modification_time="Tue, 15 Jun 2004 04:16:40 GMT"/> + <signal name="window_state_event" handler="on_mainwindow_window_state_event" last_modification_time="Tue, 20 Jul 2004 05:12:24 GMT"/> + <signal name="key_press_event" handler="on_mainwindow_key_press_event" last_modification_time="Fri, 26 Nov 2004 23:21:47 GMT"/> + + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkMenuBar" id="menubar"> + <property name="visible">True</property> + + <child> + <widget class="GtkMenuItem" id="menuitem1"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Program</property> + <property name="use_underline">True</property> + + <child> + <widget class="GtkMenu" id="menuitem1_menu"> + + <child> + <widget class="GtkImageMenuItem" id="preferences1"> + <property name="visible">True</property> + <property name="label">gtk-preferences</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_prefbtn_clicked" last_modification_time="Wed, 05 Nov 2003 19:41:37 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkSeparatorMenuItem" id="separator4"> + <property name="visible">True</property> + </widget> + </child> + + <child> + <widget class="GtkCheckMenuItem" id="work_offline"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">This option allows you to disable subscription updating.</property> + <property name="label" translatable="yes">_Work Offline</property> + <property name="use_underline">True</property> + <property name="active">False</property> + <signal name="activate" handler="on_work_offline_activate" last_modification_time="Thu, 06 May 2004 23:49:06 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkSeparatorMenuItem" id="trennlinie4"> + <property name="visible">True</property> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="quit1"> + <property name="visible">True</property> + <property name="label">gtk-quit</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_quit" last_modification_time="Wed, 05 Nov 2003 19:46:05 GMT"/> + </widget> + </child> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="menuitem2"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Feeds</property> + <property name="use_underline">True</property> + + <child> + <widget class="GtkMenu" id="menuitem2_menu"> + + <child> + <widget class="GtkImageMenuItem" id="feed_update"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Updates the selected subscription or all subscriptions of the selected folder.</property> + <property name="label" translatable="yes">Update _Selected</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_menu_update" last_modification_time="Fri, 07 May 2004 03:06:50 GMT"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2931"> + <property name="visible">True</property> + <property name="stock">gtk-refresh</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="update_all_feeds"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Updates all subscriptions. This does not update OCS directories.</property> + <property name="label" translatable="yes">Update _All</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_refreshbtn_clicked" last_modification_time="Sat, 08 Nov 2003 17:55:36 GMT"/> + <accelerator key="a" modifiers="GDK_CONTROL_MASK" signal="activate"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2932"> + <property name="visible">True</property> + <property name="stock">gtk-refresh</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="mark_all_as_read1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Marks all items of the selected subscription or of all subscriptions of the selected folder as read.</property> + <property name="label" translatable="yes">_Mark Selected As Read</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_popup_allunread_selected" last_modification_time="Thu, 06 Nov 2003 00:16:50 GMT"/> + <accelerator key="r" modifiers="GDK_CONTROL_MASK" signal="activate"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2933"> + <property name="visible">True</property> + <property name="stock">gtk-apply</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="mark_all_as_read2"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Marks read every item of every subscription.</property> + <property name="label" translatable="yes">Mark All As _Read</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_popup_allfeedsunread_selected" last_modification_time="Sat, 15 Jan 2005 19:13:59 GMT"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2934"> + <property name="visible">True</property> + <property name="stock">gtk-apply</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkSeparatorMenuItem" id="trennlinie2"> + <property name="visible">True</property> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="feed_new"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Add a subscription to the feed list.</property> + <property name="label" translatable="yes">_New Subscription...</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_menu_feed_new" last_modification_time="Fri, 07 May 2004 03:06:50 GMT"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2935"> + <property name="visible">True</property> + <property name="stock">gtk-add</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="folder_new"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Add a folder to the feed list.</property> + <property name="label" translatable="yes">New _Folder...</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_menu_folder_new" last_modification_time="Tue, 27 Apr 2004 22:52:15 GMT"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2936"> + <property name="visible">True</property> + <property name="stock">gtk-new</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="new_vfolder"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Add a new VFolder to the feed list.</property> + <property name="label" translatable="yes">New _VFolder...</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_new_vfolder_activate" last_modification_time="Mon, 21 Mar 2005 01:29:08 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkSeparatorMenuItem" id="separator6"> + <property name="visible">True</property> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="properties"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Opens the property dialog for the selected subscription.</property> + <property name="label" translatable="yes">_Properties...</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_menu_properties" last_modification_time="Fri, 07 May 2004 03:06:50 GMT"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2937"> + <property name="visible">True</property> + <property name="stock">gtk-properties</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="delete_selected"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Removes the selected subscription.</property> + <property name="label" translatable="yes">_Delete Selected</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_menu_delete" last_modification_time="Fri, 07 May 2004 03:06:50 GMT"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2938"> + <property name="visible">True</property> + <property name="stock">gtk-delete</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkSeparatorMenuItem" id="separator7"> + <property name="visible">True</property> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="import_feed_list1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Imports an OPML feed list.</property> + <property name="label" translatable="yes">_Import Feed List...</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_import_activate" last_modification_time="Wed, 12 Nov 2003 21:49:11 GMT"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2939"> + <property name="visible">True</property> + <property name="stock">gtk-open</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="export_feed_list1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Exports the feed list as OPML.</property> + <property name="label" translatable="yes">_Export Feed List...</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_export_activate" last_modification_time="Wed, 12 Nov 2003 21:49:11 GMT"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2940"> + <property name="visible">True</property> + <property name="stock">gtk-save-as</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="items1"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Items</property> + <property name="use_underline">True</property> + + <child> + <widget class="GtkMenu" id="items1_menu"> + + <child> + <widget class="GtkImageMenuItem" id="next_unread_item1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Jumps to the next unread item. If necessary selects the next feed with unread items.</property> + <property name="label" translatable="yes">_Next Unread Item</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_next_unread_item_activate" last_modification_time="Sat, 08 Nov 2003 19:48:55 GMT"/> + <accelerator key="n" modifiers="GDK_CONTROL_MASK" signal="activate"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2941"> + <property name="visible">True</property> + <property name="stock">gtk-media-forward</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkSeparatorMenuItem" id="trennlinie5"> + <property name="visible">True</property> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="toggle_unread_status1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Toggles the read status of the selected item.</property> + <property name="label" translatable="yes">Toggle _Read Status</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_toggle_unread_status" last_modification_time="Fri, 27 Aug 2004 22:44:08 GMT"/> + <accelerator key="u" modifiers="GDK_CONTROL_MASK" signal="activate"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2942"> + <property name="visible">True</property> + <property name="stock">gtk-apply</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="toggle_item_flag1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Toggles the flag status of the selected item.</property> + <property name="label" translatable="yes">Toggle Item _Flag</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_toggle_item_flag" last_modification_time="Thu, 06 Nov 2003 00:21:45 GMT"/> + <accelerator key="t" modifiers="GDK_CONTROL_MASK" signal="activate"/> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="remove_item"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Removes the selected item.</property> + <property name="label" translatable="yes">Remove _Selected</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_remove_item_activate" last_modification_time="Fri, 20 Aug 2004 20:07:45 GMT"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2943"> + <property name="visible">True</property> + <property name="stock">gtk-delete</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="remove_items"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Removes all items of the currently selected feed.</property> + <property name="label" translatable="yes">Remove _All</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_remove_items_activate" last_modification_time="Sun, 21 Dec 2003 23:42:23 GMT"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2944"> + <property name="visible">True</property> + <property name="stock">gtk-delete</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkSeparatorMenuItem" id="separator3"> + <property name="visible">True</property> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="launch_in_browser1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Launches the item's link in the configured browser.</property> + <property name="label" translatable="yes">_Launch In Browser</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_popup_launchitem_selected" last_modification_time="Thu, 06 Nov 2003 00:17:05 GMT"/> + </widget> + </child> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="menuitem3"> + <property name="visible">True</property> + <property name="label" translatable="yes">_View</property> + <property name="use_underline">True</property> + + <child> + <widget class="GtkMenu" id="menuitem3_menu"> + + <child> + <widget class="GtkImageMenuItem" id="zoom_in1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Increases the text size of the item view.</property> + <property name="label" translatable="yes">_Increase Text Size</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_popup_zoomin_selected" last_modification_time="Sun, 01 Feb 2004 14:49:35 GMT"/> + <accelerator key="plus" modifiers="GDK_CONTROL_MASK" signal="activate"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2945"> + <property name="visible">True</property> + <property name="stock">gtk-zoom-in</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="zoom_out1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Decreases the text size of the item view.</property> + <property name="label" translatable="yes">_Decrease Text Size</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_popup_zoomout_selected" last_modification_time="Sun, 01 Feb 2004 14:49:18 GMT"/> + <accelerator key="minus" modifiers="GDK_CONTROL_MASK" signal="activate"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2946"> + <property name="visible">True</property> + <property name="stock">gtk-zoom-out</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkSeparatorMenuItem" id="trennlinie3"> + <property name="visible">True</property> + </widget> + </child> + + <child> + <widget class="GtkCheckMenuItem" id="toggle_condensed_view"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Toggles the item list mode between condensed and normal mode.</property> + <property name="label" translatable="yes">Toggle _Condensed View</property> + <property name="use_underline">True</property> + <property name="active">False</property> + <signal name="activate" handler="on_toggle_condensed_view_activate" last_modification_time="Sun, 01 Feb 2004 17:00:22 GMT"/> + </widget> + </child> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="search1"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Search</property> + <property name="use_underline">True</property> + + <child> + <widget class="GtkMenu" id="search1_menu"> + + <child> + <widget class="GtkImageMenuItem" id="toggle_search_box1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Shows or hides the search box.</property> + <property name="label" translatable="yes">Search All Feeds</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_searchbtn_clicked" last_modification_time="Sat, 22 Nov 2003 21:55:57 GMT"/> + <accelerator key="f" modifiers="GDK_CONTROL_MASK" signal="activate"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2947"> + <property name="visible">True</property> + <property name="stock">gtk-find</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="search_with_feedster1"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Creates a Feedster search feed.</property> + <property name="label" translatable="yes">Search With _Feedster...</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_search_with_feedster_activate" last_modification_time="Sat, 22 Nov 2003 21:57:57 GMT"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2948"> + <property name="visible">True</property> + <property name="stock">gtk-find</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="help"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Help</property> + <property name="use_underline">True</property> + + <child> + <widget class="GtkMenu" id="help_menu"> + + <child> + <widget class="GtkImageMenuItem" id="topics"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">View help for this application.</property> + <property name="label" translatable="yes">_Contents</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_topics_activate" last_modification_time="Thu, 04 Aug 2005 19:48:21 GMT"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2949"> + <property name="visible">True</property> + <property name="stock">gtk-help</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="quick_reference"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">View a list of all Liferea shortcuts.</property> + <property name="label" translatable="yes">_Quick Reference</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_quick_reference_activate" last_modification_time="Thu, 04 Aug 2005 19:50:04 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="faq"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">View the FAQ for this application.</property> + <property name="label" translatable="yes">_FAQ</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_faq_activate" last_modification_time="Fri, 18 Nov 2005 00:00:28 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkSeparatorMenuItem" id="trennlinie6"> + <property name="visible">True</property> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="about"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Shows an about dialog.</property> + <property name="label" translatable="yes">_About</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_about_activate" last_modification_time="Wed, 18 Feb 2004 20:51:20 GMT"/> + + <child internal-child="image"> + <widget class="GtkImage" id="image2950"> + <property name="visible">True</property> + <property name="stock">gtk-about</property> + <property name="icon_size">1</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + </child> + </widget> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkToolbar" id="toolbar"> + <property name="visible">True</property> + <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property> + <property name="toolbar_style">GTK_TOOLBAR_TEXT</property> + <property name="tooltips">True</property> + <property name="show_arrow">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHPaned" id="leftpane"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="position">170</property> + + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="shadow_type">GTK_SHADOW_IN</property> + <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + + <child> + <widget class="GtkTreeView" id="feedlist"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="has_focus">True</property> + <property name="headers_visible">False</property> + <property name="rules_hint">False</property> + <property name="reorderable">True</property> + <property name="enable_search">True</property> + <signal name="button_press_event" handler="on_mainfeedlist_button_press_event" last_modification_time="Wed, 06 Aug 2003 23:10:51 GMT"/> + <signal name="drag_end" handler="on_feedlist_drag_end" last_modification_time="Sun, 11 Apr 2004 18:05:05 GMT"/> + </widget> + </child> + </widget> + <packing> + <property name="shrink">True</property> + <property name="resize">False</property> + </packing> + </child> + + <child> + <widget class="GtkNotebook" id="browsertabs"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="show_tabs">True</property> + <property name="show_border">False</property> + <property name="tab_pos">GTK_POS_TOP</property> + <property name="scrollable">False</property> + <property name="enable_popup">False</property> + + <child> + <widget class="GtkVBox" id="vbox18"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkNotebook" id="itemtabs"> + <property name="visible">True</property> + <property name="show_tabs">False</property> + <property name="show_border">False</property> + <property name="tab_pos">GTK_POS_TOP</property> + <property name="scrollable">False</property> + <property name="enable_popup">False</property> + + <child> + <widget class="GtkVPaned" id="rightpane"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="position">200</property> + + <child> + <widget class="GtkScrolledWindow" id="ilscrolledwindow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">GTK_POLICY_NEVER</property> + <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="shadow_type">GTK_SHADOW_IN</property> + <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + + <child> + <widget class="GtkTreeView" id="Itemlist"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="headers_visible">True</property> + <property name="rules_hint">True</property> + <property name="reorderable">False</property> + <property name="enable_search">True</property> + <signal name="button_press_event" handler="on_itemlist_button_press_event" last_modification_time="Sun, 14 Sep 2003 13:05:21 GMT"/> + <signal name="row_activated" handler="on_Itemlist_row_activated" last_modification_time="Sun, 21 Sep 2003 12:37:35 GMT"/> + </widget> + </child> + </widget> + <packing> + <property name="shrink">True</property> + <property name="resize">False</property> + </packing> + </child> + + <child> + <widget class="GtkViewport" id="viewportThreePaneHtml"> + <property name="visible">True</property> + <property name="shadow_type">GTK_SHADOW_IN</property> + + <child> + <placeholder/> + </child> + </widget> + <packing> + <property name="shrink">True</property> + <property name="resize">True</property> + </packing> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label30"> + <property name="visible">True</property> + <property name="label" translatable="yes">single item view</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + + <child> + <widget class="GtkViewport" id="viewportTwoPaneHtml"> + <property name="visible">True</property> + <property name="shadow_type">GTK_SHADOW_IN</property> + + <child> + <placeholder/> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label133"> + <property name="visible">True</property> + <property name="label" translatable="yes">label133</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label162"> + <property name="visible">True</property> + <property name="label" translatable="yes">Headlines</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + </widget> + <packing> + <property name="shrink">True</property> + <property name="resize">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox30"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkButton" id="onlinebtn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NONE</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_onlinebtn_clicked" last_modification_time="Thu, 06 May 2004 21:46:58 GMT"/> + + <child> + <widget class="GtkImage" id="onlineimage"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkStatusbar" id="statusbar"> + <property name="visible">True</property> + <property name="has_resize_grip">False</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> +</widget> + +<widget class="GtkDialog" id="propdialog"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="title" translatable="yes">Subscription Properties</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_CENTER</property> + <property name="modal">False</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="has_separator">False</property> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox13"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area13"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="prop_cancel"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-6</property> + </widget> + </child> + + <child> + <widget class="GtkButton" id="prop_ok"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-ok</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-5</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkNotebook" id="notebook3"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="show_tabs">True</property> + <property name="show_border">True</property> + <property name="tab_pos">GTK_POS_TOP</property> + <property name="scrollable">False</property> + <property name="enable_popup">False</property> + + <child> + <widget class="GtkVBox" id="vbox233"> + <property name="border_width">12</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">18</property> + + <child> + <widget class="GtkVBox" id="vbox234"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label69"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">Feed Name</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment30"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkHBox" id="hbox35"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="label85"> + <property name="visible">True</property> + <property name="label" translatable="yes">Feed _Name:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">feedNameEntry</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="feedNameEntry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox236"> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label73"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">Update Interval</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment31"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkVBox" id="vbox237"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkRadioButton" id="updateIntervalDefault"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Use global default update interval.</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox70"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkRadioButton" id="updateIntervalSpecific"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Feed specific update interval of</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">updateIntervalDefault</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox71"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkSpinButton" id="refreshIntervalSpinButton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="climb_rate">1</property> + <property name="digits">0</property> + <property name="numeric">False</property> + <property name="update_policy">GTK_UPDATE_ALWAYS</property> + <property name="snap_to_ticks">False</property> + <property name="wrap">False</property> + <property name="adjustment">0 0 10000 1 60 60</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label77"> + <property name="visible">True</property> + <property name="label" translatable="yes">minutes.</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkRadioButton" id="updateIntervalNever"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Don't update this feed automatically.</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">updateIntervalDefault</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label161"> + <property name="visible">True</property> + <property name="label" translatable="yes"> </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="feedUpdateInfo"> + <property name="width_request">339</property> + <property name="visible">True</property> + <property name="label" translatable="yes">This feed provider suggests an update interval of %d minutes.</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label66"> + <property name="visible">True</property> + <property name="label" translatable="yes">General</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2589"> + <property name="border_width">12</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">18</property> + + <child> + <widget class="GtkVBox" id="vbox2621"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label167"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Feed Source</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment32"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkVBox" id="vbox2619"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkTable" id="table7"> + <property name="visible">True</property> + <property name="n_rows">2</property> + <property name="n_columns">2</property> + <property name="homogeneous">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + + <child> + <widget class="GtkEntry" id="sourceEntry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">False</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label171"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Source:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">sourceEntry</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label170"> + <property name="visible">True</property> + <property name="label" translatable="yes">Source Type:</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2622"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkHBox" id="hbox92233"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkRadioButton" id="feed_loc_contact"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Contact</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label227"> + <property name="visible">True</property> + <property name="label" translatable="yes"> </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="selectSourceContactButton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Select Contact...</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkRadioButton" id="feed_loc_url"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_URL</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">feed_loc_contact</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkRadioButton" id="feed_loc_command"> + <property name="can_focus">True</property> + <property name="label" translatable="yes">C_ommand</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">feed_loc_contact</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox92234"> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkRadioButton" id="feed_loc_file"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Local File</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">feed_loc_contact</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label228"> + <property name="visible">True</property> + <property name="label" translatable="yes"> </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="selectSourceFileButton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Select File...</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2620"> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkCheckButton" id="filterCheckbox"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Use conversion _filter</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="innerfiltervbox"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkVBox" id="vbox2592"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label174"> + <property name="visible">True</property> + <property name="label" translatable="yes">Liferea can use external filter plugins in order to access feeds and directories in non-supported formats. See the documentation for more information.</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="filterbox"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="label176"> + <property name="visible">True</property> + <property name="label" translatable="yes">Convert _using:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">filterEntry</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox92231"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkEntry" id="filterEntry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">False</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="filterSelectFile"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Select File...</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label67"> + <property name="visible">True</property> + <property name="label" translatable="yes">Feed Source</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox240"> + <property name="border_width">12</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label83"> + <property name="width_request">347</property> + <property name="visible">True</property> + <property name="label" translatable="yes">The cache setting controls if the contents of feeds are saved when Liferea exits. Marked items are always saved to the cache.</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkRadioButton" id="feedCacheDefault"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Default cache settings</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkRadioButton" id="feedCacheDisable"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Di_sable cache</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">feedCacheDefault</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkRadioButton" id="feedCacheUnlimited"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Unlimited cache</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">feedCacheDefault</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox34"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkRadioButton" id="feedCacheLimited"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Limit cache to</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">feedCacheDefault</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkSpinButton" id="cacheItemLimit"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="climb_rate">1</property> + <property name="digits">0</property> + <property name="numeric">True</property> + <property name="update_policy">GTK_UPDATE_ALWAYS</property> + <property name="snap_to_ticks">True</property> + <property name="wrap">False</property> + <property name="adjustment">0 0 10000 1 10 1</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label84"> + <property name="visible">True</property> + <property name="label" translatable="yes">items.</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label68"> + <property name="label" translatable="yes">Feed Cache</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox242"> + <property name="border_width">12</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkCheckButton" id="HTTPauthCheck"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Use HTTP _authentication</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment34"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkTable" id="table4"> + <property name="visible">True</property> + <property name="n_rows">2</property> + <property name="n_columns">2</property> + <property name="homogeneous">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + + <child> + <widget class="GtkLabel" id="label93"> + <property name="visible">True</property> + <property name="label" translatable="yes">User_name:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">usernameEntry</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label94"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Password:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">passwordEntry</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="usernameEntry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">False</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="passwordEntry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">False</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">False</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label131"> + <property name="label" translatable="yes">Authentication</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2615"> + <property name="border_width">12</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">18</property> + + <child> + <widget class="GtkCheckButton" id="enclosureDownloadCheck"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Automatically download all enclosures of this feed.</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="enctablabel"> + <property name="label" translatable="yes">Enclosures</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +<widget class="GtkDialog" id="newdialog"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="title" translatable="yes">New Subscription</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_CENTER</property> + <property name="modal">True</property> + <property name="default_width">400</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="has_separator">False</property> + <signal name="delete_event" handler="gtk_widget_hide" object="newdialog" last_modification_time="Sun, 14 Sep 2003 18:53:43 GMT"/> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox2"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area2"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="cancelbtn"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-6</property> + </widget> + </child> + + <child> + <widget class="GtkButton" id="newfeedbtn"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-ok</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-5</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox9"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkVBox" id="vbox16"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label101"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Feed Source</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox43"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkLabel" id="label102"> + <property name="visible">True</property> + <property name="label" translatable="yes"> </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkTable" id="table5"> + <property name="visible">True</property> + <property name="n_rows">2</property> + <property name="n_columns">2</property> + <property name="homogeneous">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + + <child> + <widget class="GtkEntry" id="sourceEntry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">False</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label104"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Source:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">sourceEntry</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox244"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkHBox" id="hbox92232"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkRadioButton" id="feed_loc_contact"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Contact</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label226"> + <property name="visible">True</property> + <property name="label" translatable="yes"> </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="selectSourceContactButton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Select Contact...</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkRadioButton" id="feed_loc_url"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_URL</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">True</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">feed_loc_contact</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkRadioButton" id="feed_loc_command"> + <property name="can_focus">True</property> + <property name="label" translatable="yes">C_ommand</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">feed_loc_contact</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox73"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkRadioButton" id="feed_loc_file"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Local File</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">feed_loc_contact</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label165"> + <property name="visible">True</property> + <property name="label" translatable="yes"> </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="selectSourceFileButton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Select File...</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label103"> + <property name="visible">True</property> + <property name="label" translatable="yes">Source Type:</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="outerfiltervbox"> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkHBox" id="hbox74"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkLabel" id="label166"> + <property name="visible">True</property> + <property name="label" translatable="yes"> </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkCheckButton" id="filterCheckbox"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Use conversion _filter</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="innerfiltervbox"> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkLabel" id="label110"> + <property name="visible">True</property> + <property name="label" translatable="yes"> </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox246"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label111"> + <property name="visible">True</property> + <property name="label" translatable="yes">Liferea can use external filter plugins in order to access feeds and directories in non-supported formats. See the documentation for more information.</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="filterbox"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label112"> + <property name="visible">True</property> + <property name="label" translatable="yes"> </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label113"> + <property name="visible">True</property> + <property name="label" translatable="yes">Convert _using:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">filterEntry</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="filterEntry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">False</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="filterSelectFile"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Select File...</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +<widget class="GtkDialog" id="prefdialog"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="title" translatable="yes">Liferea Preferences</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_CENTER</property> + <property name="modal">False</property> + <property name="default_width">300</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="has_separator">False</property> + <signal name="delete_event" handler="gtk_widget_destroy" object="prefdialog" last_modification_time="Sun, 16 Jan 2005 17:06:19 GMT"/> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox5"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area5"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="prefclosebtn"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-close</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-7</property> + <signal name="clicked" handler="gtk_widget_hide" object="prefdialog" last_modification_time="Wed, 06 Aug 2003 19:38:42 GMT"/> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkNotebook" id="notebook1"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="show_tabs">True</property> + <property name="show_border">True</property> + <property name="tab_pos">GTK_POS_TOP</property> + <property name="scrollable">False</property> + <property name="enable_popup">False</property> + + <child> + <widget class="GtkVBox" id="vbox3"> + <property name="border_width">12</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">18</property> + + <child> + <widget class="GtkVBox" id="vbox250"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label122"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">Feed Cache Handling</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment21"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkHBox" id="hbox19"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="label33"> + <property name="visible">True</property> + <property name="label" translatable="yes">Default _number of items per feed to save:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">itemCountBtn</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkSpinButton" id="itemCountBtn"> + <property name="width_request">60</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="climb_rate">1</property> + <property name="digits">0</property> + <property name="numeric">True</property> + <property name="update_policy">GTK_UPDATE_ALWAYS</property> + <property name="snap_to_ticks">False</property> + <property name="wrap">False</property> + <property name="adjustment">1 0 1000000 1 10 10</property> + <signal name="value_changed" handler="on_itemCountBtn_value_changed" last_modification_time="Wed, 07 Jan 2004 18:25:18 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2585"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label156"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">Feed Update Settings</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment22"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkVBox" id="vbox2586"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkHBox" id="hbox68"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="label159"> + <property name="visible">True</property> + <property name="label" translatable="yes">Default Feed Refresh _Interval:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">refreshIntervalSpinButton</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox92230"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkSpinButton" id="refreshIntervalSpinButton"> + <property name="width_request">60</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="climb_rate">1</property> + <property name="digits">0</property> + <property name="numeric">False</property> + <property name="update_policy">GTK_UPDATE_ALWAYS</property> + <property name="snap_to_ticks">False</property> + <property name="wrap">False</property> + <property name="adjustment">1 0 10000 1 60 60</property> + <signal name="value_changed" handler="on_default_update_interval_value_changed" last_modification_time="Sat, 23 Oct 2004 16:32:03 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label160"> + <property name="visible">True</property> + <property name="label" translatable="yes">minutes.</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label135"> + <property name="visible">True</property> + <property name="label" translatable="yes">Note: <i>Please remember to set a reasonable refresh time. It is not desired to poll daily updated feeds every 15 minutes. To disable auto-updating per default set the interval to 0 minutes.</i></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox57"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="label142"> + <property name="visible">True</property> + <property name="label" translatable="yes">At _startup:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">startupfeedhandler</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkOptionMenu" id="startupfeedhandler"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="history">-1</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2579"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label147"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">Feed Loading Settings</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment23"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkVBox" id="vbox2580"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkRadioButton" id="feedsinmemorybtn1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Optimize for reduced _memory usage.</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">True</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <signal name="clicked" handler="on_feedsinmemorybtn_clicked" last_modification_time="Sun, 08 Aug 2004 16:24:49 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkRadioButton" id="feedsinmemorybtn2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Optimize for _speed.</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">feedsinmemorybtn1</property> + <signal name="clicked" handler="on_feedsinmemorybtn_clicked" last_modification_time="Sun, 08 Aug 2004 16:25:02 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label38"> + <property name="visible">True</property> + <property name="label" translatable="yes">Feeds</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2593"> + <property name="border_width">12</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">18</property> + + <child> + <widget class="GtkVBox" id="vbox2594"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label181"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">Folder Display Settings</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment24"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkVBox" id="vbox2604"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkCheckButton" id="folderdisplaybtn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Show the items of all child feeds when a folder is selected.</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_folderdisplaybtn_toggled" last_modification_time="Fri, 03 Dec 2004 00:01:43 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label193"> + <property name="visible">True</property> + <property name="label" translatable="yes"><i>This option can cause significant delays when loading folders containing many feeds.</i></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">24</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkCheckButton" id="hidereadbtn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Hide read items.</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_folderhidereadbtn_toggled" last_modification_time="Wed, 26 Oct 2005 18:22:27 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2587"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label163"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">Feed Icons (Favicons)</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment25"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkHBox" id="hbox92229"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkButton" id="updateAllFavicons"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Update all favicons now</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label177"> + <property name="visible">True</property> + <property name="label" translatable="yes">Folders</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox222"> + <property name="border_width">12</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">18</property> + + <child> + <widget class="GtkVBox" id="vbox253"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label128"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">Reading Headlines</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment26"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkHBox" id="hbox63"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="label151"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Skim through articles with:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">browsekeyoptionmenu</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkOptionMenu" id="browsekeyoptionmenu"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="history">0</property> + + <child> + <widget class="GtkMenu" id="browsekeymenu"> + + <child> + <widget class="GtkMenuItem" id="space"> + <property name="visible">True</property> + <property name="label" translatable="yes">Space</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_browsekey_space_activate" last_modification_time="Tue, 10 Aug 2004 23:08:48 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="ctrl_space"> + <property name="visible">True</property> + <property name="label" translatable="yes"><Ctrl> Space</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_browsekey_ctrl_space_activate" last_modification_time="Tue, 10 Aug 2004 23:08:48 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="alt_space"> + <property name="visible">True</property> + <property name="label" translatable="yes"><Alt> Space</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_browsekey_alt_space_activate" last_modification_time="Tue, 10 Aug 2004 23:08:48 GMT"/> + </widget> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2581"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label149"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">Date Column Settings</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment27"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkVBox" id="vbox2582"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkRadioButton" id="timeradiobtn1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Display only _time</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <signal name="clicked" handler="on_timeformatselection_clicked" last_modification_time="Thu, 08 Jan 2004 18:11:59 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkRadioButton" id="timeradiobtn2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Display _date and time</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">timeradiobtn1</property> + <signal name="clicked" handler="on_timeformatselection_clicked" last_modification_time="Thu, 08 Jan 2004 18:12:05 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox62"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkRadioButton" id="timeradiobtn3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_User defined format:</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">timeradiobtn1</property> + <signal name="clicked" handler="on_timeformatselection_clicked" last_modification_time="Thu, 08 Jan 2004 18:12:13 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="timeformatentry"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">for expert users: specify a time format string, consult the strftime() manpage for the format codes</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> + <signal name="changed" handler="on_timeformatentry_changed" last_modification_time="Wed, 07 Jan 2004 11:19:48 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label39"> + <property name="visible">True</property> + <property name="label" translatable="yes">Headlines</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2577"> + <property name="border_width">12</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">18</property> + + <child> + <widget class="GtkVBox" id="vbox2601"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkVBox" id="vbox2602"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label190"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">Internal Browser Settings</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment28"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkVBox" id="vbox2603"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkHBox" id="hbox28"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">5</property> + + <child> + <widget class="GtkLabel" id="label65"> + <property name="visible">True</property> + <property name="label" translatable="yes">_View Headlines With</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">htmlviewoptionmenu</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkOptionMenu" id="htmlviewoptionmenu"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="history">-1</property> + + <child> + <widget class="GtkMenu" id="menu3"> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label224"> + <property name="visible">True</property> + <property name="label" translatable="yes"><i>Please restart Liferea for changes to take effect.</i></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkCheckButton" id="browseinwindow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Open links in Liferea's _window.</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_openlinksinsidebtn_clicked" last_modification_time="Thu, 24 Jun 2004 05:07:21 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkCheckButton" id="disablejavascript"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Disable Javascript.</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_disablejavascript_toggled" last_modification_time="Thu, 02 Dec 2004 21:12:40 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">6</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox248"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label118"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">External Browser Settings</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment29"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkTable" id="table6"> + <property name="visible">True</property> + <property name="n_rows">3</property> + <property name="n_columns">2</property> + <property name="homogeneous">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + + <child> + <widget class="GtkLabel" id="label137"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Browser:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">browserpopup</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="manuallabel"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Manual: +(%s for URL)</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">browsercmd</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="browsercmd"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> + <signal name="changed" handler="on_browsercmd_changed" last_modification_time="Thu, 24 Jun 2004 05:34:16 GMT"/> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label138"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Open link in:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">browserlocpopup</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkOptionMenu" id="browserlocpopup"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="history">-1</property> + + <child> + <widget class="GtkMenu" id="menu4"> + </widget> + </child> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkOptionMenu" id="browserpopup"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="history">-1</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">6</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label50"> + <property name="visible">True</property> + <property name="label" translatable="yes">Browser</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox259"> + <property name="border_width">12</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">18</property> + + <child> + <widget class="GtkVBox" id="vbox251"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label124"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">Notification Settings</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment14"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkVBox" id="vbox2617"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkCheckButton" id="trayiconoptionbtn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Show a status _icon in the notification area (system tray).</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <signal name="clicked" handler="on_trayiconoptionbtn_clicked" last_modification_time="Thu, 08 Jan 2004 17:55:02 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox256"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkCheckButton" id="popupwindowsoptionbtn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Show a _popup window with new headlines.</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <signal name="clicked" handler="on_popupwindowsoptionbtn_clicked" last_modification_time="Sun, 20 Jun 2004 00:53:48 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox85"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkLabel" id="label195"> + <property name="visible">True</property> + <property name="label" translatable="yes"> </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="label_xalign">0</property> + <property name="label_yalign">0.5</property> + <property name="shadow_type">GTK_SHADOW_IN</property> + + <child> + <widget class="GtkTable" id="placement_options"> + <property name="border_width">6</property> + <property name="visible">True</property> + <property name="n_rows">2</property> + <property name="n_columns">2</property> + <property name="homogeneous">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + + <child> + <widget class="GtkRadioButton" id="popup_placement3_radiobtn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Lower Right</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <signal name="clicked" handler="on_placement_radiobtn_clicked" last_modification_time="Sat, 15 Jan 2005 14:25:31 GMT"/> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkRadioButton" id="popup_placement2_radiobtn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Upper Right</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">popup_placement3_radiobtn</property> + <signal name="clicked" handler="on_placement_radiobtn_clicked" last_modification_time="Sat, 15 Jan 2005 14:24:58 GMT"/> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkRadioButton" id="popup_placement1_radiobtn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Upper Left</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">popup_placement3_radiobtn</property> + <signal name="clicked" handler="on_placement_radiobtn_clicked" last_modification_time="Sat, 15 Jan 2005 14:24:27 GMT"/> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkRadioButton" id="popup_placement4_radiobtn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Lower Left</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">popup_placement3_radiobtn</property> + <signal name="clicked" handler="on_placement_radiobtn_clicked" last_modification_time="Sat, 15 Jan 2005 14:25:15 GMT"/> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + </widget> + </child> + + <child> + <widget class="GtkLabel" id="label196"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Popup Placement</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">6</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">label_item</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox252"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label126"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">Menu Settings</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment15"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkVBox" id="vbox223"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkRadioButton" id="menuradiobtn1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Show Menu _And Toolbar</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <signal name="clicked" handler="on_menuselection_clicked" last_modification_time="Thu, 08 Jan 2004 17:11:13 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkRadioButton" id="menuradiobtn2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Show _Menu Only</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">menuradiobtn1</property> + <signal name="clicked" handler="on_menuselection_clicked" last_modification_time="Thu, 08 Jan 2004 17:11:24 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkRadioButton" id="menuradiobtn3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Show _Toolbar Only</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <property name="group">menuradiobtn1</property> + <signal name="clicked" handler="on_menuselection_clicked" last_modification_time="Thu, 08 Jan 2004 17:11:37 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label139"> + <property name="visible">True</property> + <property name="label" translatable="yes">GUI</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox258"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkVBox" id="vbox227"> + <property name="border_width">12</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">18</property> + + <child> + <widget class="GtkVBox" id="vbox254"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label130"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">HTTP Proxy Server</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment16"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkVBox" id="vbox228"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label52"> + <property name="visible">True</property> + <property name="label" translatable="yes"><i>Liferea reuses the GNOME proxy settings. If you use GNOME you can change these settings in the GNOME Control Center.</i></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox229"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkCheckButton" id="enableproxybtn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Enable Proxy</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="proxybox"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkVBox" id="vbox2578"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkTable" id="proxytable"> + <property name="visible">True</property> + <property name="n_rows">2</property> + <property name="n_columns">2</property> + <property name="homogeneous">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + + <child> + <widget class="GtkLabel" id="label53"> + <property name="visible">True</property> + <property name="label" translatable="yes">Proxy _Host:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">proxyhostentry</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="proxyhostentry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> + <signal name="changed" handler="on_proxyhostentry_changed" last_modification_time="Sat, 24 Jan 2004 15:34:34 GMT"/> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="proxyportentry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> + <signal name="changed" handler="on_proxyportentry_changed" last_modification_time="Sat, 24 Jan 2004 15:34:44 GMT"/> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label54"> + <property name="visible">True</property> + <property name="label" translatable="yes">Proxy _Port:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">proxyportentry</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkCheckButton" id="useProxyAuth"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Use Proxy _Authentication</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment18"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkTable" id="proxyauthbox"> + <property name="visible">True</property> + <property name="n_rows">2</property> + <property name="n_columns">2</property> + <property name="homogeneous">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + + <child> + <widget class="GtkLabel" id="label145"> + <property name="visible">True</property> + <property name="label" translatable="yes">Proxy _Username:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">proxyhostentry</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="proxyuserentry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> + <signal name="changed" handler="on_proxyusernameentry_changed" last_modification_time="Thu, 29 Jul 2004 02:07:53 GMT"/> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="proxypasswordentry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">False</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> + <signal name="changed" handler="on_proxypasswordentry_changed" last_modification_time="Thu, 29 Jul 2004 02:08:14 GMT"/> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label146"> + <property name="visible">True</property> + <property name="label" translatable="yes">Proxy Pass_word:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">proxyportentry</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label140"> + <property name="visible">True</property> + <property name="label" translatable="yes">Proxy</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2609"> + <property name="border_width">12</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">18</property> + + <child> + <widget class="GtkVBox" id="vbox2610"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label217"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">Downloading Enclosures</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment20"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkTable" id="table8"> + <property name="visible">True</property> + <property name="n_rows">2</property> + <property name="n_columns">2</property> + <property name="homogeneous">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + + <child> + <widget class="GtkLabel" id="label216"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Download using</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label219"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Save downloads in</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">True</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox92224"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkOptionMenu" id="enc_download_tool_option_btn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="history">-1</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label220"> + <property name="visible">True</property> + <property name="label" translatable="yes"></property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox92225"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkEntry" id="save_download_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">False</property> + <signal name="changed" handler="on_save_download_entry_changed" last_modification_time="Sun, 27 Feb 2005 19:57:24 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="save_download_select_btn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Browse</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_save_download_select_btn_clicked" last_modification_time="Fri, 21 Jan 2005 22:01:56 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options">fill</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2618"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label208"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span weight="bold">Opening Enclosures</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment19"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkVBox" id="vbox2613"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property> + <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property> + <property name="shadow_type">GTK_SHADOW_IN</property> + <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + + <child> + <widget class="GtkTreeView" id="enc_actions_view"> + <property name="height_request">100</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="headers_visible">True</property> + <property name="rules_hint">True</property> + <property name="reorderable">False</property> + <property name="enable_search">True</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox92223"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkButton" id="enc_action_change_btn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-properties</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_enc_action_change_btn_clicked" last_modification_time="Sun, 16 Jan 2005 15:33:26 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="enc_action_remove_btn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-delete</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_enc_action_remove_btn_clicked" last_modification_time="Sun, 16 Jan 2005 15:33:41 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label207"> + <property name="visible">True</property> + <property name="label" translatable="yes">Enclosures</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +<widget class="GtkDialog" id="newfolderdialog"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="title" translatable="yes">New Folder</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">True</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="has_separator">False</property> + <signal name="delete_event" handler="gtk_widget_hide" object="newfolderdialog" last_modification_time="Sun, 14 Sep 2003 18:59:38 GMT"/> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox6"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area6"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="button3"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-6</property> + <signal name="clicked" handler="gtk_widget_hide" object="newfolderdialog" last_modification_time="Thu, 21 Aug 2003 22:17:54 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkButton" id="button2"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-ok</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-5</property> + <signal name="clicked" handler="on_newfolderbtn_clicked" last_modification_time="Thu, 21 Aug 2003 22:54:39 GMT"/> + <signal name="clicked" handler="gtk_widget_hide" after="yes" object="newfolderdialog" last_modification_time="Fri, 22 Aug 2003 20:14:24 GMT"/> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox10"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkHBox" id="hbox12"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="label20"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Folder name:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">foldertitleentry</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="foldertitleentry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +<widget class="GtkDialog" id="foldernamedialog"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="title" translatable="yes">Rename Folder</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">True</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="has_separator">False</property> + <signal name="delete_event" handler="gtk_widget_hide" object="foldernamedialog" last_modification_time="Sun, 14 Sep 2003 19:00:14 GMT"/> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox7"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area7"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="cancelbutton1"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">0</property> + <signal name="clicked" handler="gtk_widget_hide" object="foldernamedialog" last_modification_time="Sun, 14 Sep 2003 17:16:55 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkButton" id="foldernamechangebtn"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-ok</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">0</property> + <signal name="clicked" handler="on_foldernamechangebtn_clicked" last_modification_time="Sun, 14 Sep 2003 17:17:32 GMT"/> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox13"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="label23"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Folder name:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">foldernameentry</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="foldernameentry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> +</widget> + +<widget class="GtkDialog" id="feedsterdialog"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="title" translatable="yes">Feedster Search</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="has_separator">False</property> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox9"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area9"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="feedstercancelbtn"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-6</property> + <signal name="clicked" handler="gtk_widget_hide" object="feedsterdialog" last_modification_time="Sun, 23 Nov 2003 18:12:11 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkButton" id="feedsterbtn"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-ok</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-5</property> + <signal name="clicked" handler="on_feedsterbtn_clicked" last_modification_time="Wed, 12 Nov 2003 00:23:58 GMT"/> + <signal name="clicked" handler="gtk_widget_hide" after="yes" object="feedsterdialog" last_modification_time="Sun, 23 Nov 2003 18:12:34 GMT"/> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox224"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkHBox" id="hbox23"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="label42"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Search for:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">feedsterkeywords</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="feedsterkeywords"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">enter any search string you want</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox24"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="label43"> + <property name="visible">True</property> + <property name="label" translatable="yes">Maximal _Number Of Result Items:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">feedsterresultcount</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkSpinButton" id="feedsterresultcount"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="climb_rate">1</property> + <property name="digits">0</property> + <property name="numeric">False</property> + <property name="update_policy">GTK_UPDATE_ALWAYS</property> + <property name="snap_to_ticks">False</property> + <property name="wrap">False</property> + <property name="adjustment">15 1 1000 1 10 10</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label44"> + <property name="visible">True</property> + <property name="label" translatable="yes">Note: Liferea will generate a feed subscription which is used to query the Feedster results for the specified search string. You can keep this feed permanently and update it like any other subscription. </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +<widget class="GtkDialog" id="aboutdialog"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="title" translatable="yes">About</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="default_width">300</property> + <property name="default_height">200</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="has_separator">False</property> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox12"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area12"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="closebutton1"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-close</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-7</property> + <signal name="clicked" handler="gtk_widget_destroy" object="aboutdialog" last_modification_time="Wed, 18 Feb 2004 23:30:25 GMT"/> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkNotebook" id="notebook2"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="show_tabs">True</property> + <property name="show_border">True</property> + <property name="tab_pos">GTK_POS_TOP</property> + <property name="scrollable">False</property> + <property name="enable_popup">False</property> + + <child> + <widget class="GtkVBox" id="vbox231"> + <property name="border_width">6</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkLabel" id="label57"> + <property name="visible">True</property> + <property name="label">Liferea 1.0.3</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">15</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label58"> + <property name="visible">True</property> + <property name="label" translatable="yes">Liferea is a news aggregator for GTK+</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">4</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="homepagebtn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NONE</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_homepagebtn_clicked" last_modification_time="Wed, 08 Dec 2004 02:06:44 GMT"/> + + <child> + <widget class="GtkLabel" id="label194"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span color="blue" underline="single">Liferea Homepage</span></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label59"> + <property name="visible">True</property> + <property name="label" translatable="yes">Copyright (c) 2003-2005 +Lars Lindner <lars lindner gmx net> and +Nathan J. Conrad <t98502 users sourceforge net> +</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_CENTER</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">5</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label55"> + <property name="visible">True</property> + <property name="label" translatable="yes">About</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">GTK_POLICY_NEVER</property> + <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="shadow_type">GTK_SHADOW_NONE</property> + <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + + <child> + <widget class="GtkViewport" id="viewport1"> + <property name="visible">True</property> + <property name="shadow_type">GTK_SHADOW_NONE</property> + + <child> + <widget class="GtkLabel" id="label62"> + <property name="visible">True</property> + <property name="label" translatable="yes">Code, Patches, Debugging + +James Doherty <...> +Jeremy Messenger <mezz7 cox net> +John McKnight <...> +Tomasz Maka <pasp ll pl> +Karl Soderstrom <ks debian org> +Christophe Barbe <christophe barbe ufies org> +Juho Snellman <jsnell users sourceforge net> +Roshan Revankar <roshweb users sourceforge net> +Oliver Feiler <kiza kcore de> +Niklas Morberg <morberg users sourceforge net> +Johannes Schlueter <joscherl users sourceforge net> +Pierre Phaneuf <pp ludusdesign com> +ahmed el-helw <ahmedre cc gatech edu> +James Bowes <bowes cs dal ca> +Marc Deslauriers +Amit D. Chaudhary <amitc users sourceforge net> +Christoph Hohmann <reboot users sourceforge net> +Raphael Slinckx <raphael slinckx net> +Bjorn Monnens <newsletters pczone de> +and many more... + +Code from other projects + +Anders Carlsson <andersca gnu org> (tray icon support) +Philippe Martin, Brion Vibber (favicon support) +Jonathan Blandford <jrb redhat com> (GtkTreeModelFilter) +Kristian Rietveld <kris gtk org> (GtkTreeModelFilter)</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.10000000149</property> + <property name="xpad">5</property> + <property name="ypad">5</property> + </widget> + </child> + </widget> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label56"> + <property name="visible">True</property> + <property name="label" translatable="yes">Contributors</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="shadow_type">GTK_SHADOW_NONE</property> + <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + + <child> + <widget class="GtkViewport" id="viewport2"> + <property name="visible">True</property> + <property name="shadow_type">GTK_SHADOW_NONE</property> + + <child> + <widget class="GtkLabel" id="label61"> + <property name="visible">True</property> + <property name="label">Tibor Pittich <Tibor Pittich phuture sk> +Antoine REVERSAT <areversat TUXFAMILY ORG> +Vincent Lefevre <vincent vinc17 org> +Stephane Jourdan <stephane jourdan itris fr> +Takeshi AIHANA <aihana gnome gr jp> +Park Ji-In <mithrandir electrang net> +Carlos Fenollosa <topopardo humorfreak com> +Jose Maria Mateos <chema chema homelinux org> +Enrico Genauck <enrico fanglomerat de> +Vladimir Petkov <vpetkov i-space org> +Tomislav Markovski <tome set com mk> +Dario Conigliaro <djdas djdas net> +Rex Tsai <chihchun users sourceforge net> +Alekseev Vladimir <compress linux-online ru> +Juraj Kubelka <Juraj Kubelka email cz> +Martin-Eric Racine <q-funk pp fishpool fi> +Jakub W. Jóźwicki <jakubj users sourceforge net> +Pauli Virtanen <pauli virtanen hut fi> +Fernando Ike <fernando ikenet com br> +SpoialÄ? Cristian <scristian gmail com> +Jim Huang <jserv kaffe org> +Guanglei Xiong <xgl99 mails tsinghua edu cn> +Sigge Kotliar <sigge hystrix se></property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.10000000149</property> + <property name="xpad">5</property> + <property name="ypad">5</property> + </widget> + </child> + </widget> + </child> + </widget> + <packing> + <property name="tab_expand">False</property> + <property name="tab_fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label60"> + <property name="visible">True</property> + <property name="label" translatable="yes">Translation</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="type">tab</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +<widget class="GtkDialog" id="authdialog"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="title" translatable="yes">Authentication</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="has_separator">False</property> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox14"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area14"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="cancelbutton2"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-6</property> + </widget> + </child> + + <child> + <widget class="GtkButton" id="okbutton1"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-ok</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-5</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox255"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="prompt"> + <property name="visible">True</property> + <property name="label" translatable="yes">Enter the username and password for "%s" (%s):</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkTable" id="table4"> + <property name="visible">True</property> + <property name="n_rows">2</property> + <property name="n_columns">2</property> + <property name="homogeneous">False</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> + + <child> + <widget class="GtkLabel" id="label107"> + <property name="visible">True</property> + <property name="label" translatable="yes">User_name:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">usernameEntry</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label108"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Password:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">passwordEntry</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="usernameEntry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="passwordEntry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">False</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label134"> + <property name="visible">True</property> + <property name="label" translatable="yes">Note: <i>The username and password will be saved to your Liferea feedlist file without using encryption.</i></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +<widget class="GtkDialog" id="vfolderdialog"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="title" translatable="yes">VFolder Properties</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="default_width">350</property> + <property name="default_height">250</property> + <property name="resizable">True</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="has_separator">False</property> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox15"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area15"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="cancelbutton3"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-6</property> + </widget> + </child> + + <child> + <widget class="GtkButton" id="okbutton2"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-ok</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-5</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2583"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkHBox" id="hbox64"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="label152"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Name:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">feedNameEntry</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="feedNameEntry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">False</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2616"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkLabel" id="label225"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Rule</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkAlignment" id="alignment12"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkAlignment" id="alignment8"> + <property name="border_width">6</property> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">0</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkVBox" id="vbox2584"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkHBox" id="hbox65"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkButton" id="addrulebtn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-add</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label154"> + <property name="visible">True</property> + <property name="label" translatable="yes">Note: Items are added to the VFolder if at least one additive rule +matches. They are removed if at least one removing rule matches.</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="shadow_type">GTK_SHADOW_NONE</property> + <property name="window_placement">GTK_CORNER_TOP_LEFT</property> + + <child> + <widget class="GtkViewport" id="ruleview"> + <property name="visible">True</property> + <property name="shadow_type">GTK_SHADOW_IN</property> + + <child> + <placeholder/> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +<widget class="GtkDialog" id="enchandlerdialog"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="title" translatable="yes">Downloading Enclosure</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="has_separator">False</property> + <signal name="delete_event" handler="gtk_widget_destroy" last_modification_time="Sun, 16 Jan 2005 18:39:23 GMT"/> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox16"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area16"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="cancelbutton4"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-6</property> + </widget> + </child> + + <child> + <widget class="GtkButton" id="okbutton3"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-ok</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-5</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2605"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkVBox" id="vbox2606"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkLabel" id="label204"> + <property name="visible">True</property> + <property name="label" translatable="yes">Downloading an enclosure of type:</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="enc_type_label"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>text/plain</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">6</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label206"> + <property name="visible">True</property> + <property name="label" translatable="yes">What should Liferea do with this enclosure? Please enter the command you want to be executed below. The downloaded file will be supplied as an argument for this command:</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">True</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox88"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">6</property> + + <child> + <widget class="GtkEntry" id="enc_cmd_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">False</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="enc_cmd_select_btn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Browse</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkCheckButton" id="enc_always_btn"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Do this automatically for files like this from now on.</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +<widget class="GtkDialog" id="searchdialog"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="title" translatable="yes">Search All Feeds</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="has_separator">False</property> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox17"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area17"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="closebutton2"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-close</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-7</property> + <signal name="clicked" handler="on_hidesearch_clicked" last_modification_time="Sun, 13 Mar 2005 22:09:26 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkButton" id="vfolderaddbtn"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="tooltip" translatable="yes">Saves this search as a VFolder, which will appear in the feed list.</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">-10</property> + <signal name="clicked" handler="on_newVFolder_clicked" last_modification_time="Sun, 13 Mar 2005 01:29:33 GMT"/> + + <child> + <widget class="GtkAlignment" id="alignment11"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">0</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkHBox" id="hbox92228"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child> + <widget class="GtkImage" id="image2461"> + <property name="visible">True</property> + <property name="stock">gtk-add</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label223"> + <property name="visible">True</property> + <property name="label" translatable="yes">VFolder</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkButton" id="searchstartbtn"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="tooltip" translatable="yes">Starts searching for the specified text in all feeds. The search result will appear in the item list.</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-find</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="response_id">0</property> + <signal name="clicked" handler="on_searchentry_activate" last_modification_time="Sun, 13 Mar 2005 01:29:03 GMT"/> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox2614"> + <property name="border_width">5</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkHBox" id="hbox92227"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">12</property> + + <child> + <widget class="GtkLabel" id="label222"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Search for:</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="mnemonic_widget">searchentry</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="searchentry"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Enter a search string Liferea should find either in a items title or in its content.</property> + <property name="can_focus">True</property> + <property name="editable">True</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">False</property> + <signal name="activate" handler="on_searchentry_activate" last_modification_time="Sun, 13 Mar 2005 01:29:55 GMT"/> + <signal name="changed" handler="on_searchentry_changed" last_modification_time="Sun, 13 Mar 2005 21:35:53 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">6</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> +</widget> + +</glade-interface> diff -Npru evolution-cvs/feeds/feeds.gladep evolution/feeds/feeds.gladep --- evolution-cvs/feeds/feeds.gladep 1969-12-31 19:00:00.000000000 -0500 +++ evolution/feeds/feeds.gladep 2006-05-15 09:59:06.000000000 -0400 @@ -0,0 +1,7 @@ +<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> +<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd"> + +<glade-project> + <name></name> + <program_name></program_name> +</glade-project> diff -Npru -x '*ChangeLog*' -x Makefile.in -x '*CVS*' evolution-cvs/ui/Makefile.am evolution/ui/Makefile.am --- evolution-cvs/ui/Makefile.am 2006-01-27 14:32:41.000000000 -0500 +++ evolution/ui/Makefile.am 2006-05-15 09:58:57.000000000 -0400 @@ -3,6 +3,7 @@ XML_FILES = \ evolution-addressbook.xml \ evolution-calendar.xml \ evolution-composer-entries.xml \ + evolution-feeds.xml \ evolution-mail-message.xml \ evolution-mail-list.xml \ evolution-mail-global.xml \ diff -Npru -x '*ChangeLog*' -x Makefile.in -x '*CVS*' evolution-cvs/ui/evolution-feeds.xml evolution/ui/evolution-feeds.xml --- evolution-cvs/ui/evolution-feeds.xml 1969-12-31 19:00:00.000000000 -0500 +++ evolution/ui/evolution-feeds.xml 2006-05-15 09:58:57.000000000 -0400 @@ -0,0 +1,167 @@ +<Root> + <commands> + <cmd name="FeedDelete" + _tip="Delete selected feeds" + pixtype="stock" pixname="gtk-delete" + accel="*Control*d"/> + + <cmd name="FeedPrint" + _tip="Print selected feeds" + pixtype="stock" pixname="gtk-print" + accel="*Control*p"/> + + <cmd name="FeedPrintPreview" + _tip="Previews the feeds to be printed" + pixtype="stock" pixname="gtk-print-preview"/> + + <cmd name="FeedStop" + _tip="Stop Loading" + pixtype="stock" pixname="gtk-stop"/> + + <cmd name="FeedEdit" _label="Properties" + _tip="Edit the selected feed properties" + pixtype="stock" pixname="gtk-edit"/> + + <cmd name="FeedsCut" _label="Cut" _tip="Cut the selection" + pixtype="stock" pixname="gtk-cut" + accel="*Control*x"/> + + <cmd name="FeedsCopy" _label="Copy" + _tip="Copy the selection" + pixtype="stock" pixname="gtk-copy" + accel="*Control*c"/> + + <cmd name="FeedsPaste" _label="Paste" + _tip="Paste the clipboard" + pixtype="stock" pixname="gtk-paste" + accel="*Control*v"/> + + <cmd name="FeedsSelectAll" _label="Select All" + _tip="Select all feeds" + accel="*Control*a"/> + + <cmd name="FeedsSendFeedToOther" _label="Forward Feed" + _tip="Send selected feeds to another person."/> + + <cmd name="FeedsSendMessageToFeed" _label="Send message to feeder" + _tip="Send a message to the author of the selected feed."/> + + <cmd name="FeedsCopyToFolder" _label="Copy to Folder..." + _tip="Copy Selected Feeds to Another Folder..." + accel="*Control**Shift*y"/> + + <cmd name="FeedsMoveToFolder" _label="Move to Folder..." + _tip="Move Selected Feeds to Another Folder..." + accel="*Control**Shift*v"/> + + <cmd name="FeedsViewPreview" _label="Feed _Preview" + _tip="Show feed preview window" + accel="*Control*m" + type="toggle"/> + + <cmd name="FolderCreate" _label="_New" + _tip="Create a new feed folder" + pixtype="pixbuf"/> + + <cmd name="FolderCopy" _label="_Copy Folder Feeds To" + _tip="Copy the feeds of the selected folder into another folder" + pixtype="pixbuf"/> + + <cmd name="FolderMove" _label="_Move Folder Feeds To" + _tip="Move the feeds of the selected folder into another folder" + pixtype="pixbuf"/> + <cmd name="FolderDelete" _label="_Delete" + _tip="Delete the selected folder" + pixtype="pixbuf"/> + <cmd name="FolderRename" _label="_Rename" + _tip="Rename the selected folder" + pixtype="pixbuf"/> + <cmd name="ChangeFolderProperties" _label="_Properties" + _tip="Change the properties of the selected folder" + pixtype="pixbuf"/> + </commands> + + <menu> + <submenu name="File"> + <placeholder name="FileOps"> + </placeholder> + + <placeholder name="Print"> + <menuitem name="FeedPrintPreview" verb="" + _label="Print Pre_view"/> + <menuitem name="FeedPrint" verb="" + _label="_Print..."/> + </placeholder> + + </submenu> + + <submenu name="Edit" _label="_Edit"> + <placeholder name="EditPlaceholder"> + <menuitem name="FeedsSelectAll" verb="" _label="Select _All"/> + + <separator f="" name="eadbk2"/> + + <menuitem name="FeedsCut" verb="" _label="C_ut"/> + + <menuitem name="FeedsCopy" verb="" _label="_Copy"/> + + <menuitem name="FeedsPaste" verb="" _label="_Paste"/> + + <separator f="" name="eadbk6"/> + + <menuitem name="FeedDelete" verb="" _label="_Delete Feed"/> + + <menuitem name="FeedEdit" verb="" _label="_Feed Properties"/> + + </placeholder> + </submenu> + + <placeholder name="FolderPlaceholder"> + </placeholder> + + <placeholder name="ActionsPlaceholder"> + <submenu name="Actions" _label="_Actions"> + <menuitem name="FeedsSendFeedToOther" + _label="_Forward Feed..." verb=""/> + + <menuitem name="FeedsSendMessageToFeed" + _label="_Send Message to Feed..." verb=""/> + <menuitem name="FeedActionStop" verb="FeedStop" _label="St_op"/> + + <separator f="" name="eadbk5"/> + + <menuitem name="FeedsCopyToFolder" _label="_Copy Feed to..." verb=""/> + <menuitem name="FeedsMoveToFolder" _label="_Move Feed to..." verb=""/> + + <separator f="" name="eadbk4"/> + + <menuitem name="FolderCopy" verb="" _label="Co_py All Feeds To..." pixtype="pixbuf"/> + + <menuitem name="FolderMove" verb="" _label="Mo_ve All Feeds To..." pixtype="pixbuf"/> + + </submenu> + </placeholder> + + </menu> + + <dockitem name="Toolbar"> + <toolitem name="FeedDelete" verb="FeedDelete" _label="Delete"/> + <toolitem name="FeedEdit" verb="FeedEdit" _label="Edit"/> + <separator/> + <toolitem name="FeedsCut" verb="FeedsCut" _label="Cut"/> + <toolitem name="FeedsCopy" verb="FeedsCopy" _label="Copy"/> + <toolitem name="FeedsPaste" verb="FeedsPaste" _label="Paste"/> + <separator/> + <toolitem name="FeedStop" verb="FeedStop" _label="Stop"/> + <toolitem name="FeedPrint" verb="FeedPrint" _label="Print"/> + </dockitem> + + <keybindings> + <accel name="Delete" verb="FeedDelete"/> + <accel name="BackSpace" verb="FeedDelete"/> + <accel name="F16" verb="FeedsCopy"/> + <accel name="F18" verb="FeedsPaste"/> + <accel name="F20" verb="FeedsCut"/> + </keybindings> + +</Root>
Attachment:
feed-icon.png
Description: PNG image