Changeset 10 for trunk/UFormMain.pas


Ignore:
Timestamp:
Apr 2, 2016, 12:02:59 AM (8 years ago)
Author:
chronos
Message:
  • Added support for continue previous stopped scan.
  • Modified: Allow to scan only part of drive by specifiing start and end sector.
  • Added: Table showing list of operations in project.
  • Added: Allow to create new project and close project.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UFormMain.pas

    r9 r10  
    1515  TFormMain = class(TForm)
    1616    ABrowseDisk: TAction;
     17    AOperationOptions: TAction;
     18    AFileClose: TAction;
     19    AFileNew: TAction;
     20    AScanContinue: TAction;
    1721    AFileSave: TAction;
    1822    AFileOpen: TAction;
    1923    AFileSaveAs: TAction;
    2024    AExit: TAction;
    21     AScanOptions: TAction;
     25    AProjectOptions: TAction;
    2226    AScanStart: TAction;
    2327    AScanStop: TAction;
    2428    ActionList1: TActionList;
    2529    Button1: TButton;
     30    Button2: TButton;
     31    Button3: TButton;
    2632    ButtonScan: TButton;
    2733    ButtonScan1: TButton;
    2834    ButtonScan2: TButton;
    29     ComboBoxRunMode: TComboBox;
    30     EditPattern: TEdit;
    3135    EditDrive: TEdit;
    3236    Image1: TImage;
    3337    Label1: TLabel;
    3438    Label10: TLabel;
     39    Label11: TLabel;
    3540    Label2: TLabel;
    3641    Label3: TLabel;
     
    4045    Label7: TLabel;
    4146    Label8: TLabel;
    42     Label9: TLabel;
    4347    LabelElapsedTime: TLabel;
    4448    LabelBlockSize: TLabel;
     
    5357    MainMenu1: TMainMenu;
    5458    MenuItem1: TMenuItem;
     59    MenuItem10: TMenuItem;
     60    MenuItem11: TMenuItem;
     61    MenuItem12: TMenuItem;
     62    MenuItem13: TMenuItem;
     63    MenuItem14: TMenuItem;
     64    MenuItem15: TMenuItem;
    5565    MenuItem2: TMenuItem;
    5666    MenuItem3: TMenuItem;
     
    6777    procedure ABrowseDiskExecute(Sender: TObject);
    6878    procedure AExitExecute(Sender: TObject);
     79    procedure AFileCloseExecute(Sender: TObject);
     80    procedure AFileNewExecute(Sender: TObject);
    6981    procedure AFileOpenExecute(Sender: TObject);
    7082    procedure AFileSaveAsExecute(Sender: TObject);
    7183    procedure AFileSaveExecute(Sender: TObject);
    72     procedure AScanOptionsExecute(Sender: TObject);
     84    procedure AOperationOptionsExecute(Sender: TObject);
     85    procedure AProjectOptionsExecute(Sender: TObject);
     86    procedure AScanContinueExecute(Sender: TObject);
    7387    procedure AScanStartExecute(Sender: TObject);
    7488    procedure AScanStopExecute(Sender: TObject);
     
    7892    procedure FormShow(Sender: TObject);
    7993    procedure Image1Resize(Sender: TObject);
     94    procedure ListView1Data(Sender: TObject; Item: TListItem);
    8095    procedure Timer1Timer(Sender: TObject);
    8196  private
     
    8499    RedrawPending: Boolean;
    85100    LastProjectFileName: string;
     101    procedure ReloadOperationList;
     102    procedure CheckDrive;
    86103    procedure ProjectOpen(FileName: string);
    87104    procedure DriveScanChange(Sender: TObject);
     
    107124
    108125uses
    109   UFormProject;
     126  UFormProject, UFormOperation;
    110127
    111128resourcestring
    112129  SProjectModified = '(modified)';
     130  SNewProject = 'New project';
     131  SSelectDriveForScan = 'Select drive for scan';
     132  SOpenStoredProject = 'Open stored scan project';
     133  SSaveProject = 'Save scan project';
     134  SBytes = 'bytes';
     135
     136const
     137  DefaultDriveName = '/dev/sda';
    113138
    114139{ TFormMain }
     
    120145    ProjectOpen(LastProjectFileName)
    121146  else begin
     147    AFileNew.Execute;
    122148    Redraw;
    123149    UpdateInterface;
     
    130156end;
    131157
     158procedure TFormMain.ListView1Data(Sender: TObject; Item: TListItem);
     159begin
     160  if (Item.Index >= 0) and (Item.Index < Project.Scans.Count) then
     161  with TDriveScan(Project.Scans[Item.Index]) do begin
     162    Item.Caption := IntToStr(Item.Index);
     163    Item.SubItems.Add(DateTimeToStr(TimeStart));
     164    Item.SubItems.Add(DateTimeToStr(TimeEnd));
     165    Item.SubItems.Add(IntToStr(SectorStart));
     166    Item.SubItems.Add(IntToStr(SectorEnd));
     167  end;
     168end;
     169
    132170procedure TFormMain.FormCreate(Sender: TObject);
    133171begin
    134172  PrefixMultiplier := TPrefixMultiplier.Create;
    135   Project := TProject.Create;
    136   Project.Scans.Add(TDriveScan.Create);
    137   DriveScan := TDriveScan(Project.Scans[0]);
     173  EditDrive.Text := DefaultDriveName;
     174  XMLConfig1.Filename := 'config.xml';
     175  Project := nil;
     176end;
     177
     178procedure TFormMain.AScanStopExecute(Sender: TObject);
     179begin
     180  DriveScan.Stop;
     181  UpdateInterface;
     182end;
     183
     184procedure TFormMain.AScanStartExecute(Sender: TObject);
     185begin
     186  LastBlockPos := 0;
     187  DriveScan.DriveName := EditDrive.Text;
     188  DriveScan.Reset;
     189  DriveScan.SectorSize := Project.SectorSize;
    138190  DriveScan.OnChange := DriveScanChange;
    139191  DriveScan.OnTerminate := DriveScanTerminate;
    140   EditDrive.Text := '/dev/sdb';
    141   XMLConfig1.Filename := 'config.xml';
    142 end;
    143 
    144 procedure TFormMain.AScanStopExecute(Sender: TObject);
    145 begin
    146   DriveScan.Stop;
    147   UpdateInterface;
    148 end;
    149 
    150 procedure TFormMain.AScanStartExecute(Sender: TObject);
    151 begin
    152   LastBlockPos := 0;
    153   DriveScan.Drive := EditDrive.Text;
    154   DriveScan.SectorSize := Project.SectorSize;
    155   DriveScan.Mode := TRunMode(ComboBoxRunMode.ItemIndex);
    156   DriveScan.WritePattern := StrToInt(EditPattern.Text);
    157192  DriveScan.Start;
    158193  Project.Modified := True;
     
    160195end;
    161196
    162 procedure TFormMain.AScanOptionsExecute(Sender: TObject);
    163 begin
     197procedure TFormMain.AProjectOptionsExecute(Sender: TObject);
     198begin
     199  CheckDrive;
    164200  FormProject.Load(Project);
    165201  if FormProject.ShowModal = mrOk then begin
    166202    FormProject.Save(Project);
    167   end;
     203    Project.Modified := True;
     204    UpdateInterface;
     205  end;
     206end;
     207
     208procedure TFormMain.AScanContinueExecute(Sender: TObject);
     209begin
     210  DriveScan.Start;
     211  Project.Modified := True;
     212  UpdateInterface;
    168213end;
    169214
    170215procedure TFormMain.ABrowseDiskExecute(Sender: TObject);
    171216begin
    172   OpenDialog1.Title := 'Select drive for scan';
     217  OpenDialog1.Title := SSelectDriveForScan;
    173218  OpenDialog1.DefaultExt := '';
    174219  OpenDialog1.FileName := EditDrive.Text;
     
    182227end;
    183228
     229procedure TFormMain.AFileCloseExecute(Sender: TObject);
     230begin
     231  DriveScan := nil;
     232  FreeAndNil(Project);
     233  UpdateInterface;
     234end;
     235
     236procedure TFormMain.AFileNewExecute(Sender: TObject);
     237begin
     238  AFileClose.Execute;
     239  Project := TProject.Create;
     240  Project.FileName := SNewProject;
     241  Project.Modified := False;
     242  Project.Scans.Add(TDriveScan.Create);
     243  DriveScan := TDriveScan(Project.Scans[0]);
     244
     245  CheckDrive;
     246  DriveScan.SectorStart := 0;
     247  DriveScan.SectorEnd := DriveScan.SectorCount - 1;
     248  DriveScan.Reset;
     249  Redraw;
     250  UpdateInterface;
     251end;
     252
    184253procedure TFormMain.AFileOpenExecute(Sender: TObject);
    185254begin
    186   OpenDialog1.Title := 'Open stored scan project';
     255  OpenDialog1.Title := SOpenStoredProject;
    187256  OpenDialog1.DefaultExt := '.cdp';
     257  if Assigned(Project) then
     258    OpenDialog1.FileName := Project.FileName;
    188259  if OpenDialog1.Execute then begin
    189260    ProjectOpen(OpenDialog1.FileName);
     
    193264procedure TFormMain.AFileSaveAsExecute(Sender: TObject);
    194265begin
    195   SaveDialog1.Title := 'Save scan project';
     266  SaveDialog1.Title := SSaveProject;
    196267  SaveDialog1.DefaultExt := '.cdp';
     268  SaveDialog1.FileName := Project.FileName;
    197269  if SaveDialog1.Execute then begin
    198270    Project.SaveToFile(SaveDialog1.FileName);
     271    UpdateInterface;
    199272  end;
    200273end;
     
    204277  if not FileExists(Project.FileName) then
    205278    AFileSaveAs.Execute
    206     else Project.SaveToFile(Project.FileName);
     279    else begin
     280      Project.SaveToFile(Project.FileName);
     281      UpdateInterface;
     282    end;
     283end;
     284
     285procedure TFormMain.AOperationOptionsExecute(Sender: TObject);
     286begin
     287  FormOperation.Load(DriveScan);
     288  if FormOperation.ShowModal = mrOk then begin
     289    FormOperation.Save(DriveScan);
     290    Project.Modified := True;
     291    UpdateInterface;
     292  end;
    207293end;
    208294
    209295procedure TFormMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
    210296begin
     297  AFileClose.Execute;
    211298  SaveConfig;
    212299end;
     
    215302begin
    216303  Timer1.Enabled := False;
    217   FreeAndNil(Project);
     304  if Assigned(Project) then FreeAndNil(Project);
    218305  FreeAndNil(PrefixMultiplier);
    219306end;
     
    227314procedure TFormMain.DoDraw;
    228315begin
     316  if Assigned(Project) then begin
    229317  if RedrawPending then
    230318  with Image1 do begin
     
    240328      end;
    241329      LabelSize.Caption := PrefixMultiplier.Add(DriveScan.BlockMap.SectorCount * DriveScan.SectorSize,
    242         BasePrefixMultipliers, 'bytes');
     330        BasePrefixMultipliers, SBytes);
    243331      LabelSectorPerBlock.Caption := IntToStr(DriveScan.BlockMap.SectorPerBlock);
    244       LabelBlockSize.Caption := IntToStr(DriveScan.SectorSize) + ' bytes';
     332      LabelBlockSize.Caption := IntToStr(DriveScan.SectorSize) + ' ' + SBytes;
    245333      LabelBlockCount.Caption := IntToStr(DriveScan.BlockMap.SectorCount);
    246334      LabelBlockCurrent.Caption := IntToStr(DriveScan.SectorCurrent);
     
    268356    DriveScan.Lock.Release;
    269357  end;
     358  end else
     359  with Image1 do begin
     360    if (Width <> Picture.Bitmap.Width) or (Height <> Picture.Bitmap.Height) then
     361      Picture.Bitmap.SetSize(Width, Height);
     362    with Picture.Bitmap.Canvas do begin
     363      Brush.Style := bsSolid;
     364      Brush.Color := clSilver;
     365      FillRect(0, 0, Width, Height);
     366    end;
     367  end;
    270368end;
    271369
     
    277375    AScanStart.Enabled := DriveScan.Terminated = True;
    278376    AScanStop.Enabled := DriveScan.Terminated = False;
     377    AScanContinue.Enabled := (DriveScan.Terminated = True) and (DriveScan.SectorCurrent > DriveScan.SectorStart) and
     378      (DriveScan.SectorCurrent < DriveScan.SectorEnd);
    279379  end;
    280380  AFileSave.Enabled := Assigned(Project) and Project.Modified;
    281381  AFileSaveAs.Enabled := Assigned(Project);
     382  AFileClose.Enabled := Assigned(Project);
     383  ReloadOperationList;
    282384
    283385  Title := '';
     
    298400procedure TFormMain.LoadConfig;
    299401begin
    300   EditDrive.Text := XMLConfig1.GetValue('DriveName', '/dev/sda');
     402  EditDrive.Text := XMLConfig1.GetValue('DriveName', DefaultDriveName);
    301403  LastProjectFileName := XMLConfig1.GetValue('LastProjectFileName', '');
    302404end;
     
    307409end;
    308410
     411procedure TFormMain.ReloadOperationList;
     412begin
     413  if Assigned(Project) then begin
     414    ListView1.Items.Count := Project.Scans.Count;
     415  end else begin
     416    ListView1.Items.Count := 0;
     417  end;
     418  ListView1.Refresh;
     419end;
     420
     421procedure TFormMain.CheckDrive;
     422begin
     423  DriveScan.CheckDrive;
     424  Project.SectorCount := DriveScan.SectorCount;
     425end;
     426
    309427procedure TFormMain.ProjectOpen(FileName: string);
    310428begin
     429  AFileNew.Execute;
    311430  Project.LoadFromFile(FileName);
    312431  LastProjectFileName := FileName;
Note: See TracChangeset for help on using the changeset viewer.