root/trunk/Forms/frm_book_info.pas

464465
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
// ------------------------------------------------------------------------------