root/trunk/Forms/frm_book_info.pas
| 464 | 465 | ||
|---|---|---|---|
7 | * Authors Aleksey Penkov alex.penkov@gmail.com | 7 | * Authors Aleksey Penkov alex.penkov@gmail.com |
8 | * Nick Rymanov nrymanov@gmail.com | 8 | * Nick Rymanov nrymanov@gmail.com |
9 | * | 9 | * |
10 | * History | ||
11 | * NickR 02.03.2010 Код переформатирован * Отдельная закладка для свойств файла * | ||
10 | ****************************************************************************** *) | 12 | ****************************************************************************** *) |
11 | 13 | ||
12 | unit frm_book_info; | 14 | unit frm_book_info; |
... | ... | ||
30 | ExtCtrls, | 34 | ExtCtrls, |
31 | StdCtrls, | 35 | StdCtrls, |
32 | ComCtrls, | 36 | ComCtrls, |
33 | unit_Globals; | 37 | unit_Globals, |
38 | Menus, | ||
39 | ActnList; | ||
34 | 40 | ||
35 | type | 41 | type |
36 | TfrmBookDetails = class(TForm) | 42 | TfrmBookDetails = class(TForm) |
37 | RzPageControl1: TPageControl; | 43 | pcBookInfo: TPageControl; |
38 | tsInfo: TTabSheet; | 44 | tsInfo: TTabSheet; |
39 | tsReview: TTabSheet; | 45 | tsReview: TTabSheet; |
40 | mmShort: TMemo; | 46 | mmShort: TMemo; |
... | ... | ||
49 | lvInfo: TListView; | 55 | lvInfo: TListView; |
50 | lblTitle: TLabel; | 56 | lblTitle: TLabel; |
51 | pnReviewButtons: TPanel; | 57 | pnReviewButtons: TPanel; |
58 | tsFileInfo: TTabSheet; | ||
59 | lvFileInfo: TListView; | ||
60 | pmBookInfo: TPopupMenu; | ||
61 | alBookInfo: TActionList; | ||
62 | acCopyValue: TAction; | ||
63 | miCopyValue: TMenuItem; | ||
52 | procedure FormCreate(Sender: TObject); | 64 | procedure FormCreate(Sender: TObject); |
53 | procedure FormShow(Sender: TObject); | 65 | procedure FormShow(Sender: TObject); |
54 | procedure mmReviewChange(Sender: TObject); | 66 | procedure mmReviewChange(Sender: TObject); |
55 | procedure btnLoadReviewClick(Sender: TObject); | 67 | procedure btnLoadReviewClick(Sender: TObject); |
56 | procedure btnClearReviewClick(Sender: TObject); | 68 | procedure btnClearReviewClick(Sender: TObject); |
69 | procedure acCopyValueExecute(Sender: TObject); | ||
70 | procedure acCopyValueUpdate(Sender: TObject); | ||
57 | 71 | ||
58 | private | 72 | private |
59 | FUrl: string; | 73 | FUrl: string; |
60 | |||
61 | FReviewChanged: Boolean; | 74 | FReviewChanged: Boolean; |
62 | //FBookRecord: TBookRecord; | ||
63 | function GetReview: string; | 75 | function GetReview: string; |
64 | procedure SetReview(const Value: string); | 76 | procedure SetReview(const Value: string); |
65 | //procedure SetBookRecord(const Value: TBookRecord); | ||
66 | 77 | ||
67 | public | 78 | public |
68 | procedure AllowOnlineReview(URL: string); | 79 | procedure AllowOnlineReview(URL: string); |
... | ... | ||
73 | property Review: string read GetReview write SetReview; | 84 | property Review: string read GetReview write SetReview; |
74 | property ReviewChanged: Boolean read FReviewChanged write FReviewChanged; | 85 | property ReviewChanged: Boolean read FReviewChanged write FReviewChanged; |
75 | property URL: string read FUrl write FUrl; | 86 | property URL: string read FUrl write FUrl; |
76 | //property Book: TBookRecord read FBookRecord write SetBookRecord; | ||
77 | end; | 87 | end; |
78 | 88 | ||
79 | TReviewDownloadThread = class(TThread) | 89 | TReviewDownloadThread = class(TThread) |
... | ... | ||
99 | implementation | 109 | implementation |
100 | 110 | ||
101 | uses | 111 | uses |
112 | Clipbrd, | ||
102 | FictionBook_21, | 113 | FictionBook_21, |
103 | unit_Settings, | 114 | unit_Settings, |
104 | unit_ReviewParser, | 115 | unit_ReviewParser, |
... | ... | ||
112 | 123 | ||
113 | procedure TfrmBookDetails.FormCreate(Sender: TObject); | 124 | procedure TfrmBookDetails.FormCreate(Sender: TObject); |
114 | begin | 125 | begin |
126 | lvFileInfo.ShowColumnHeaders := False; | ||
115 | lvInfo.ShowColumnHeaders := False; | 127 | lvInfo.ShowColumnHeaders := False; |
116 | FReviewChanged := False; | 128 | FReviewChanged := False; |
117 | end; | 129 | end; |
118 | 130 | ||
131 | procedure TfrmBookDetails.acCopyValueExecute(Sender: TObject); | ||
132 | begin | ||
133 | if pcBookInfo.ActivePage = tsFileInfo then | ||
134 | begin | ||
135 | Assert(Assigned(lvFileInfo.Selected)); | ||
136 | Clipboard.AsText := lvFileInfo.Selected.SubItems[0]; | ||
137 | end | ||
138 | else if pcBookInfo.ActivePage = tsInfo then | ||
139 | begin | ||
140 | Assert(Assigned(lvInfo.Selected)); | ||
141 | Clipboard.AsText := lvInfo.Selected.SubItems[0]; | ||
142 | end; | ||
143 | end; | ||
144 | |||
145 | procedure TfrmBookDetails.acCopyValueUpdate(Sender: TObject); | ||
146 | begin | ||
147 | if pcBookInfo.ActivePage = tsFileInfo then | ||
148 | begin | ||
149 | acCopyValue.Enabled := Assigned(lvFileInfo.Selected); | ||
150 | end | ||
151 | else if pcBookInfo.ActivePage = tsInfo then | ||
152 | begin | ||
153 | acCopyValue.Enabled := Assigned(lvInfo.Selected); | ||
154 | end | ||
155 | else | ||
156 | acCopyValue.Enabled := False; | ||
157 | end; | ||
158 | |||
119 | procedure TfrmBookDetails.AllowOnlineReview(URL: string); | 159 | procedure TfrmBookDetails.AllowOnlineReview(URL: string); |
120 | begin | 160 | begin |
121 | FUrl := URL; | 161 | FUrl := URL; |
... | ... | ||
154 | procedure TfrmBookDetails.FormShow(Sender: TObject); | 194 | procedure TfrmBookDetails.FormShow(Sender: TObject); |
155 | begin | 195 | begin |
156 | // TODO перенести под конец заполнения ? | 196 | // TODO перенести под конец заполнения ? |
197 | ListView_SetColumnWidth(lvFileInfo.Handle, 0, LVSCW_AUTOSIZE); | ||
198 | ListView_SetColumnWidth(lvFileInfo.Handle, 1, LVSCW_AUTOSIZE); | ||
157 | ListView_SetColumnWidth(lvInfo.Handle, 0, LVSCW_AUTOSIZE); | 199 | ListView_SetColumnWidth(lvInfo.Handle, 0, LVSCW_AUTOSIZE); |
158 | ListView_SetColumnWidth(lvInfo.Handle, 1, LVSCW_AUTOSIZE); | 200 | ListView_SetColumnWidth(lvInfo.Handle, 1, LVSCW_AUTOSIZE); |
159 | end; | 201 | end; |
... | ... | ||
179 | Download; | 221 | Download; |
180 | end; | 222 | end; |
181 | 223 | ||
182 | //procedure TfrmBookDetails.SetBookRecord(const Value: TBookRecord); | ||
183 | //begin | ||
184 | // FBookRecord := Value; | ||
185 | // lblTitle.Caption := FBookRecord.Title; | ||
186 | { TODO -oNickR -cUsability : может стоит показывать всех авторов? и формировать имя автора более сложным алгоритмом } | ||
187 | // lblAuthors.Caption := FBookRecord.Authors[0].GetFullName; | ||
188 | //end; | ||
189 | |||
190 | procedure TfrmBookDetails.SetReview(const Value: string); | 224 | procedure TfrmBookDetails.SetReview(const Value: string); |
191 | begin | 225 | begin |
192 | mmReview.Lines.Text := Value; | 226 | mmReview.Lines.Text := Value; |
... | ... | ||
199 | imgBookCover: TGraphic; | 233 | imgBookCover: TGraphic; |
200 | tmpStr: string; | 234 | tmpStr: string; |
201 | 235 | ||
202 | procedure AddItem(const Field: string; const Value: string; GroupID: integer = -1); | 236 | procedure AddItem(listView: TListView; const Field: string; const Value: string; GroupID: integer = -1); |
203 | var | 237 | var |
204 | item: TListItem; | 238 | item: TListItem; |
205 | begin | 239 | begin |
206 | item := lvInfo.Items.Add; | 240 | if Trim(Value) <> '' then |
207 | item.Caption := Field; | 241 | begin |
208 | item.SubItems.Add(Value); | 242 | item := listView.Items.Add; |
209 | item.GroupID := GroupID; | 243 | item.Caption := Field; |
244 | item.SubItems.Add(Value); | ||
245 | item.GroupID := GroupID; | ||
246 | end; | ||
210 | end; | 247 | end; |
211 | 248 | ||
212 | begin | 249 | begin |
... | ... | ||
216 | lblTitle.Caption := bookInfo.Title; | 253 | lblTitle.Caption := bookInfo.Title; |
217 | lblAuthors.Caption := bookInfo.Authors[0].GetFullName; | 254 | lblAuthors.Caption := bookInfo.Authors[0].GetFullName; |
218 | 255 | ||
219 | with lvInfo.Groups.Add do | 256 | with lvFileInfo.Groups.Add do |
220 | begin | 257 | begin |
221 | Header := 'Информация о файле'; | 258 | Header := 'Информация о файле'; |
222 | AddItem('Папка', bookInfo.Folder, GroupID); | 259 | AddItem(lvFileInfo, 'Папка', bookInfo.Folder, GroupID); |
223 | AddItem('Файл', bookInfo.FileName, GroupID); | 260 | AddItem(lvFileInfo, 'Файл', bookInfo.FileName, GroupID); |
224 | AddItem('Размер', GetFormattedSize(bookInfo.Size, True), GroupID); | 261 | AddItem(lvFileInfo, 'Размер', GetFormattedSize(bookInfo.Size, True), GroupID); |
225 | AddItem('Добавлен', DateToStr(bookInfo.Date), GroupID); | 262 | AddItem(lvFileInfo, 'Добавлен', DateToStr(bookInfo.Date), GroupID); |
226 | end; | 263 | end; |
227 | { TODO -oNickR -cUsability : для онлайн коллекций необходимо показывать следующие поля } | 264 | { TODO -oNickR -cUsability : для онлайн коллекций необходимо показывать следующие поля } |
228 | // libID: Integer; ??? | 265 | // libID: Integer; ??? |
... | ... | ||
230 | // URI: string; ??? | 267 | // URI: string; ??? |
231 | 268 | ||
232 | // | 269 | // |
233 | // Покажем информацию из файла
// Покажем информацию из книги
| 270 | // TODO : здесь на самом деле нужно более общее решение. Может со временем мы научимся вытаскивать инфу из pdf и других форматов
|
234 | // | 271 | // |
235 | if not Assigned(bookStream) or (bookStream.Size = 0) then | 272 | if not Assigned(bookStream) or (bookStream.Size = 0) then |
236 | begin | 273 | begin |
237 | imgCover.Visible := False; | 274 | tsInfo.TabVisible := False; |
238 | mmShort.Visible := False; | ||
239 | Exit; | 275 | Exit; |
240 | end; | 276 | end; |
241 | 277 | ||
242 | //FS.SaveToFile('C:\temp\book.xml'); | 278 | // FS.SaveToFile('C:\temp\book.xml'); |
243 | try | 279 | try |
244 | book := LoadFictionbook(bookStream); | 280 | book := LoadFictionbook(bookStream); |
245 | 281 | ||
... | ... | ||
259 | else | 296 | else |
260 | imgCover.Visible := False; | 297 | imgCover.Visible := False; |
261 | 298 | ||
262 | with book.Description.Titleinfo do | 299 | // --------------------------------------------- |
300 | with book.Description.Titleinfo, lvInfo.Groups.Add do | ||
263 | begin | 301 | begin |
264 | // --------------------------------------------- | 302 | Header := 'Общая информация'; |
265 | with lvInfo.Groups.Add do | 303 | |
304 | AddItem(lvInfo, 'Название', Booktitle.Text, GroupID); | ||
305 | |||
306 | for i := 0 to Author.Count - 1 do | ||
266 | begin | 307 | begin |
267 | Header := 'Общая информация'; | 308 | with Author[i] do |
309 | tmpStr := TAuthorRecord.FormatName(Lastname.Text, Firstname.Text, Middlename.Text, NickName.Text); | ||
310 | AddItem(lvInfo, IfThen(i = 0, 'Автор(ы)'), tmpStr, GroupID); | ||
311 | end; | ||
268 | 312 | ||
269 | { TODO -oNickR -cUsability : может стоит показывать всех авторов? и формировать имя автора более сложным алгоритмом } | 313 | { TODO -oNickR -cUsability : показывать номер в серии } |
270 | //if Author.Count > 0 then | 314 | for i := 0 to Sequence.Count - 1 do |
271 | // lblAuthors.Caption := Author[0].Lastname.Text + ' ' + Author[0].Firstname.Text + ' ' + Author[0].MiddleName.Text; | 315 | begin |
316 | AddItem(lvInfo, IfThen(i = 0, 'Серия'), Sequence[i].Name, GroupID); | ||
317 | end; | ||
272 | 318 | ||
273 | { TODO -oNickR -cUsability : показывать все серии + номер в серии } | 319 | { TODO -oNickR -cUsability : показывать алиасы вместо внутренних имен } |
274 | if Sequence.Count > 0 then | 320 | for i := 0 to Genre.Count - 1 do |
275 | AddItem('Серия', Sequence[0].Name, GroupID); | 321 | begin |
322 | AddItem(lvInfo, IfThen(i = 0, 'Жанр'), Genre[i], GroupID); | ||
323 | end; | ||
276 | 324 | ||
277 | { TODO -oNickR -cUsability : показывать все жанры + Алиасы вместо внутренних имен } | 325 | AddItem(lvInfo, 'Ключевые слова', Keywords.Text, GroupID); |
278 | if Genre.Count > 0 then | 326 | AddItem(lvInfo, 'Дата', Date.Text, GroupID); |
279 | AddItem('Жанр', Genre[0], GroupID); | 327 | AddItem(lvInfo, 'Язык книги', Lang, GroupID); |
328 | AddItem(lvInfo, 'Язык оригинала', Srclang, GroupID); | ||
329 | |||
330 | for i := 0 to Translator.Count - 1 do | ||
331 | begin | ||
332 | with Translator[i] do | ||
333 | tmpStr := TAuthorRecord.FormatName(Lastname.Text, Firstname.Text, Middlename.Text, NickName.Text); | ||
334 | AddItem(lvInfo, IfThen(i = 0, 'Переводчик(и)'), tmpStr, GroupID); | ||
280 | end; | 335 | end; |
336 | end; | ||
281 | 337 | ||
282 | // --------------------------------------------- | 338 | // --------------------------------------------- |
283 | with lvInfo.Groups.Add, book.Description.Publishinfo do | 339 | with book.Description.Publishinfo, lvInfo.Groups.Add do |
340 | begin | ||
341 | Header := 'Издательская информация'; | ||
342 | |||
343 | AddItem(lvInfo, 'Название', Bookname.Text, GroupID); | ||
344 | |||
345 | AddItem(lvInfo, 'Издательство', Publisher.Text, GroupID); | ||
346 | AddItem(lvInfo, 'Город', City.Text, GroupID); | ||
347 | AddItem(lvInfo, 'Год', Year, GroupID); | ||
348 | AddItem(lvInfo, 'ISBN', Isbn.Text, GroupID); | ||
349 | |||
350 | { TODO -oNickR -cUsability : показывать номер в серии } | ||
351 | for i := 0 to Sequence.Count - 1 do | ||
284 | begin | 352 | begin |
285 | Header := 'Издательская информация'; | 353 | AddItem(lvInfo, IfThen(i = 0, 'Серия'), Sequence[i].Name, GroupID); |
286 | AddItem('Издательство', Publisher.Text, GroupID); | ||
287 | AddItem('Город', City.Text, GroupID); | ||
288 | AddItem('Год', Year, GroupID); | ||
289 | AddItem('ISBN', Isbn.Text, GroupID); | ||
290 | end; | 354 | end; |
355 | end; | ||
291 | 356 | ||
292 | // --------------------------------------------- | 357 | // --------------------------------------------- |
293 | with lvInfo.Groups.Add, book.Description.Documentinfo do | 358 | with book.Description.Documentinfo, lvInfo.Groups.Add do |
359 | begin | ||
360 | Header := 'Информация о документе (OCR)'; | ||
361 | for i := 0 to Author.Count - 1 do | ||
294 | begin | 362 | begin |
295 | Header := 'Информация о документе (OCR)'; | 363 | with Author[i] do |
296 | for i := 0 to Author.Count - 1 do | 364 | tmpStr := TAuthorRecord.FormatName(Lastname.Text, Firstname.Text, Middlename.Text, NickName.Text); |
297 | begin | 365 | AddItem(lvInfo, IfThen(i = 0, 'Авторы'), tmpStr, GroupID); |
298 | { TODO -oNickR -cUsability : может стоит формировать имя автора более сложным алгоритмом } | 366 | end; |
299 | tmpStr := Author[i].Firstname.Text + ' ' + Author[i].Lastname.Text + '(' + Author[i].NickName.Text + ')'; | ||
300 | AddItem(IfThen(i = 0, 'Авторы'), tmpStr, GroupID); | ||
301 | end; | ||
302 | 367 | ||
303 | AddItem('Программа', Programused.Text, GroupID); | 368 | AddItem(lvInfo, 'Программа', Programused.Text, GroupID); |
304 | AddItem('Дата', Date.Text, GroupID); | 369 | AddItem(lvInfo, 'Дата', Date.Text, GroupID); |
305 | AddItem('ID', Id, GroupID); | 370 | AddItem(lvInfo, 'ID', book.Description.Documentinfo.Id, GroupID); |
306 | AddItem('Версия', Version, GroupID); | 371 | AddItem(lvInfo, 'Версия', Version, GroupID); |
307 | 372 | ||
308 | for i := 0 to History.p.Count - 1 do | 373 | for i := 0 to Srcurl.Count - 1 do |
309 | AddItem(IfThen(i = 0, 'История'), History.p[i].OnlyText, GroupID); | 374 | begin |
375 | AddItem(lvInfo, IfThen(i = 0, 'Источник'), Srcurl[i], GroupID); | ||
310 | end; | 376 | end; |
377 | AddItem(lvInfo, 'Автор источника', Srcocr.Text, GroupID); | ||
311 | 378 | ||
312 | // --------------------------------------------- | 379 | AddItem(lvInfo, IfThen(i = 0, 'История'), History.p[i].OnlyText, GroupID); |
313 | { TODO -oNickR -cUsability : может стоит добавлять параграфы как есть? }
for i := 0 to History.p.Count - 1 do | 380 | end; |
381 | |||
382 | // --------------------------------------------- | ||
383 | { TODO -oNickR -cUsability : может стоит добавлять параграфы как есть? }
with book.Description.Titleinfo do | ||
384 | begin | ||
314 | for i := 0 to Annotation.p.Count - 1 do | 385 | for i := 0 to Annotation.p.Count - 1 do |
315 | mmShort.Lines.Add(Annotation.p[i].OnlyText); | 386 | mmShort.Lines.Add(Annotation.p[i].OnlyText); |
316 | end; | 387 | end; |
... | ... | ||
320 | end; | 393 | end; |
321 | end; | 394 | end; |
322 | 395 | ||
323 | {-------------------- TReviewDownloadThread ----------------------------------- } | 396 | { -------------------- TReviewDownloadThread ----------------------------------- } |
324 | 397 | ||
325 | procedure TReviewDownloadThread.Execute; | 398 | procedure TReviewDownloadThread.Execute; |
326 | var | 399 | var |
... | ... | ||
355 | FForm.mmReview.Lines := FReview; | 428 | FForm.mmReview.Lines := FReview; |
356 | FForm.btnLoadReview.Enabled := True; | 429 | FForm.btnLoadReview.Enabled := True; |
357 | FForm.ReviewChanged := True; | 430 | FForm.ReviewChanged := True; |
358 | //FForm.RzPageControl1.ActivePageIndex := 1; | 431 | // FForm.RzPageControl1.ActivePageIndex := 1; |
359 | end; | 432 | end; |
360 | 433 | ||
361 | // ------------------------------------------------------------------------------ | 434 | // ------------------------------------------------------------------------------ |
Download diff