<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre, #msg p { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[766] trunk/alexandria:
The data from Library Export is now sorted in the same way as the current</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd>766</dd>
<dt>Author</dt> <dd>cathalmagus</dd>
<dt>Date</dt> <dd>2007-10-23 14:49:53 -0400 (Tue, 23 Oct 2007)</dd>
</dl>
<h3>Log Message</h3>
<pre>The data from Library Export is now sorted in the same way as the current
view of that library. Thanks to Ralph M. Deal for suggesting this feature.
New library spec tests the export ordering, but not how it is tied in
to the GUI.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkalexandrialibalexandriaexport_libraryrb">trunk/alexandria/lib/alexandria/export_library.rb</a></li>
<li><a href="#trunkalexandrialibalexandriauidialogsexport_dialogrb">trunk/alexandria/lib/alexandria/ui/dialogs/export_dialog.rb</a></li>
<li><a href="#trunkalexandrialibalexandriauimain_apprb">trunk/alexandria/lib/alexandria/ui/main_app.rb</a></li>
<li><a href="#trunkalexandriaspecalexandrialibrary_specrb">trunk/alexandria/spec/alexandria/library_spec.rb</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li>trunk/alexandria/spec/data/libraries/0.6.2/</li>
<li>trunk/alexandria/spec/data/libraries/0.6.2/My Library/</li>
<li><a href="#trunkalexandriaspecdatalibraries062MyLibrary9780140266146cover">trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780140266146.cover</a></li>
<li><a href="#trunkalexandriaspecdatalibraries062MyLibrary9780140266146yaml">trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780140266146.yaml</a></li>
<li><a href="#trunkalexandriaspecdatalibraries062MyLibrary9780140278781cover">trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780140278781.cover</a></li>
<li><a href="#trunkalexandriaspecdatalibraries062MyLibrary9780140278781yaml">trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780140278781.yaml</a></li>
<li><a href="#trunkalexandriaspecdatalibraries062MyLibrary9780571147168cover">trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780571147168.cover</a></li>
<li><a href="#trunkalexandriaspecdatalibraries062MyLibrary9780571147168yaml">trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780571147168.yaml</a></li>
<li><a href="#trunkalexandriaspecdatalibraries062MyLibrary9780575079038cover">trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780575079038.cover</a></li>
<li><a href="#trunkalexandriaspecdatalibraries062MyLibrary9780575079038yaml">trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780575079038.yaml</a></li>
<li><a href="#trunkalexandriaspecdatalibraries062MyLibrary9780755322800cover">trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780755322800.cover</a></li>
<li><a href="#trunkalexandriaspecdatalibraries062MyLibrary9780755322800yaml">trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780755322800.yaml</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkalexandrialibalexandriaexport_libraryrb"></a>
<div class="modfile"><h4>Modified: trunk/alexandria/lib/alexandria/export_library.rb (765 => 766)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/alexandria/lib/alexandria/export_library.rb        2007-10-23 18:45:42 UTC (rev 765)
+++ trunk/alexandria/lib/alexandria/export_library.rb        2007-10-23 18:49:53 UTC (rev 766)
</span><span class="lines">@@ -19,20 +19,65 @@
</span><span class="cx">
</span><span class="cx"> begin # image_size is optional
</span><span class="cx"> $IMAGE_SIZE_LOADED = true
</span><del>- require 'image_size'
</del><ins>+ require 'image_size'
</ins><span class="cx"> rescue LoadError
</span><span class="cx"> $IMAGE_SIZE_LOADED = false
</span><span class="cx"> puts "Can't load image_size, hence exported libraries are not optimized"
</span><span class="cx"> end
</span><span class="cx">
</span><span class="cx"> module Alexandria
</span><ins>+
+ class LibrarySortOrder
+ def initialize(book_attribute, ascending=true)
+ @book_attribute = book_attribute
+ @ascending = ascending
+ end
+
+ def sort(library)
+ sorted = library.sort_by do |book|
+ book.send(@book_attribute)
+ end
+ if not @ascending
+ sorted.reverse!
+ end
+ sorted
+ end
+
+ def to_s
+ "#{@book_attribute} #{@ascending ? 'ascending' : 'descending'}"
+ end
+
+ class Unsorted < LibrarySortOrder
+ def initialize
+ end
+
+ def sort(library)
+ library
+ end
+
+ def to_s
+ "unsorted"
+ end
+ end
+ end
+
+ class SortedLibrary < Library
+ def initialize(library, sort_order)
+ super("#{library.name} sorted by #{sort_order}")
+ sorted = sort_order.sort(library)
+ sorted.each do |book|
+ self << book
+ end
+ end
+ end
+
</ins><span class="cx"> class ExportFormat
</span><span class="cx"> attr_reader :name, :ext, :message
</span><span class="cx">
</span><span class="cx"> include GetText
</span><span class="cx"> extend GetText
</span><span class="cx"> bindtextdomain(Alexandria::TEXTDOMAIN, nil, nil, "UTF-8")
</span><del>-
</del><ins>+
</ins><span class="cx"> def self.all
</span><span class="cx"> [
</span><span class="cx"> self.new(_("Archived ONIX XML"), "onix.tbz2",
</span><span class="lines">@@ -46,18 +91,23 @@
</span><span class="cx"> ]
</span><span class="cx"> end
</span><span class="cx">
</span><del>- def invoke(library, filename, *args)
- library.send(@message, filename, *args)
</del><ins>+ def invoke(library, sort_order, filename, *args)
+ if sort_order
+ sorted = SortedLibrary.new(library, sort_order)
+ sorted.send(@message, filename, *args)
+ else
+ library.send(@message, filename, *args)
+ end
</ins><span class="cx"> end
</span><del>-
</del><ins>+
</ins><span class="cx"> def needs_preview?
</span><span class="cx"> @needs_preview
</span><span class="cx"> end
</span><del>-
</del><ins>+
</ins><span class="cx"> #######
</span><span class="cx"> private
</span><span class="cx"> #######
</span><del>-
</del><ins>+
</ins><span class="cx"> def initialize(name, ext, message, needs_preview=false)
</span><span class="cx"> @name = name
</span><span class="cx"> @ext = ext
</span><span class="lines">@@ -72,7 +122,7 @@
</span><span class="cx"> to_onix_document.write(io, 0)
</span><span class="cx"> end
</span><span class="cx"> copy_covers(File.join(Dir.tmpdir, "images"))
</span><del>- Dir.chdir(Dir.tmpdir) do
</del><ins>+ Dir.chdir(Dir.tmpdir) do
</ins><span class="cx"> output = `tar -cjf \"#{filename}\" onix.xml images 2>&1`
</span><span class="cx"> raise output unless $?.success?
</span><span class="cx"> end
</span><span class="lines">@@ -100,12 +150,12 @@
</span><span class="cx"> end
</span><span class="cx"> end
</span><span class="cx"> end
</span><del>-
</del><ins>+
</ins><span class="cx"> def export_as_html(filename, theme)
</span><span class="cx"> FileUtils.mkdir(filename) unless File.exists?(filename)
</span><span class="cx"> Dir.chdir(filename) do
</span><span class="cx"> copy_covers("pixmaps")
</span><del>- FileUtils.cp_r(theme.pixmaps_directory,
</del><ins>+ FileUtils.cp_r(theme.pixmaps_directory,
</ins><span class="cx"> "pixmaps") if theme.has_pixmaps?
</span><span class="cx"> FileUtils.cp(theme.css_file, ".")
</span><span class="cx"> File.open("index.html", "w") do |io|
</span><span class="lines">@@ -127,8 +177,8 @@
</span><span class="cx"> end
</span><span class="cx"> end
</span><span class="cx"> end
</span><del>-
- #######
</del><ins>+
+ #######
</ins><span class="cx"> private
</span><span class="cx"> #######
</span><span class="cx">
</span><span class="lines">@@ -136,15 +186,15 @@
</span><span class="cx"> def to_onix_document
</span><span class="cx"> doc = REXML::Document.new
</span><span class="cx"> doc << REXML::XMLDecl.new
</span><del>- doc << REXML::DocType.new('ONIXMessage',
</del><ins>+ doc << REXML::DocType.new('ONIXMessage',
</ins><span class="cx"> "SYSTEM \"#{ONIX_DTD_URL}\"")
</span><span class="cx"> msg = doc.add_element('ONIXMessage')
</span><span class="cx"> header = msg.add_element('Header')
</span><span class="cx"> header.add_element('FromCompany').text = "Alexandria"
</span><span class="cx"> header.add_element('FromPerson').text = Etc.getlogin
</span><span class="cx"> now = Time.now
</span><del>- header.add_element('SentDate').text = "%.4d%.2d%.2d%.2d%.2d" % [
- now.year, now.month, now.day, now.hour, now.min
</del><ins>+ header.add_element('SentDate').text = "%.4d%.2d%.2d%.2d%.2d" % [
+ now.year, now.month, now.day, now.hour, now.min
</ins><span class="cx"> ]
</span><span class="cx"> header.add_element('MessageNote').text = name
</span><span class="cx"> each_with_index do |book, idx|
</span><span class="lines">@@ -152,7 +202,7 @@
</span><span class="cx"> prod = msg.add_element('Product')
</span><span class="cx"> prod.add_element('RecordReference').text = idx
</span><span class="cx"> prod.add_element('NotificationType').text = "03" # confirmed
</span><del>- prod.add_element('RecordSourceName').text =
</del><ins>+ prod.add_element('RecordSourceName').text =
</ins><span class="cx"> "Alexandria " + VERSION
</span><span class="cx"> prod.add_element('ISBN').text = book.isbn
</span><span class="cx"> prod.add_element('ProductForm').text = 'BA' # book
</span><span class="lines">@@ -168,7 +218,7 @@
</span><span class="cx"> if book.notes and not book.notes.empty?
</span><span class="cx"> elem = prod.add_element('OtherText')
</span><span class="cx"> # reader description
</span><del>- elem.add_element('TextTypeCode').text = '12'
</del><ins>+ elem.add_element('TextTypeCode').text = '12'
</ins><span class="cx"> elem.add_element('TextFormat').text = '00' # ASCII
</span><span class="cx"> elem.add_element('Text').text = book.notes
</span><span class="cx"> end
</span><span class="lines">@@ -176,19 +226,19 @@
</span><span class="cx"> elem = prod.add_element('MediaFile')
</span><span class="cx"> # front cover image
</span><span class="cx"> elem.add_element('MediaFileTypeCode').text = '04'
</span><del>- elem.add_element('MediaFileFormatCode').text =
</del><ins>+ elem.add_element('MediaFileFormatCode').text =
</ins><span class="cx"> (Library.jpeg?(cover(book)) ? '03' : '02' )
</span><span class="cx"> # filename
</span><span class="cx"> elem.add_element('MediaFileLinkTypeCode').text = '06'
</span><del>- elem.add_element('MediaFileLink').text =
</del><ins>+ elem.add_element('MediaFileLink').text =
</ins><span class="cx"> File.join('images', final_cover(book))
</span><span class="cx"> end
</span><span class="cx"> if book.isbn
</span><span class="cx"> BookProviders.each do |provider|
</span><span class="cx"> elem = prod.add_element('ProductWebsite')
</span><del>- elem.add_element('ProductWebsiteDescription').text =
</del><ins>+ elem.add_element('ProductWebsiteDescription').text =
</ins><span class="cx"> provider.fullname
</span><del>- elem.add_element('ProductWebsiteLink').text =
</del><ins>+ elem.add_element('ProductWebsiteLink').text =
</ins><span class="cx"> provider.url(book)
</span><span class="cx"> end
</span><span class="cx"> end
</span><span class="lines">@@ -214,7 +264,7 @@
</span><span class="cx"> collection.add_attribute('type', "2")
</span><span class="cx"> fields = collection.add_element('fields')
</span><span class="cx"> field1 = fields.add_element('field')
</span><del>- # a field named _default implies adding all default book
</del><ins>+ # a field named _default implies adding all default book
</ins><span class="cx"> # collection fields
</span><span class="cx"> field1.add_attribute('name', "_default")
</span><span class="cx"> images = collection.add_element('images')
</span><span class="lines">@@ -251,7 +301,7 @@
</span><span class="cx"> image.add_attribute('width', image_s.get_width)
</span><span class="cx"> image.add_attribute('format', image_s.get_type)
</span><span class="cx"> else
</span><del>- image.add_attribute('format',
</del><ins>+ image.add_attribute('format',
</ins><span class="cx"> Library.jpeg?(cover(book)) \
</span><span class="cx"> ? "JPEG" : "GIF")
</span><span class="cx"> end
</span><span class="lines">@@ -259,7 +309,7 @@
</span><span class="cx"> end
</span><span class="cx"> return doc
</span><span class="cx"> end
</span><del>-
</del><ins>+
</ins><span class="cx"> def to_xhtml(css)
</span><span class="cx"> generator = "Alexandria " + Alexandria::VERSION
</span><span class="cx"> xhtml = ""
</span><span class="lines">@@ -290,7 +340,7 @@
</span><span class="cx"> if File.exists?(cover(book))
</span><span class="cx"> xhtml << <<EOS
</span><span class="cx"> <img class="book_cover"
</span><del>- src="#{File.join("pixmaps", final_cover(book))}"
</del><ins>+ src="#{File.join("pixmaps", final_cover(book))}"
</ins><span class="cx"> alt="Cover file for '#{book.title}'"
</span><span class="cx"> EOS
</span><span class="cx"> if $IMAGE_SIZE_LOADED
</span><span class="lines">@@ -355,7 +405,7 @@
</span><span class="cx"> bibtex << "\%Generated on #{Date.today()} by: #{generator}\n"
</span><span class="cx"> bibtex << "\%\n"
</span><span class="cx"> bibtex << "\n"
</span><del>-
</del><ins>+
</ins><span class="cx"> auths = Hash.new(0)
</span><span class="cx"> each do |book|
</span><span class="cx"> k = (book.authors[0] or "Anonymous").split[0]
</span><span class="lines">@@ -401,7 +451,7 @@
</span><span class="cx"> return my_str
</span><span class="cx"> end
</span><span class="cx"> end
</span><del>-
</del><ins>+
</ins><span class="cx"> class Library
</span><span class="cx"> include Exportable
</span><span class="cx"> end
</span></span></pre></div>
<a id="trunkalexandrialibalexandriauidialogsexport_dialogrb"></a>
<div class="modfile"><h4>Modified: trunk/alexandria/lib/alexandria/ui/dialogs/export_dialog.rb (765 => 766)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/alexandria/lib/alexandria/ui/dialogs/export_dialog.rb        2007-10-23 18:45:42 UTC (rev 765)
+++ trunk/alexandria/lib/alexandria/ui/dialogs/export_dialog.rb        2007-10-23 18:49:53 UTC (rev 766)
</span><span class="lines">@@ -20,9 +20,9 @@
</span><span class="cx"> class ConfirmEraseDialog < AlertDialog
</span><span class="cx"> include GetText
</span><span class="cx"> GetText.bindtextdomain(Alexandria::TEXTDOMAIN, nil, nil, "UTF-8")
</span><del>-
</del><ins>+
</ins><span class="cx"> def initialize(parent, filename)
</span><del>- super(parent, _("File already exists"),
</del><ins>+ super(parent, _("File already exists"),
</ins><span class="cx"> Gtk::Stock::DIALOG_QUESTION,
</span><span class="cx"> [[Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL],
</span><span class="cx"> [_("_Replace"), Gtk::Dialog::RESPONSE_OK]],
</span><span class="lines">@@ -43,28 +43,28 @@
</span><span class="cx"> include GetText
</span><span class="cx"> extend GetText
</span><span class="cx"> GetText.bindtextdomain(Alexandria::TEXTDOMAIN, nil, nil, "UTF-8")
</span><del>-
</del><ins>+
</ins><span class="cx"> FORMATS = Alexandria::ExportFormat.all
</span><span class="cx"> THEMES = Alexandria::WebTheme.all
</span><span class="cx">
</span><del>- def initialize(parent, library)
</del><ins>+ def initialize(parent, library, sort_order)
</ins><span class="cx"> backend = `uname`.chomp == "FreeBSD" ? "neant" : "gnome-vfs"
</span><span class="cx"> super(_("Export '%s'") % library.name,
</span><span class="cx"> nil,
</span><span class="cx"> Gtk::FileChooser::ACTION_SAVE,
</span><span class="cx"> backend,
</span><del>- [Gtk::Stock::HELP, Gtk::Dialog::RESPONSE_HELP],
</del><ins>+ [Gtk::Stock::HELP, Gtk::Dialog::RESPONSE_HELP],
</ins><span class="cx"> [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL],
</span><span class="cx"> [_("_Export"), Gtk::Dialog::RESPONSE_ACCEPT])
</span><del>-
</del><ins>+
</ins><span class="cx"> self.transient_for = parent
</span><span class="cx"> self.current_name = library.name
</span><span class="cx"> self.signal_connect('destroy') { hide }
</span><span class="cx">
</span><del>- @parent, @library = parent, library
</del><ins>+ @parent, @library, @sort_order = parent, library, sort_order
</ins><span class="cx">
</span><span class="cx"> preview_image = Gtk::Image.new
</span><del>-
</del><ins>+
</ins><span class="cx"> theme_combo = Gtk::ComboBox.new
</span><span class="cx"> THEMES.each do |theme|
</span><span class="cx"> theme_combo.append_text(theme.name)
</span><span class="lines">@@ -73,10 +73,10 @@
</span><span class="cx"> file = THEMES[theme_combo.active].preview_file
</span><span class="cx"> preview_image.pixbuf = Gdk::Pixbuf.new(file)
</span><span class="cx"> end
</span><del>- theme_combo.active = 0
</del><ins>+ theme_combo.active = 0
</ins><span class="cx"> theme_label = Gtk::Label.new(_("_Theme:"), true)
</span><span class="cx"> theme_label.xalign = 0
</span><del>- theme_label.mnemonic_widget = theme_combo
</del><ins>+ theme_label.mnemonic_widget = theme_combo
</ins><span class="cx">
</span><span class="cx"> types_combo = Gtk::ComboBox.new
</span><span class="cx"> FORMATS.each do |format|
</span><span class="lines">@@ -92,20 +92,20 @@
</span><span class="cx"> types_combo.active = 0
</span><span class="cx"> types_combo.signal_connect('changed') do
</span><span class="cx"> theme_label.visible = theme_combo.visible =
</span><del>- preview_image.visible =
</del><ins>+ preview_image.visible =
</ins><span class="cx"> FORMATS[types_combo.active].needs_preview?
</span><span class="cx"> end
</span><span class="cx"> types_combo.show
</span><span class="cx">
</span><span class="cx"> types_label = Gtk::Label.new(_("Export for_mat:"), true)
</span><span class="cx"> types_label.xalign = 0
</span><del>- types_label.mnemonic_widget = types_combo
</del><ins>+ types_label.mnemonic_widget = types_combo
</ins><span class="cx"> types_label.show
</span><del>-
</del><ins>+
</ins><span class="cx"> # Ugly hack to add more rows in the internal Gtk::Table of the
</span><span class="cx"> # widget, which is needed because we want the export type to be
</span><span class="cx"> # aligned against the other widgets, and #extra_widget doesn't do
</span><del>- # that...
</del><ins>+ # that...
</ins><span class="cx"> internal_table =
</span><span class="cx"> children[0].children[0].children[0].children[0].children[0]
</span><span class="cx"> internal_table.resize(4, 3)
</span><span class="lines">@@ -114,19 +114,19 @@
</span><span class="cx"> internal_table.attach(theme_label, 0, 1, 3, 4)
</span><span class="cx"> internal_table.attach(theme_combo, 1, 2, 3, 4)
</span><span class="cx"> internal_table.attach(preview_image, 2, 3, 0, 4)
</span><del>-
</del><ins>+
</ins><span class="cx"> while (response = run) != Gtk::Dialog::RESPONSE_CANCEL and
</span><span class="cx"> response != Gtk::Dialog::RESPONSE_DELETE_EVENT
</span><span class="cx">
</span><span class="cx"> if response == Gtk::Dialog::RESPONSE_HELP
</span><span class="cx"> begin
</span><span class="cx"> Gnome::Help.display('alexandria', 'exporting')
</span><del>- rescue => e
</del><ins>+ rescue => e
</ins><span class="cx"> ErrorDialog.new(self, e.message)
</span><span class="cx"> end
</span><span class="cx"> else
</span><span class="cx"> begin
</span><del>- break if on_export(FORMATS[types_combo.active],
</del><ins>+ break if on_export(FORMATS[types_combo.active],
</ins><span class="cx"> THEMES[theme_combo.active])
</span><span class="cx"> rescue => e
</span><span class="cx"> ErrorDialog.new(self, _("Export failed"), e.message)
</span><span class="lines">@@ -142,7 +142,7 @@
</span><span class="cx">
</span><span class="cx"> def on_export(format, theme)
</span><span class="cx"> unless @library.respond_to?(format.message)
</span><del>- raise NotImplementedError
</del><ins>+ raise NotImplementedError
</ins><span class="cx"> end
</span><span class="cx"> filename = self.filename
</span><span class="cx"> if format.ext
</span><span class="lines">@@ -152,13 +152,13 @@
</span><span class="cx"> return unless dialog.erase?
</span><span class="cx"> FileUtils.rm(filename)
</span><span class="cx"> end
</span><del>- args = []
</del><ins>+ args = []
</ins><span class="cx"> else
</span><del>- if File.exists?(filename)
</del><ins>+ if File.exists?(filename)
</ins><span class="cx"> unless File.directory?(filename)
</span><span class="cx"> msg = _("The target, named '%s', is a regular " +
</span><span class="cx"> "file. A directory is needed for this " +
</span><del>- "operation. Please select a directory and " +
</del><ins>+ "operation. Please select a directory and " +
</ins><span class="cx"> "try again.") % filename
</span><span class="cx"> ErrorDialog.new(@parent, _("Not a directory"), msg)
</span><span class="cx"> return
</span><span class="lines">@@ -166,9 +166,9 @@
</span><span class="cx"> else
</span><span class="cx"> Dir.mkdir(filename)
</span><span class="cx"> end
</span><del>- args = [theme]
</del><ins>+ args = [theme]
</ins><span class="cx"> end
</span><del>- format.invoke(@library, filename, *args)
</del><ins>+ format.invoke(@library, @sort_order, filename, *args)
</ins><span class="cx"> return true
</span><span class="cx"> end
</span><span class="cx"> end
</span></span></pre></div>
<a id="trunkalexandrialibalexandriauimain_apprb"></a>
<div class="modfile"><h4>Modified: trunk/alexandria/lib/alexandria/ui/main_app.rb (765 => 766)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/alexandria/lib/alexandria/ui/main_app.rb        2007-10-23 18:45:42 UTC (rev 765)
+++ trunk/alexandria/lib/alexandria/ui/main_app.rb        2007-10-23 18:49:53 UTC (rev 766)
</span><span class="lines">@@ -1108,6 +1108,40 @@
</span><span class="cx"> end
</span><span class="cx"> end
</span><span class="cx">
</span><ins>+
+ # Gets the sort order of the current library, for use by export
+ def library_sort_order
+ # added by Cathal Mc Ginley, 23 Oct 2007
+ current_view_model = case @notebook.page
+ when 0
+ @iconview.model
+ when 1
+ @listview.model
+ end
+ sorted_on = current_view_model.sort_column_id
+ if sorted_on
+ sort_column = sorted_on[0]
+ sort_order = sorted_on[1]
+
+ column_ids_to_attributes = { 2 => :title,
+ 4 => :authors,
+ 5 => :isbn,
+ 6 => :publisher,
+ 7 => :publishing_year,
+ 8 =>:edition, #binding
+ 12 => :redd,
+ 13 => :own,
+ 14 => :want,
+ 9 => :rating}
+
+ sort_attribute = column_ids_to_attributes[sort_column]
+ ascending = (sort_order == Gtk::SORT_ASCENDING)
+ LibrarySortOrder.new(sort_attribute, ascending)
+ else
+ LibrarySortOrder::Unsorted.new
+ end
+ end
+
</ins><span class="cx"> def undoable_delete(library, books=nil)
</span><span class="cx"> # Deleting a library.
</span><span class="cx"> if books.nil?
</span><span class="lines">@@ -1211,7 +1245,7 @@
</span><span class="cx"> end
</span><span class="cx"> end
</span><span class="cx">
</span><del>- on_export = proc { ExportDialog.new(@main_app, selected_library) }
</del><ins>+ on_export = proc { ExportDialog.new(@main_app, selected_library, library_sort_order) }
</ins><span class="cx">
</span><span class="cx"> on_acquire = proc do
</span><span class="cx"> AcquireDialog.new(@main_app,
</span></span></pre></div>
<a id="trunkalexandriaspecalexandrialibrary_specrb"></a>
<div class="modfile"><h4>Modified: trunk/alexandria/spec/alexandria/library_spec.rb (765 => 766)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/alexandria/spec/alexandria/library_spec.rb        2007-10-23 18:45:42 UTC (rev 765)
+++ trunk/alexandria/spec/alexandria/library_spec.rb        2007-10-23 18:49:53 UTC (rev 766)
</span><span class="lines">@@ -153,3 +153,65 @@
</span><span class="cx">
</span><span class="cx"> end
</span><span class="cx">
</span><ins>+describe Alexandria::Library, " export sort order" do
+
+ before(:all) do
+ require 'tmpdir'
+ require 'csv'
+ end
+
+ before(:each) do
+ libVersion = File.join(LIBDIR, '0.6.2')
+ FileUtils.cp_r(libVersion, TESTDIR)
+ @format = Alexandria::ExportFormat.new("CSV list", "csv", :export_as_csv_list)
+ @outfile = File.join(Dir.tmpdir, "myLibrary-0.6.2.csv")
+ @myLibrary = Alexandria::Library.loadall[0]
+ end
+
+
+ def load_rows_from_csv
+ csv_reader = CSV.open(@outfile, 'r', col_sep=';')
+ rows = []
+ while row = csv_reader.shift
+ if row.size == 0
+ break
+ end
+ rows << row
+ end
+ rows
+ end
+
+ it "can sort by title" do
+ sort_by_title = Alexandria::LibrarySortOrder.new(:title)
+ @format.invoke(@myLibrary, sort_by_title, @outfile)
+ File.exists?(@outfile).should be_true
+ rows = load_rows_from_csv
+ rows.size.should == @myLibrary.size
+ TITLE = 0
+ comparisons = rows.size - 1
+ comparisons.times do |index|
+ rows[index][TITLE].should <= rows[index+1][TITLE]
+ end
+ end
+
+ it "can sort in descending order" do
+ sort_by_date_desc = Alexandria::LibrarySortOrder.new(:publishing_year, false)
+ @format.invoke(@myLibrary, sort_by_date_desc, @outfile)
+ File.exists?(@outfile).should be_true
+ rows = load_rows_from_csv
+ rows.size.should == @myLibrary.size
+ DATE = 5
+ comparisons = rows.size - 1
+ comparisons.times do |index|
+ rows[index][DATE].should >= rows[index+1][DATE]
+ end
+ end
+
+ after(:each) do
+ FileUtils.rm_rf(TESTDIR)
+ if File.exists? @outfile
+ File.unlink @outfile
+ end
+ end
+
+end
</ins></span></pre></div>
<a id="trunkalexandriaspecdatalibraries062MyLibrary9780140266146cover"></a>
<div class="binary"><h4>Added: trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780140266146.cover</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<span class="cx">Property changes on: trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780140266146.cover
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:mime-type
</span><span class="cx"> + application/octet-stream
</span><a id="trunkalexandriaspecdatalibraries062MyLibrary9780140266146yaml"></a>
<div class="addfile"><h4>Added: trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780140266146.yaml (0 => 766)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780140266146.yaml         (rev 0)
+++ trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780140266146.yaml        2007-10-23 18:49:53 UTC (rev 766)
</span><span class="lines">@@ -0,0 +1,16 @@
</span><ins>+--- !ruby/object:Alexandria::Book
+authors:
+- !str:Amazon::Search::Response William Gibson
+edition: !str:Amazon::Search::Response Paperback
+isbn: "9780140266146"
+notes: ""
+own: true
+publisher: !str:Amazon::Search::Response Penguin Books Ltd
+publishing_year: 2004
+redd: false
+saved_ident: "9780140266146"
+tags: []
+
+title: !str:Amazon::Search::Response Pattern Recognition
+version: 0.6.2b1
+want: true
</ins></span></pre></div>
<a id="trunkalexandriaspecdatalibraries062MyLibrary9780140278781cover"></a>
<div class="binary"><h4>Added: trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780140278781.cover</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<span class="cx">Property changes on: trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780140278781.cover
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:mime-type
</span><span class="cx"> + application/octet-stream
</span><a id="trunkalexandriaspecdatalibraries062MyLibrary9780140278781yaml"></a>
<div class="addfile"><h4>Added: trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780140278781.yaml (0 => 766)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780140278781.yaml         (rev 0)
+++ trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780140278781.yaml        2007-10-23 18:49:53 UTC (rev 766)
</span><span class="lines">@@ -0,0 +1,21 @@
</span><ins>+--- !ruby/object:Alexandria::Book
+authors:
+- Francoise Sagan
+- Irene Ash
+edition: Paperback
+isbn: "9780140278781"
+loaned: false
+loaned_since: 2007-10-16 00:00:00 +01:00
+loaned_to: ""
+notes: Essential penguin
+own: true
+publisher: Penguin Books Ltd
+publishing_year: 1998
+rating: 0
+redd: false
+saved_ident: "9780140278781"
+tags: []
+
+title: Bonjour Tristesse
+version: 0.6.2b1
+want: true
</ins></span></pre></div>
<a id="trunkalexandriaspecdatalibraries062MyLibrary9780571147168cover"></a>
<div class="binary"><h4>Added: trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780571147168.cover</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<span class="cx">Property changes on: trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780571147168.cover
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:mime-type
</span><span class="cx"> + application/octet-stream
</span><a id="trunkalexandriaspecdatalibraries062MyLibrary9780571147168yaml"></a>
<div class="addfile"><h4>Added: trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780571147168.yaml (0 => 766)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780571147168.yaml         (rev 0)
+++ trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780571147168.yaml        2007-10-23 18:49:53 UTC (rev 766)
</span><span class="lines">@@ -0,0 +1,20 @@
</span><ins>+--- !ruby/object:Alexandria::Book
+authors:
+- Kazuo Ishiguro
+edition: Paperback
+isbn: "9780571147168"
+loaned: true
+loaned_since: 2007-10-12 00:00:00 +01:00
+loaned_to: Fred
+notes: ""
+own: true
+publisher: Faber and Faber
+publishing_year: 1999
+rating: 4
+redd: false
+saved_ident: "9780571147168"
+tags: []
+
+title: An Artist of the Floating World
+version: 0.6.2b1
+want: true
</ins></span></pre></div>
<a id="trunkalexandriaspecdatalibraries062MyLibrary9780575079038cover"></a>
<div class="binary"><h4>Added: trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780575079038.cover</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<span class="cx">Property changes on: trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780575079038.cover
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:mime-type
</span><span class="cx"> + application/octet-stream
</span><a id="trunkalexandriaspecdatalibraries062MyLibrary9780575079038yaml"></a>
<div class="addfile"><h4>Added: trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780575079038.yaml (0 => 766)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780575079038.yaml         (rev 0)
+++ trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780575079038.yaml        2007-10-23 18:49:53 UTC (rev 766)
</span><span class="lines">@@ -0,0 +1,20 @@
</span><ins>+--- !ruby/object:Alexandria::Book
+authors:
+- Ursula Le Guin
+edition: Paperback
+isbn: "9780575079038"
+loaned: true
+loaned_since: 2007-10-22 00:00:00 +01:00
+loaned_to: Jason Brown
+notes: Gollancz S.F.
+own: true
+publisher: Gollancz
+publishing_year: 2006
+rating: 4
+redd: true
+saved_ident: "9780575079038"
+tags: []
+
+title: The Dispossessed
+version: 0.6.2b1
+want: true
</ins></span></pre></div>
<a id="trunkalexandriaspecdatalibraries062MyLibrary9780755322800cover"></a>
<div class="binary"><h4>Added: trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780755322800.cover</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<span class="cx">Property changes on: trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780755322800.cover
</span><span class="cx">___________________________________________________________________
</span><span class="cx">Name: svn:mime-type
</span><span class="cx"> + application/octet-stream
</span><a id="trunkalexandriaspecdatalibraries062MyLibrary9780755322800yaml"></a>
<div class="addfile"><h4>Added: trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780755322800.yaml (0 => 766)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780755322800.yaml         (rev 0)
+++ trunk/alexandria/spec/data/libraries/0.6.2/My Library/9780755322800.yaml        2007-10-23 18:49:53 UTC (rev 766)
</span><span class="lines">@@ -0,0 +1,20 @@
</span><ins>+--- !ruby/object:Alexandria::Book
+authors:
+- Neil Gaiman
+edition: Paperback
+isbn: "9780755322800"
+loaned: false
+loaned_since: 2007-10-16 00:00:00 +01:00
+loaned_to: ""
+notes: The Author's Preferred Text
+own: true
+publisher: Headline Review
+publishing_year: 2005
+rating: 5
+redd: false
+saved_ident: "9780755322800"
+tags:
+- preferred
+title: Neverwhere
+version: 0.6.2b1
+want: true
</ins></span></pre>
</div>
</div>
</body>
</html>