⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftaskeditor.pas

📁 Workflow Studio是一款专为商业进程管理(BPM)设计的Delphi VCL框架。通过Workflow Studio你可以轻易地将工作流与BPM功能添加到你的应用程序里。这样能使你或你的最
💻 PAS
字号:
unit fTaskEditor;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, StdCtrls, ExtCtrls, fAttachPermissions, fFieldFrame, wsClasses;

type
  TfmTaskEditor = class(TForm)
    PageControl1: TPageControl;
    tsGeneral: TTabSheet;
    lvTasks: TListView;
    Label1: TLabel;
    edSubject: TEdit;
    Label2: TLabel;
    mmComments: TMemo;
    btAdd: TButton;
    btDelete: TButton;
    Label3: TLabel;
    edAssignment: TComboBox;
    TabSheet2: TTabSheet;
    Label4: TLabel;
    mmStatus: TMemo;
    btCancel: TButton;
    btOk: TButton;
    cbMailNotification: TCheckBox;
    tsAttachment: TTabSheet;
    frPermissions: TfrAttachPermissions;
    tsFields: TTabSheet;
    frFields: TfrFieldFrame;
    procedure btOkClick(Sender: TObject);
    procedure btCancelClick(Sender: TObject);
    procedure btAddClick(Sender: TObject);
    procedure lvTasksSelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
    procedure PropertyChanged(Sender: TObject);
    procedure btDeleteClick(Sender: TObject);
    procedure lvTasksEdited(Sender: TObject; Item: TListItem;
      var S: String);
    procedure FormCreate(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
    FDiagram: TWorkflowDiagram;
    FTasks: TTaskDefinitions;
    FLastTask: TTaskDefinition;
    FUpdatingControls: integer;
    procedure TasksToInterface;
    procedure UpdateListItem(AItem: TListItem; ATask: TTaskDefinition);
    procedure LoadTaskInEditors(ATask: TTaskDefinition);
    procedure ClearEditors;
    procedure SaveEditorsInTask(ATask: TTaskDefinition);
    procedure DeleteCurrentTask;
    procedure BeginUpdateControls;
    procedure EndUpdateControls;
    procedure SetControlsEnabled(AEnabled: boolean);
    procedure SaveTask;
    procedure Localize;
    function TaskDefFromItem(AItem: TListItem): TTaskDefinition;
  protected
    procedure Loaded; override;
  public
    { Public declarations }
    function EditTaskDefinitions(ATasks: TTaskDefinitions; ADiagram: TWorkflowDiagram): boolean;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

var
  fmTaskEditor: TfmTaskEditor;

implementation
uses wsMain, wsRes;

{$R *.DFM}

{ TForm1 }

function TfmTaskEditor.EditTaskDefinitions(ATasks: TTaskDefinitions; ADiagram: TWorkflowDiagram): boolean;
begin
  FTasks.Assign(ATasks);
  frPermissions.OnPropertyChanged := PropertyChanged;
  FDiagram := ADiagram;
  TasksToInterface;
  result := ShowModal = mrOk;
  if result then
  begin
    SaveTask;
    ATasks.Assign(FTasks);
  end;
end;

procedure TfmTaskEditor.SaveTask;
begin
  if FLastTask <> nil then
  begin
    frFields.SaveEditorsInTask(FLastTask);
    FLastTask := nil;
  end
end;

procedure TfmTaskEditor.btOkClick(Sender: TObject);
begin
  ModalResult := mrOk;
end;

procedure TfmTaskEditor.btCancelClick(Sender: TObject);
begin
  ModalResult := mrCancel;
end;

procedure TfmTaskEditor.TasksToInterface;
var
  c: integer;
begin
  lvTasks.Items.Clear;
  for c := 0 to FTasks.Count - 1 do
    UpdateListItem(lvTasks.Items.Add, FTasks[c]);
  ClearEditors;
  if lvTasks.Items.Count > 0 then
    lvTasks.Selected := lvTasks.Items[0];

  //frVariables.LoadTaskInEditors(
end;

procedure TfmTaskEditor.UpdateListItem(AItem: TListItem; ATask: TTaskDefinition);
begin
  AItem.Caption := ATask.Name;
  {$WARNINGS OFF}
  AItem.Data := ATask;
  {$WARNINGS ON}
end;

procedure TfmTaskEditor.btAddClick(Sender: TObject);
var
  NewTask: TTaskDefinition;
  NewName: string;
  i: integer;
  NewItem: TListItem;
begin
  {Add task in collection}
  NewTask := FTasks.Add;

  {Find a new unique task name}
  i := 0;
  repeat
    inc(i);
    NewName := Format('%s%d', [_str(STask), i]);
  until (FTasks.FindByName(NewName) = nil);
  NewTask.Name := NewName;

  {Create item in list view}
  NewItem := lvTasks.Items.Add;
  UpdateListItem(NewItem, NewTask);

  {select and start renaming the item. EditCaption already selects the item}
  NewItem.EditCaption;
end;

procedure TfmTaskEditor.lvTasksSelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
begin
  if (FTasks <> nil) and not (csDestroying in ComponentState) then
  begin
    SaveTask;
    if (lvTasks.SelCount = 1) then
      LoadTaskInEditors(TaskDefFromItem(lvTasks.Selected))
    else
      ClearEditors;
  end;
end;

function TfmTaskEditor.TaskDefFromItem(AItem: TListItem): TTaskDefinition;
begin
  {$WARNINGS OFF}
  result := TTaskDefinition(AItem.Data);
  {$WARNINGS ON}
end;

procedure TfmTaskEditor.LoadTaskInEditors(ATask: TTaskDefinition);
begin
  if ATask <> nil then
  begin
    BeginUpdateControls;
    try
      SaveTask;
      FLastTask := ATask;

      edSubject.Text := ATask.Subject;
      mmComments.Lines.Text := ATask.Description;
      mmStatus.Lines := ATask.StatusList;
      edAssignment.Text := ATask.AssignmentRule;
      cbMailNotification.Checked := ATask.MailNotification;
      frPermissions.LoadTaskInEditors(ATask);
      frFields.LoadTaskInEditors(ATask, FDiagram);
      SetControlsEnabled(true);
    finally
      EndUpdateControls;
    end;
  end;
end;

procedure TfmTaskEditor.SaveEditorsInTask(ATask: TTaskDefinition);
begin
  if ATask <> nil then
  begin
    ATask.Subject := edSubject.Text;
    ATask.Description := mmComments.Lines.Text;
    ATask.StatusList.Assign(mmStatus.Lines);
    ATask.AssignmentRule := edAssignment.Text;
    ATask.MailNotification := cbMailNotification.Checked;
    frPermissions.SaveEditorsInTask(ATask);
    frFields.SaveEditorsInTask(ATask);
  end;
end;

procedure TfmTaskEditor.ClearEditors;
begin
  BeginUpdateControls;
  try
    edSubject.Text := '';
    mmComments.Lines.Clear;
    mmStatus.Lines.Clear;
    edAssignment.Text := '';
    cbMailNotification.Checked := false;
    frPermissions.ClearEditors;
    frFields.ClearAll;
    SetControlsEnabled(false);
  finally
    EndUpdateControls;
  end;
end;

procedure TfmTaskEditor.PropertyChanged(Sender: TObject);
begin
  if (lvTasks.SelCount = 1) and (FUpdatingControls = 0) then
    SaveEditorsInTask(TaskDefFromItem(lvTasks.Selected));
end;

procedure TfmTaskEditor.btDeleteClick(Sender: TObject);
begin
  if MessageDlg(_str(SConfirmDeleteItems),
     mtConfirmation,[mbYes,mbNo],0) = mrYes then
  begin
     while lvTasks.SelCount > 0 do
        DeleteCurrentTask;
     if lvTasks.Items.Count > 0 then
        lvTasks.Selected := lvTasks.Items[lvTasks.items.Count - 1]
     else
        ClearEditors;
     lvTasks.SetFocus;
  end;
end;

procedure TfmTaskEditor.DeleteCurrentTask;
begin
  if Assigned(lvTasks.Selected) then
  begin
    FLastTask := nil;
    TaskDefFromItem(lvTasks.Selected).Free;
    {$WARNINGS OFF}
    lvTasks.Selected.Data := nil;
    {$WARNINGS ON}
    lvTasks.Selected.Free;
  end;
end;

constructor TfmTaskEditor.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FLastTask := nil;
  FTasks := TTaskDefinitions.Create(nil);
end;

destructor TfmTaskEditor.Destroy;
begin
  FTasks.Free;
  inherited;
end;

procedure TfmTaskEditor.BeginUpdateControls;
begin
  inc(FUpdatingControls);
end;

procedure TfmTaskEditor.EndUpdateControls;
begin
  dec(FUpdatingControls);
end;

procedure TfmTaskEditor.lvTasksEdited(Sender: TObject; Item: TListItem;
  var S: String);
var
  ATask: TTaskDefinition;
begin
  ATask := TaskDefFromItem(Item);
  if ATask <> nil then
  begin
    if Trim(S) = '' then
      S := ATask.Name
    else
      ATask.Name := S;
  end;
end;
                          
procedure TfmTaskEditor.SetControlsEnabled(AEnabled: boolean);
begin
  edSubject.Enabled := AEnabled;
  mmComments.Enabled := AEnabled;
  mmStatus.Enabled := AEnabled;
  edAssignment.Enabled := AEnabled;
  cbMailNotification.Enabled := AEnabled;
end;

procedure TfmTaskEditor.FormCreate(Sender: TObject);
begin
  WorkflowStudio.UserManager.FillAssignmentList(edAssignment.Items);
  PageControl1.ActivePage := tsGeneral;
end;

procedure TfmTaskEditor.FormActivate(Sender: TObject);
begin
  if edSubject.CanFocus then
    edSubject.SetFocus;
end;

procedure TfmTaskEditor.Localize;
begin
  Self.Caption := _str('fmTaskEditor.Self.Caption');
  tsGeneral.Caption := _str('fmTaskEditor.tsGeneral.Caption');
  Label1.Caption := _str('fmTaskEditor.Label1.Caption');
  Label2.Caption := _str('fmTaskEditor.Label2.Caption');
  Label3.Caption := _str('fmTaskEditor.Label3.Caption');
  cbMailNotification.Caption := _str('fmTaskEditor.cbMailNotification.Caption');
  TabSheet2.Caption := _str('fmTaskEditor.TabSheet2.Caption');
  Label4.Caption := _str('fmTaskEditor.Label4.Caption');
  tsAttachment.Caption := _str('fmTaskEditor.tsAttachment.Caption');
  tsFields.Caption := _str('fmTaskEditor.tsFields.Caption');
  btAdd.Caption := _str('fmTaskEditor.btAdd.Caption');
  btDelete.Caption := _str('fmTaskEditor.btDelete.Caption');
  btCancel.Caption := _str('fmTaskEditor.btCancel.Caption');
  btOk.Caption := _str('fmTaskEditor.btOk.Caption');
end;

procedure TfmTaskEditor.Loaded;
begin
  inherited;
  with lvTasks.Columns.Add do
  begin
    AutoSize := True;
    Caption := _Str(STask);
  end;
  Localize;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -