Add copyright headers to all .cs files
[pdfmod:pdfmod.git] / src / PdfMod / Gui / MetadataEditorBox.cs
1 // Copyright (C) 2009 Novell, Inc.
2 //
3 // This program is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU General Public License
5 // as published by the Free Software Foundation; either version 2
6 // of the License, or (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
16
17 using System;
18
19 using Mono.Unix;
20 using Gtk;
21
22 using PdfMod.Pdf;
23
24 namespace PdfMod.Gui
25 {
26     public class MetadataEditorBox : EventBox
27     {
28         private Client app;
29         private Table table;
30         private Button revert_button;
31         private Document doc;
32
33         private TextProperty [] properties;
34         private TextProperty title, author, keywords, subject;
35
36         public MetadataEditorBox (Client app)
37         {
38             this.app = app;
39             app.DocumentLoaded += HandleDocumentLoaded;
40
41             table = new Table (2, 5, false) {
42                 RowSpacing = 6,
43                 ColumnSpacing = 6,
44                 BorderWidth = 6
45             };
46             Child = table;
47
48             BuildEditor ();
49             BuildButtons ();
50
51             KeyPressEvent += (o, args) => {
52                 if (args.Event.Key == Gdk.Key.Escape) {
53                     Hide ();
54                 }
55             };
56
57             UpdateSensitivity ();
58             ShowAll ();
59         }
60
61         private void BuildEditor ()
62         {
63             title    = new TextProperty (Catalog.GetString ("_Title:"),    t => doc.Title = t);
64             author   = new TextProperty (Catalog.GetString ("_Author:"),   t => doc.Author = t);
65             keywords = new TextProperty (Catalog.GetString ("_Keywords:"), t => doc.Keywords = t);
66             subject  = new TextProperty (Catalog.GetString ("_Subject:"),  t => doc.Subject = t);
67
68             properties = new TextProperty [] { title, author, keywords, subject };
69
70             uint row = 0, column = 0;
71             foreach (var property in properties) {
72                 table.Attach (property.Label, column++, column, row, row + 1, AttachOptions.Fill, 0, 0, 0);
73                 table.Attach (property.Entry, column++, column, row, row + 1, AttachOptions.Fill | AttachOptions.Expand, 0, 0, 0);
74
75                 if (column == 4) {
76                     column = 0;
77                     row++;
78                 }
79
80                 property.Entry.Changed += delegate { UpdateSensitivity (); };
81             }
82         }
83
84         private void BuildButtons ()
85         {
86             revert_button = new Hyena.Widgets.ImageButton (Catalog.GetString ("_Revert Properties"), "revert") {
87                 TooltipText = Catalog.GetString ("Change the document's properties back to the original values")
88             };
89             revert_button.Clicked += HandleRevert;
90
91
92             var close_button = new Hyena.Widgets.ImageButton (Catalog.GetString ("_Close"), Gtk.Stock.Close);
93             close_button.TooltipText = Catalog.GetString ("Hide the document's properties");
94             close_button.Clicked += delegate {
95                 Hide ();
96             };
97
98             table.Attach (revert_button, 4, 5, 0, 1, AttachOptions.Fill, 0, 0, 0);
99             table.Attach (close_button, 4, 5, 1, 2, AttachOptions.Fill, 0, 0, 0);
100         }
101
102         private void UpdateSensitivity ()
103         {
104             Sensitive = app.Document != null;
105
106             bool have_changes = false;
107             foreach (var prop in properties) {
108                 have_changes |= prop.HasChanges;
109             }
110             revert_button.Sensitive = have_changes;
111         }
112
113         #region Event handlers
114
115         private void HandleDocumentLoaded (object o, EventArgs e)
116         {
117             doc = app.Document;
118             var pdf = app.Document.Pdf;
119             var info = pdf.Info;
120             
121             Console.WriteLine ("Author           = {0}", info.Author);
122             Console.WriteLine ("CreationDate     = {0}", info.CreationDate);
123             Console.WriteLine ("Creator          = {0}", info.Creator);
124             Console.WriteLine ("Keywords         = {0}", info.Keywords);
125             Console.WriteLine ("ModificationDate = {0}", info.ModificationDate);
126             Console.WriteLine ("Producer         = {0}", info.Producer);
127             Console.WriteLine ("Subject          = {0}", info.Subject);
128             Console.WriteLine ("Title            = {0}", info.Title);
129             Console.WriteLine ("Page Layout      = {0}", pdf.PageLayout);
130             Console.WriteLine ("Page Mode        = {0}", pdf.PageMode);
131             Console.WriteLine ("SecurityLevel    = {0}", pdf.SecuritySettings.DocumentSecurityLevel);
132             //Console.WriteLine ("OwnerPassword    = {0}", pdf.SecuritySettings.OwnerPassword);
133             //Console.WriteLine ("UserPassword     = {0}", pdf.SecuritySettings.UserPassword);
134             Console.WriteLine ("Settings.TrimMgns= {0}", pdf.Settings.TrimMargins);
135             Console.WriteLine ("Version          = {0}", pdf.Version);
136             Console.WriteLine ("# Outlines       = {0}", pdf.Outlines.Count);
137             Console.WriteLine ("NoCompression    = {0}", pdf.Options.NoCompression);
138             //Console.WriteLine ("CompressionMode  = {0}", pdf.CustomValues.CompressionMode);
139
140             var prefs = pdf.ViewerPreferences;
141             Console.WriteLine ("\nViewPreferences:");
142             Console.WriteLine ("CenterWindow     = {0}", prefs.CenterWindow);
143             Console.WriteLine ("Direction        = {0}", prefs.Direction);
144             Console.WriteLine ("DisplayDocTitle  = {0}", prefs.DisplayDocTitle);
145             Console.WriteLine ("FitWindow        = {0}", prefs.FitWindow);
146             Console.WriteLine ("HideMenubar      = {0}", prefs.HideMenubar);
147             Console.WriteLine ("HideToolbar      = {0}", prefs.HideToolbar);
148             Console.WriteLine ("HideWindowUI     = {0}", prefs.HideWindowUI);
149
150             title.SetDefault (doc.Title);
151             author.SetDefault (doc.Author);
152             keywords.SetDefault (doc.Keywords);
153             subject.SetDefault (doc.Subject);
154             UpdateSensitivity ();
155         }
156
157         private void HandleRevert (object o, EventArgs args)
158         {
159             foreach (var prop in properties) {
160                 prop.Revert ();
161             }
162             revert_button.Sensitive = false;
163         }
164
165         #endregion
166
167         #region Gtk.Widget overrides
168
169         public new void Hide ()
170         {
171             (app.Actions["Properties"] as Gtk.ToggleAction).Active = false;
172             base.Hide ();
173             app.IconView.GrabFocus ();
174         }
175
176         public new void GrabFocus ()
177         {
178             title.Entry.GrabFocus ();
179         }
180
181         #endregion
182
183         private class TextProperty
184         {
185             public Entry Entry { get; private set; }
186             public Label Label { get; private set; }
187             private string initial_value;
188
189             private Hyena.Gui.EditableUndoAdapter<Entry> undo_adapter;
190             private Action<string> on_updated;
191
192             public TextProperty (string label, Action<string> onUpdated)
193             {
194                 this.on_updated = onUpdated;
195
196                 Entry = new Entry ();
197                 Entry.Changed += (o, a) => {
198                     on_updated (Entry.Text);
199                 };
200                 undo_adapter = new Hyena.Gui.EditableUndoAdapter<Entry> (Entry);
201                 undo_adapter.Connect ();
202                 Label = new Label (label) {
203                     MnemonicWidget = Entry,
204                     Xalign = 1.0f
205                 };
206             }
207
208             public void SetDefault (string default_value)
209             {
210                 this.initial_value = default_value;
211                 Entry.Text = default_value ?? "";
212                 undo_adapter.UndoManager.Clear ();
213             }
214
215             public void Revert ()
216             {
217                 Entry.Text = initial_value ?? "";
218                 undo_adapter.UndoManager.Clear ();
219             }
220
221             public bool HasChanges { get { return undo_adapter.UndoManager.CanUndo; } }
222         }
223     }
224 }