root/trunk/Forms/frm_add_nonfb2.pas

342465
1
(* *****************************************************************************
2
  *
3
  * MyHomeLib
4
  *
5
  * Copyright (C) 2008-2010 Aleksey Penkov
6
  *
7
  * Created             22.02.2010
8
  * Description
9
  * Author(s)           Aleksey Penkov  alex.penkov@gmail.com
10
  *
11
  * History
12
  * NickR 02.03.2010    Код переформатирован
  *
13
  ****************************************************************************** *)
1
14
2
{******************************************************************************}
3
{                                                                              }
4
{                                 MyHomeLib                                    }
5
{                                                                              }
6
{                                Version 0.9                                   }
7
{                                20.08.2008                                    }
8
{                    Copyright (c) Aleksey Penkov  alex.penkov@gmail.com       }
9
{                                                                              }
10
{******************************************************************************}
11
12
unit frm_add_nonfb2;
15
unit frm_add_nonfb2;
13
16
14
interface
17
interface
...
...
46
  RzLabel,
50
  RzLabel,
47
  RzRadChk,
51
  RzRadChk,
48
  FBDDocument,
52
  FBDDocument,
49
  FBDAuthorTable, XPMan;
53
  FBDAuthorTable;
50
54
51
type
55
type
52
  TfrmAddnonfb2 = class(TForm)
56
  TfrmAddnonfb2 = class(TForm)
...
...
115
    btnOpenBook: TRzBitBtn;
119
    btnOpenBook: TRzBitBtn;
116
    FBD: TFBDDocument;
120
    FBD: TFBDDocument;
117
    alBookAuthors: TFBDAuthorTable;
121
    alBookAuthors: TFBDAuthorTable;
118
    XPManifest1: TXPManifest;
119
    alFBDAuthors: TFBDAuthorTable;
122
    alFBDAuthors: TFBDAuthorTable;
120
    btnAddAuthorFromList: TRzBitBtn;
123
    btnAddAuthorFromList: TRzBitBtn;
121
    procedure RzButton3Click(Sender: TObject);
124
    procedure RzButton3Click(Sender: TObject);
122
    procedure TreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
125
    procedure TreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
123
      Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
124
    procedure TreeDblClick(Sender: TObject);
126
    procedure TreeDblClick(Sender: TObject);
125
    procedure TreeChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
127
    procedure TreeChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
126
    procedure btnAddClick(Sender: TObject);
128
    procedure btnAddClick(Sender: TObject);
127
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
129
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
128
    procedure TreePaintText(Sender: TBaseVirtualTree;
130
    procedure TreePaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType);
129
      const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
130
      TextType: TVSTTextType);
131
    procedure btnShowGenresClick(Sender: TObject);
131
    procedure btnShowGenresClick(Sender: TObject);
132
    procedure FormShow(Sender: TObject);
132
    procedure FormShow(Sender: TObject);
133
    procedure btnCopyToTitleClick(Sender: TObject);
133
    procedure btnCopyToTitleClick(Sender: TObject);
...
...
139
    procedure miOpenExplorerClick(Sender: TObject);
139
    procedure miOpenExplorerClick(Sender: TObject);
140
    procedure miRenameFileClick(Sender: TObject);
140
    procedure miRenameFileClick(Sender: TObject);
141
    procedure flFilesDirectory(Sender: TObject; const Dir: string);
141
    procedure flFilesDirectory(Sender: TObject; const Dir: string);
142
    procedure TreeCompareNodes(Sender: TBaseVirtualTree; Node1,
142
    procedure TreeCompareNodes(Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
143
      Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
144
    procedure TreeClick(Sender: TObject);
143
    procedure TreeClick(Sender: TObject);
145
    procedure btnLoadClick(Sender: TObject);
144
    procedure btnLoadClick(Sender: TObject);
146
    procedure btnPasteCoverClick(Sender: TObject);
145
    procedure btnPasteCoverClick(Sender: TObject);
...
...
152
  private
151
  private
153
    FBookRecord: TBookRecord;
152
    FBookRecord: TBookRecord;
154
    FFolder: string;
153
    FFolder: string;
155
    
154
156
    procedure PrepareBookRecord;
155
    procedure PrepareBookRecord;
157
    procedure CommitData;
156
    procedure CommitData;
158
157
159
    procedure ScanFolder;
158
    procedure ScanFolder;
160
    procedure FillLists;
159
    procedure FillLists;
161
    procedure SortTree;
160
    procedure SortTree;
162
    function FillFBDData: boolean;
161
    function FillFBDData: Boolean;
163
  public
162
  public
164
163
165
  private
164
  private
166
    FLibrary: TMHLLibrary;
165
    FLibrary: TMHLLibrary;
167
    FRootPath: string;
166
    FRootPath: string;
168
    function CheckEmptyFields(Data: PFileData): boolean;
167
    function CheckEmptyFields(Data: PFileData): Boolean;
169
  end;
168
  end;
170
169
171
var
170
var
...
...
180
  unit_TreeUtils,
179
  unit_TreeUtils,
181
  unit_Consts,
180
  unit_Consts,
182
  unit_Settings,
181
  unit_Settings,
182
  unit_MHLHelpers,
183
  unit_Helpers,
183
  unit_Helpers,
184
  frm_author_list;
184
  frm_author_list;
185
186
{$R *.dfm}
185
{$R *.dfm}
187
186
188
procedure TfrmAddnonfb2.FillLists;
187
procedure TfrmAddnonfb2.FillLists;
...
...
212
211
213
procedure TfrmAddnonfb2.btnCopyToFamilyClick(Sender: TObject);
212
procedure TfrmAddnonfb2.btnCopyToFamilyClick(Sender: TObject);
214
var
213
var
215
  Author : TAuthorRecord;
214
  Author: TAuthorRecord;
216
begin
215
begin
217
  Author.Last := trim(edFileName.SelText);
216
  Author.Last := trim(edFileName.SelText);
218
  alBookAuthors.AddRow(Author);
217
  alBookAuthors.AddRow(Author);
...
...
220
219
221
procedure TfrmAddnonfb2.btnCopyToNameClick(Sender: TObject);
220
procedure TfrmAddnonfb2.btnCopyToNameClick(Sender: TObject);
222
var
221
var
223
  Author : TAuthorRecord;
222
  Author: TAuthorRecord;
224
begin
223
begin
225
  if alBookAuthors.Count > 0 then
224
  if alBookAuthors.Count > 0 then
226
  begin
225
  begin
227
    Author :=alBookAuthors.ActiveRecord;
226
    Author := alBookAuthors.ActiveRecord;
228
    Author.First := (trim(edFileName.SelText));
227
    Author.First := (trim(edFileName.SelText));
229
    alBookAuthors.ActiveRecord:= Author;
228
    alBookAuthors.ActiveRecord := Author;
230
  end;
229
  end;
231
end;
230
end;
232
231
...
...
246
  FreeAndNil(FLibrary);
245
  FreeAndNil(FLibrary);
247
  frmMain.DisableControls(True);
246
  frmMain.DisableControls(True);
248
  Settings.ForceConvertToFBD := cbForceConvertToFBD.Checked;
247
  Settings.ForceConvertToFBD := cbForceConvertToFBD.Checked;
249
  CanClose := true;
248
  CanClose := True;
250
end;
249
end;
251
250
252
procedure TfrmAddnonfb2.FormShow(Sender: TObject);
251
procedure TfrmAddnonfb2.FormShow(Sender: TObject);
...
...
269
  FBD.CoverSizeCode := 4;
268
  FBD.CoverSizeCode := 4;
270
end;
269
end;
271
270
272
function TfrmAddnonfb2.FillFBDData:boolean;
271
function TfrmAddnonfb2.FillFBDData: Boolean;
273
var
272
var
274
  I: Integer;
273
  I: Integer;
275
begin
274
begin
...
...
284
    FBD.AddSeries(sltBook, cbSeries.Text, Round(edSN.Value));
283
    FBD.AddSeries(sltBook, cbSeries.Text, Round(edSN.Value));
285
    Genre.Clear;
284
    Genre.Clear;
286
    for I := 0 to High(FBookRecord.Genres) do
285
    for I := 0 to High(FBookRecord.Genres) do
287
      Genre.Add(FBookRecord.Genres[i].GenreFb2Code);
286
      Genre.Add(FBookRecord.Genres[I].GenreFb2Code);
288
  end;
287
  end;
289
288
290
  FBD.SetAuthors(alFBDAuthors.Items, atlFBD);
289
  FBD.SetAuthors(alFBDAuthors.Items, atlFBD);
...
...
311
  edSN.Value := 0;
310
  edSN.Value := 0;
312
  edKeyWords.Text := '';
311
  edKeyWords.Text := '';
313
312
314
315
  edPublisher.Clear;
313
  edPublisher.Clear;
316
  edCity.Clear;
314
  edCity.Clear;
317
  edISBN.Clear;
315
  edISBN.Clear;
...
...
325
var
323
var
326
  Data: PFileData;
324
  Data: PFileData;
327
begin
325
begin
328
  Data := Tree.GetNodedata(Tree.GetFirstSelected);
326
  Data := Tree.GetNodeData(Tree.GetFirstSelected);
329
  if (Data = nil) or (Data.DataType = dtFolder) then
327
  if (Data = nil) or (Data.DataType = dtFolder) then
330
    Exit;
328
    Exit;
331
  ShellExecute(Handle, 'explore', PChar(AnsiLowercase(ExtractFilePath(Data.FullPath))), '', nil, SW_SHOWNORMAL);
329
  ShellExecute(Handle, 'explore', PChar(AnsiLowercase(ExtractFilePath(Data.FullPath))), '', nil, SW_SHOWNORMAL);
332
end;
330
end;
333
331
334
function TfrmAddnonfb2.CheckEmptyFields(Data: PFileData):boolean;
332
function TfrmAddnonfb2.CheckEmptyFields(Data: PFileData): Boolean;
335
begin
333
begin
336
  Result := False;
334
  Result := False;
337
  try
335
  try
...
...
351
349
352
procedure TfrmAddnonfb2.CommitData;
350
procedure TfrmAddnonfb2.CommitData;
353
var
351
var
354
  Next: PvirtualNode;
352
  Next: PVirtualNode;
355
  Data: PFileData;
353
  Data: PFileData;
356
begin
354
begin
357
  FLibrary.InsertBook(FBookRecord, True, True);
355
  FLibrary.InsertBook(FBookRecord, True, True);
...
...
363
  if Next <> nil then
361
  if Next <> nil then
364
    Tree.Selected[Next] := True;
362
    Tree.Selected[Next] := True;
365
  case cbClearOptions.ItemIndex of
363
  case cbClearOptions.ItemIndex of
366
    0: miClearAllClick(nil);
364
    0:
367
    1: alBookAuthors.Clear;
365
      miClearAllClick(nil);
366
    1:
367
      alBookAuthors.Clear;
368
    2:
368
    2:
369
      begin
369
      begin
370
        edT.Text := '';
370
        edT.Text := '';
...
...
376
  TreeChange(Tree, Next);
376
  TreeChange(Tree, Next);
377
377
378
  Data := Tree.GetNodeData(Next);
378
  Data := Tree.GetNodeData(Next);
379
  if (Data <> nil) and (Data.DataType = dtFile)  then
379
  if (Data <> nil) and (Data.DataType = dtFile) then
380
    pcPages.ActivePage := tsBookInfo
380
    pcPages.ActivePage := tsBookInfo
381
  else
381
  else
382
    pcPages.ActivePage := tsFiles;
382
    pcPages.ActivePage := tsFiles;
...
...
388
388
389
begin
389
begin
390
  Screen.Cursor := crHourGlass;
390
  Screen.Cursor := crHourGlass;
391
  frmAddNonFB2.Enabled := False;
391
  frmAddnonfb2.Enabled := False;
392
  try
392
  try
393
    PrepareBookRecord;
393
    PrepareBookRecord;
394
    if cbForceConvertToFBD.Checked then
394
    if cbForceConvertToFBD.Checked then
395
    begin
395
    begin
396
      FBD.New(FRootPath + FBookrecord.Folder, FBookrecord.FileName, FBookrecord.FileExt);
396
      FBD.New(FRootPath + FBookRecord.Folder, FBookRecord.FileName, FBookRecord.FileExt);
397
      if FillFBDData then
397
      if FillFBDData then
398
      begin
398
      begin
399
        FBD.Save(False);
399
        FBD.Save(False);
400
        FBookrecord.FileName := FBookrecord.FileName + ZIP_EXTENSION;
400
        FBookRecord.FileName := FBookRecord.FileName + ZIP_EXTENSION;
401
        CommitData;
401
        CommitData;
402
      end;
402
      end;
403
    end
403
    end
404
      else CommitData;
404
    else
405
      CommitData;
405
  finally
406
  finally
406
    frmAddNonFB2.Enabled := True;
407
    frmAddnonfb2.Enabled := True;
407
    Screen.Cursor := crDefault;
408
    Screen.Cursor := crDefault;
408
  end;
409
  end;
409
end;
410
end;
410
411
411
procedure TfrmAddnonfb2.miRenameFileClick(Sender: TObject);
412
procedure TfrmAddnonfb2.miRenameFileClick(Sender: TObject);
412
var
413
var
413
   NewName: string;
414
  NewName: string;
414
   Data: PFileData;
415
  Data: PFileData;
415
begin
416
begin
416
  btnRenameFile.Enabled := False;
417
  btnRenameFile.Enabled := False;
417
  try
418
  try
418
    Data := Tree.GetNodeData(Tree.GetFirstSelected);
419
    Data := Tree.GetNodeData(Tree.GetFirstSelected);
419
    if CheckEmptyFields(Data) then
420
    if CheckEmptyFields(Data) then
420
    begin
421
    begin
421
      NewName := CheckSymbols(alBookAuthors.ActiveRecord.Last + ' ' +  alBookAuthors.ActiveRecord.First +
422
      NewName := CheckSymbols(alBookAuthors.ActiveRecord.Last + ' ' + alBookAuthors.ActiveRecord.First + ' ' + edT.Text);
422
             ' ' + edT.Text);
423
      if RenameFile(Data.FullPath + Data.FileName + Data.Ext, Data.FullPath + NewName + Data.Ext) then
423
      if RenameFile(Data.FullPath + Data.FileName + Data.Ext, Data.FullPath + NewName + Data.Ext) then
424
      begin
424
      begin
425
        Data.FileName := NewName;
425
        Data.FileName := NewName;
426
        edFileName.Text := NewName;
426
        edFileName.Text := NewName;
427
        Tree.RepaintNode(Tree.GetFirstSelected);
427
        Tree.RepaintNode(Tree.GetFirstSelected);
428
      end
428
      end
429
      else MessageDlg('Переименование не удалось!' + #13 +
429
      else
430
                    'Возможно, файл заблокирован другой программой.',
430
        MessageDlg('Переименование не удалось!' + #13 + 'Возможно, файл заблокирован другой программой.', mtError, [mbOk], 0);
431
                    mtError,[mbOk],0);
432
    end;
431
    end;
433
  finally
432
  finally
434
    btnRenameFile.Enabled := True;
433
    btnRenameFile.Enabled := True;
...
...
446
  Author: TAuthorRecord;
445
  Author: TAuthorRecord;
447
begin
446
begin
448
  Data := Tree.GetNodeData(Tree.GetFirstSelected);
447
  Data := Tree.GetNodeData(Tree.GetFirstSelected);
449
  if not CheckEmptyFields(Data) then Exit;
448
  if not CheckEmptyFields(Data) then
449
    Exit;
450
450
451
  if alBookAuthors.Count > 0 then
451
  if alBookAuthors.Count > 0 then
452
    for Author in alBookAuthors.Items do
452
    for Author in alBookAuthors.Items do
453
      FBookRecord.AddAuthor(Author.Last, Author.First, Author.Middle)
453
      FBookRecord.AddAuthor(Author.Last, Author.First, Author.Middle)
454
  else
454
    else
455
    FBookRecord.AddAuthor('Неизвестный','автор', '');
455
      FBookRecord.AddAuthor('Неизвестный', 'автор', '');
456
456
457
  frmGenreTree.GetSelectedGenres(FBookRecord);
457
  frmGenreTree.GetSelectedGenres(FBookRecord);
458
  FBookRecord.Title := edT.Text;
458
  FBookRecord.Title := edT.Text;
...
...
465
  FBookRecord.FileExt := Data.Ext;
465
  FBookRecord.FileExt := Data.Ext;
466
  FBookRecord.Code := 0;
466
  FBookRecord.Code := 0;
467
  FBookRecord.InsideNo := 0;
467
  FBookRecord.InsideNo := 0;
468
  FBookRecord.SeqNumber := round(edSN.Value);
468
  FBookRecord.SeqNumber := Round(edSN.Value);
469
  FBookRecord.LibID := DMUser.ActiveCollection.ID;
469
  FBookRecord.LibID := DMUser.ActiveCollection.ID;
470
  FBookRecord.Deleted := False;
470
  FBookRecord.Deleted := False;
471
  FBookRecord.Size := Data.Size;
471
  FBookRecord.Size := Data.Size;
472
  FBookRecord.Date := Now;
472
  FBookRecord.Date := Now;
473
  FBookRecord.KeyWords := edKeyWords.Text;
473
  FBookRecord.Keywords := edKeyWords.Text;
474
  FBookRecord.Lang := cbLang.Text;
474
  FBookRecord.Lang := cbLang.Text;
475
end;
475
end;
476
476
477
procedure TfrmAddnonfb2.btnAddAuthorFromListClick(Sender: TObject);
477
procedure TfrmAddnonfb2.btnAddAuthorFromListClick(Sender: TObject);
478
var
478
var
479
  Row : TAuthorRecord;
479
  Row: TAuthorRecord;
480
  Data : PAuthorData;
480
  Data: PAuthorData;
481
  Node: PVirtualNode;
481
  Node: PVirtualNode;
482
begin
482
begin
483
  frmMain.FillAuthorTree(frmAuthorList.tvAuthorList, True);
483
  frmMain.FillAuthorTree(frmAuthorList.tvAuthorList, True);
484
  if frmAuthorList.ShowModal = mrOK then
484
  if frmAuthorList.ShowModal = mrOk then
485
  begin
485
  begin
486
    Node := frmAuthorList.tvAuthorList.GetFirstSelected;
486
    Node := frmAuthorList.tvAuthorList.GetFirstSelected;
487
    while node <> nil do
487
    while Node <> nil do
488
    begin
488
    begin
489
      Data := frmAuthorList.tvAuthorList.GetNodeData(Node);
489
      Data := frmAuthorList.tvAuthorList.GetNodeData(Node);
490
490
491
492
      Row.Last := Data.Last;
491
      Row.Last := Data.Last;
493
      Row.First := Data.First;
492
      Row.First := Data.First;
494
      Row.Middle := Data.Middle;
493
      Row.Middle := Data.Middle;
...
...
510
var
509
var
511
  FileName: string;
510
  FileName: string;
512
begin
511
begin
513
  if GetFileName(fnOpenCoverImage,FileName) then FBD.LoadCoverFromFile(FileName);
512
  if GetFileName(fnOpenCoverImage, FileName) then
513
    FBD.LoadCoverFromFile(FileName);
514
end;
514
end;
515
515
516
procedure TfrmAddnonfb2.btnNextClick(Sender: TObject);
516
procedure TfrmAddnonfb2.btnNextClick(Sender: TObject);
...
...
531
  ParentName: string;
531
  ParentName: string;
532
  Path: string;
532
  Path: string;
533
533
534
  procedure InsertNodeData(Node:PVirtualNode);
534
  procedure InsertNodeData(Node: PVirtualNode);
535
  begin
535
  begin
536
    Data := Tree.GetNodeData(Node);
536
    Data := Tree.GetNodeData(Node);
537
    Data.Title :=  ExtractFileName(ExcludeTrailingPathdelimiter(Path));
537
    Data.Title := ExtractFileName(ExcludeTrailingPathdelimiter(Path));
538
    Data.Folder := Path;
538
    Data.Folder := Path;
539
    Data.DataType := dtFolder;
539
    Data.DataType := dtFolder;
540
  end;
540
  end;
541
541
542
begin
542
begin
543
  Path := ExtractRelativePath(FRootPath, Dir);
543
  Path := ExtractRelativePath(FRootPath, Dir);
544
  if Path = '' then Exit;
544
  if Path = '' then
545
    Exit;
545
546
546
  ParentName := ExtractFilePath(ExcludeTrailingPathdelimiter(Path));
547
  ParentName := ExtractFilePath(ExcludeTrailingPathdelimiter(Path));
547
  ParentNode := FindParentInTree(Tree,ParentName);
548
  ParentNode := FindParentInTree(Tree, ParentName);
548
  if ParentNode <> nil then
549
  if ParentNode <> nil then
549
  begin
550
  begin
550
    CurrentNode := Tree.AddChild(ParentNode);
551
    CurrentNode := Tree.AddChild(ParentNode);
551
    InsertNodeData(CurrentNode);
552
    InsertNodeData(CurrentNode);
552
  end
553
  end
553
  else
554
  else if (FindParentInTree(Tree, Path) = nil) then
554
    if (FindParentInTree(Tree,Path) = nil) then
555
  begin
555
    begin
556
    CurrentNode := Tree.AddChild(Nil);
556
      CurrentNode := Tree.AddChild(Nil);
557
    InsertNodeData(CurrentNode);
557
      InsertNodeData(CurrentNode);
558
  end;
558
    end;
559
end;
559
end;
560
560
561
procedure TfrmAddnonfb2.flFilesFile(Sender: TObject; const F: TSearchRec);
561
procedure TfrmAddnonfb2.flFilesFile(Sender: TObject; const F: TSearchRec);
...
...
568
  CurrentNode: PVirtualNode;
568
  CurrentNode: PVirtualNode;
569
  Ext: string;
569
  Ext: string;
570
begin
570
begin
571
  if (F.Name = '.') or (F.Name = '..') then Exit;
571
  if (F.Name = '.') or (F.Name = '..') then
572
    Exit;
572
573
573
  Ext := ExtractFileExt(F.Name);
574
  Ext := ExtractFileExt(F.Name);
574
  if Ext = '' then Exit;
575
  if Ext = '' then
576
    Exit;
575
577
576
 //
578
  //
577
 // Пропустим fb2-документы и зипы
 //
579
  // Пропустим fb2-документы и зипы
  //
578
 if (CompareText(Ext, FB2_EXTENSION) = 0) or (CompareText(Ext, ZIP_EXTENSION) = 0) then
580
  if (CompareText(Ext, FB2_EXTENSION) = 0) or (CompareText(Ext, ZIP_EXTENSION) = 0) then
579
      Exit;
581
    Exit;
580
582
581
  //
583
  //
582
  // Проверим, есть ли у нас ридер для этого документа
584
  // Проверим, есть ли у нас ридер для этого документа
...
...
593
  FileName := ExtractShortFileName(F.Name);
595
  FileName := ExtractShortFileName(F.Name);
594
  Path := ExtractRelativePath(FRootPath, flFiles.LastDir);
596
  Path := ExtractRelativePath(FRootPath, flFiles.LastDir);
595
597
596
  ParentNode := FindParentInTree(Tree,Path);
598
  ParentNode := FindParentInTree(Tree, Path);
597
599
598
  CurrentNode := Tree.AddChild(ParentNode);
600
  CurrentNode := Tree.AddChild(ParentNode);
599
601
...
...
621
623
622
procedure TfrmAddnonfb2.SortTree;
624
procedure TfrmAddnonfb2.SortTree;
623
var
625
var
624
  A,B: PVirtualNode;
626
  A, B: PVirtualNode;
625
  Data,DataA,DataB: PFileData;
627
  Data, DataA, DataB: PFileData;
626
  Parent: PVirtualNode;
628
  Parent: PVirtualNode;
627
begin
629
begin
628
  Parent := Tree.GetFirst;
630
  Parent := Tree.GetFirst;
629
  Data := Tree.GetNodeData(Parent);
631
  Data := Tree.GetNodeData(Parent);
630
  while Parent <> nil do
632
  while Parent <> nil do
631
  begin
633
  begin
632
    if (Data.DataType = dtFolder) and
634
    if (Data.DataType = dtFolder) and (Tree.HasChildren[Parent]) then
633
       (Tree.HasChildren[Parent]) then
634
    begin
635
    begin
635
      A := Tree.GetFirstChild(Parent);
636
      A := Tree.GetFirstChild(Parent);
636
      while (A <> Parent.LastChild) do
637
      while (A <> Parent.LastChild) do
...
...
638
        DataA := Tree.GetNodeData(A);
639
        DataA := Tree.GetNodeData(A);
639
        B := Tree.GetNext(A);
640
        B := Tree.GetNext(A);
640
        DataB := Tree.GetNodeData(B);
641
        DataB := Tree.GetNodeData(B);
641
        if (A.Parent = B.Parent) and
642
        if (A.Parent = B.Parent) and (DataA.DataType = dtFile) and (DataB.DataType = dtFolder) then
642
           (DataA.DataType = dtFile) and
643
           (DataB.DataType = dtFolder) then
644
        begin
643
        begin
645
          Tree.MoveTo(B, A, amInsertBefore, false);
644
          Tree.MoveTo(B, A, amInsertBefore, False);
646
          A := Parent.FirstChild;
645
          A := Parent.FirstChild;
647
        end
646
        end
648
        else
647
        else
...
...
652
    end;
651
    end;
653
652
654
    if (Data.DataType = dtFolder) and (Parent.ChildCount = 0) then
653
    if (Data.DataType = dtFolder) and (Parent.ChildCount = 0) then
655
                  Tree.DeleteNode(Parent, True);
654
      Tree.DeleteNode(Parent, True);
656
655
657
    Parent := Tree.GetNext(Parent);
656
    Parent := Tree.GetNext(Parent);
658
    Data := Tree.GetNodeData(Parent);
657
    Data := Tree.GetNodeData(Parent);
...
...
664
  Data: PFileData;
663
  Data: PFileData;
665
  S: string;
664
  S: string;
666
begin
665
begin
667
  Data := Tree.GetNodedata(Tree.GetFirstSelected);
666
  Data := Tree.GetNodeData(Tree.GetFirstSelected);
668
  if Data <> nil then
667
  if Data <> nil then
669
  begin
668
  begin
670
    S := AnsiLowercase(Data.FullPath + Data.FileName + Data.Ext);
669
    S := AnsiLowercase(Data.FullPath + Data.FileName + Data.Ext);
671
    ShellExecute(Handle, 'open', PChar(s), '', nil, SW_SHOWNORMAL);
670
    ShellExecute(Handle, 'open', PChar(S), '', nil, SW_SHOWNORMAL);
672
  end;
671
  end;
673
end;
672
end;
674
673
...
...
677
  Close;
676
  Close;
678
end;
677
end;
679
678
680
procedure TfrmAddnonfb2.TreeChange(Sender: TBaseVirtualTree;
679
procedure TfrmAddnonfb2.TreeChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
681
  Node: PVirtualNode);
682
680
683
begin
681
begin
684
  TreeClick(Sender);
682
  TreeClick(Sender);
...
...
686
684
687
procedure TfrmAddnonfb2.TreeClick(Sender: TObject);
685
procedure TfrmAddnonfb2.TreeClick(Sender: TObject);
688
var
686
var
689
  Data: PFiledata;
687
  Data: PFileData;
690
begin
688
begin
691
  Data := Tree.GetNodeData(Tree.GetFirstSelected);
689
  Data := Tree.GetNodeData(Tree.GetFirstSelected);
692
  if (Data = nil) or (Data.DataType = dtFolder) then
690
  if (Data = nil) or (Data.DataType = dtFolder) then
...
...
697
695
698
end;
696
end;
699
697
700
procedure TfrmAddnonfb2.TreeCompareNodes(Sender: TBaseVirtualTree; Node1,
698
procedure TfrmAddnonfb2.TreeCompareNodes(Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
701
  Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
702
var
699
var
703
  Data1, Data2: PFileData;
700
  Data1, Data2: PFileData;
704
begin
701
begin
705
  Data1 := Sender.GetNodeData(Node1);
702
  Data1 := Sender.GetNodeData(Node1);
706
  Data2 := Sender.GetNodeData(Node2);
703
  Data2 := Sender.GetNodeData(Node2);
707
//  Result := CompareInt(Data1.DataType, Data1.DataType);
704
  // Result := CompareInt(Data1.DataType, Data1.DataType);
708
end;
705
end;
709
706
710
procedure TfrmAddnonfb2.TreeDblClick(Sender: TObject);
707
procedure TfrmAddnonfb2.TreeDblClick(Sender: TObject);
711
//var
708
// var
712
//  Data: PFileData;
709
// Data: PFileData;
713
//  S: string;
710
// S: string;
714
begin
711
begin
715
//  Data := Tree.GetNodedata(Tree.GetFirstSelected);
712
  // Data := Tree.GetNodedata(Tree.GetFirstSelected);
716
//  if Data <> nil then
713
  // if Data <> nil then
717
//  begin
714
  // begin
718
//    S := AnsiLowercase(Data.FullPath + Data.FileName + Data.Ext);
715
  // S := AnsiLowercase(Data.FullPath + Data.FileName + Data.Ext);
719
//    ShellExecute(Handle, 'open', PChar(s), '', nil, SW_SHOWNORMAL);
716
  // ShellExecute(Handle, 'open', PChar(s), '', nil, SW_SHOWNORMAL);
720
//  end;
717
  // end;
721
  pcPages.ActivePageIndex := 1;
718
  pcPages.ActivePageIndex := 1;
722
end;
719
end;
723
720
724
procedure TfrmAddnonfb2.TreeGetText(Sender: TBaseVirtualTree;
721
procedure TfrmAddnonfb2.TreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
725
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
726
  var CellText: String);
727
var
722
var
728
  Data: PFileData;
723
  Data: PFileData;
729
begin
724
begin
730
  Data := Sender.GetNodeData(Node);
725
  Data := Sender.GetNodeData(Node);
731
  case Data.DataType of
726
  case Data.DataType of
732
    dtFolder: if Column = 0 then CellText := Data.Title
727
    dtFolder:
733
                else  CellText := '';
728
      if Column = 0 then
734
    dtFile:  case Column of
729
        CellText := Data.Title
735
               0: CellText := Data.FileName;
730
      else
736
               1: CellText := CleanExtension(Data.Ext);
731
        CellText := '';
737
               2: CellText := IntToStr(Data.Size);
732
    dtFile:
738
               3: CellText := '';
733
      case Column of
739
             end;
734
        0: CellText := Data.FileName;
735
        1: CellText := CleanExtension(Data.Ext);
736
        2: CellText := GetFormattedSize(Data.Size);
737
        3: CellText := '';
738
      end;
740
  end;
739
  end;
741
end;
740
end;
742
741
743
procedure TfrmAddnonfb2.TreePaintText(Sender: TBaseVirtualTree;
742
procedure TfrmAddnonfb2.TreePaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType);
744
  const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
745
  TextType: TVSTTextType);
746
var
743
var
747
  Data: PFileData;
744
  Data: PFileData;
748
begin
745
begin
...
...
752
end;
749
end;
753
750
754
end.
751
end.
755