~writer-devs/writer/trunk

« back to all changes in this revision

Viewing changes to src/Utils/FileExporter.vala

  • Committer: Anthony Huben
  • Date: 2015-04-10 17:41:55 UTC
  • mfrom: (75.3.1 writer)
  • Revision ID: harp37@gmail.com-20150410174155-8ic5k14zlxj2i6il
Added FileExporter.vala.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***
 
2
The MIT License (MIT)
 
3
 
 
4
Copyright (c) 2014 Anthony Huben
 
5
 
 
6
Permission is hereby granted, free of charge, to any person obtaining a copy
 
7
of this software and associated documentation files (the "Software"), to deal
 
8
in the Software without restriction, including without limitation the rights
 
9
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 
10
copies of the Software, and to permit persons to whom the Software is
 
11
furnished to do so, subject to the following conditions:
 
12
 
 
13
The above copyright notice and this permission notice shall be included in all
 
14
copies or substantial portions of the Software.
 
15
 
 
16
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 
17
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
18
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 
19
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
20
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 
21
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 
22
SOFTWARE.
 
23
 
 
24
Inspired by Footnote.
 
25
***/
 
26
 
 
27
namespace Writer.Utils {
 
28
 
 
29
    public class ExportDialog : Gtk.FileChooserDialog {
 
30
 
 
31
        GLib.HashTable<string, string> files;
 
32
        string current_ext = "";
 
33
 
 
34
        const string DEFAULT = "text/rtf";
 
35
        const int PREFS_NUM = 1;
 
36
 
 
37
        signal void filter_changed ();
 
38
 
 
39
        public ExportDialog.export_document (List<Note> notes, string title, Gtk.Window window) {
 
40
            string[] bins = {"pdf"};
 
41
 
 
42
            files = new GLib.HashTable<string, string> (str_hash, str_equal);
 
43
            files["text/rtf"] = "Rich Text Format (.rtf)";
 
44
            files["application/pdf"] = "Portable Document Format (.pdf)";
 
45
            build ();
 
46
 
 
47
            var default_name = files[DEFAULT];
 
48
            var default_ext = default_name[default_name.index_of ("(")+1:-1];
 
49
            set_current_name (title + default_ext);
 
50
            current_ext = default_ext;
 
51
 
 
52
            string str = "";
 
53
 
 
54
            notify.connect ( (p)=> {
 
55
                if (p.get_name () == "filter")
 
56
                    filter_changed ();
 
57
            });
 
58
 
 
59
            response.connect ( (id)=> {
 
60
                if (id == Gtk.ResponseType.ACCEPT) {
 
61
                    string ext = current_ext[1:current_ext.length];
 
62
 
 
63
                    var output = File.new_for_path (this.get_filename ());
 
64
                    try {output.delete ();} catch (GLib.Error e) {};
 
65
                    var data_stream = new DataOutputStream (output.create (FileCreateFlags.NONE));
 
66
                    switch (ext) {
 
67
                        case "rtf":
 
68
                            // rework to get it working for documents
 
69
                            foreach (Text a in text) {
 
70
                                str += rtf (a);
 
71
                            }
 
72
                            break;
 
73
                    }
 
74
                    data_stream.put_string (str);
 
75
                } catch (GLib.Error e) {
 
76
                    stderr.printf ("Error: %s\n", e.message);
 
77
                }
 
78
            }
 
79
            this.destroy ();
 
80
        }
 
81
    });
 
82
}
 
83
 
 
84
private void build () {
 
85
            set_action (Gtk.FileChooserAction.SAVE);
 
86
            set_title ("");
 
87
            set_create_folders (true);
 
88
            set_do_overwrite_confirmation (true);
 
89
            set_default_response (Gtk.ResponseType.ACCEPT);
 
90
            
 
91
            var entry = new Gtk.Entry ();
 
92
            ((Gtk.Box)get_child ()).get_children ().foreach ( (w)=> {
 
93
                ((Gtk.Container)w).foreach ( (d)=> {
 
94
                    if (d as Gtk.Container != null) {
 
95
                      ((Gtk.Container)d).foreach ( (f)=> {
 
96
                            if (f as Gtk.Container != null) {
 
97
                                ((Gtk.Container)f).foreach ( (g)=> {
 
98
                                    if (g as Gtk.Container != null) {                            
 
99
                                        ((Gtk.Container)g).foreach ( (h)=> {
 
100
                                            if (h as Gtk.Entry != null) {
 
101
                                                entry = (Gtk.Entry)h;
 
102
                                            }
 
103
                                        });
 
104
                                    }
 
105
                                });                         
 
106
                            }
 
107
                        });
 
108
                    }
 
109
                });
 
110
            });
 
111
            
 
112
            filter_changed.connect ( ()=> {
 
113
                var name = entry.get_text ();
 
114
                if (name != null) {
 
115
                    var ext_name = this.get_filter ().get_filter_name ();
 
116
                    var ext = ext_name[ext_name.index_of ("(")+1:-1];
 
117
                    if (name.has_suffix (current_ext))
 
118
                        set_current_name (name[0:-4] + ext);
 
119
                    else
 
120
                        set_current_name (name + ext);
 
121
                    current_ext = ext;
 
122
                }
 
123
            });
 
124
            
 
125
            
 
126
            var cancel = (Gtk.Button)add_button (Gtk.Stock.CANCEL, 1);
 
127
            cancel.clicked.connect ( ()=> {this.destroy ();});
 
128
            add_button (Gtk.Stock.SAVE, Gtk.ResponseType.ACCEPT);
 
129
            
 
130
            files.foreach ( (mime, name) => {
 
131
                var filter = new Gtk.FileFilter ();
 
132
                filter.add_mime_type (mime);
 
133
                filter.set_filter_name (name);
 
134
                this.add_filter (filter);
 
135
                if (DEFAULT in mime)
 
136
                    this.set_filter (filter);
 
137
            });
 
138
                        
 
139
            this.show_all ();
 
140
        }
 
141
        
 
142
        private string rtf (Text a) {
 
143
            string r = "";
 
144
            string body = a.content.buffer.text.replace ("\\", "\\\\");
 
145
            body = body.replace("\a", "\\line\a");
 
146
            string document_body = @"\\cf1\a\\pard $body\\par\a\\line\\line";
 
147
                r += document_body;
 
148
            return r;
 
149
        }
 
150
    }
 
151
}