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

📄 ftasklist.pas

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

procedure TfmTaskList.SetFilter(FilterType: TTaskFilterType;
  AFilter: string);
begin
  lvTasks.FilterType := FilterType;
  lvTasks.FilterKey := AFilter;
end;

procedure TfmTaskList.FormShow(Sender: TObject);
begin
  UpdateWorkflowDiagram;
  TabControl1.TabIndex := 0;
end;

procedure TfmTaskList.AddAttachmentTab(AAttach: TWorkflowAttachment;
  APermissions: TAttachmentPermissions);
var
  AFrame: TfrAttachmentFrame;
begin
  AFrame := TfrAttachmentFrame.Create(Self);
  AFrame.Align := alClient;
  AFrame.Visible := false;
  AFrame.Parent := TabControl1;
  TabControl1.Tabs.AddObject(AAttach.Name, AFrame);
  AFrame.Name := 'AttachFrame' + IntToStr(TabControl1.Tabs.Count);

  AFrame.lvItems.Attachments := AAttach.Items;
  {if the selected task is open, than allow normal permissions. Otherwise, cannot change attachments}
  if Assigned(lvTasks.SelectedTask) and not lvTasks.SelectedTask.Completed then
    AFrame.Permissions := APermissions
  else
    AFrame.Permissions := [];

  AFrame.SendToBack;
  AFrame.Visible := true;
end;

procedure TfmTaskList.UpdateAttachmentTabs;
var
  AWorkIns: TWorkflowInstance;
  c: integer;
begin
  {Delete the previous tabs}
  c := 0;
  while c < TabControl1.Tabs.Count do
  begin
    {$WARNINGS OFF}
    if integer(TabControl1.Tabs.Objects[c]) > _MaxFixedTab then
    {$WARNINGS ON}
    begin
      TfrAttachmentFrame(TabControl1.Tabs.Objects[c]).Free;
      TabControl1.Tabs.Delete(c);
    end else
      inc(c);
  end;

  if (lvTasks.SelectedTask <> nil) and (lvTasks.SelectedTask.TaskDef.ShowAttachments) then
  begin
    AWorkIns := GetWorkIns;
    for c := 0 to AWorkIns.Diagram.Attachments.Count - 1 do
      AddAttachmentTab(AWorkIns.Diagram.Attachments[c], lvTasks.SelectedTask.TaskDef.AttachmentPermissions);
  end;
end;

procedure TfmTaskList.UpdateFieldsTab;
var
  i: integer;
  MustShow: boolean;
  AWorkIns: TWorkflowInstance;
begin
  MustShow := (lvTasks.SelectedTask <> nil) and (lvTasks.SelectedTask.TaskDef.Fields.Count > 0);
  i := FindTabByType(_FieldTabIndex);

  {Create or destroy the tab, depending if it must be shown or not}
  if MustShow and (i = -1) then
    TabControl1.Tabs.InsertObject(2, _str(STabFields), TObject(_FieldTabIndex));
  if not MustShow and (i > -1) then
    TabControl1.Tabs.Delete(i);

  {update fields tab}
  if lvTasks.SelectedTask <> nil then
  begin
    FFieldPanel.Fields := lvTasks.SelectedTask.TaskDef.Fields;
    AWorkIns := GetWorkIns;
    FFieldPanel.LoadDiagramVariables(AWorkIns.Diagram);
  end;
  FFieldPanel.ReadOnly := not Assigned(lvTasks.SelectedTask) or lvTasks.SelectedTask.Completed;
end;

function TfmTaskList.FindTabByType(AType: integer): integer;
var
  c: integer;
begin
  result := -1;
  for c := 0 to TabControl1.Tabs.Count - 1 do
    {$WARNINGS OFF}
    if integer(TabControl1.Tabs.Objects[c]) = AType then
    {$WARNINGS ON}
    begin
      result := c;
      exit;
    end;
end;

procedure TfmTaskList.UpdateFixedTabs;
begin
  With TabControl1.Tabs do
  begin
    if FindTabByType(_TaskTabIndex) = -1 then
      InsertObject(0, _str(STabTask), TObject(_TaskTabIndex));
    if FindTabByType(_WorkflowTabIndex) = -1 then
      InsertObject(1, _str(STabWorkflow), TObject(_WorkflowTabIndex));
  end;
end;

procedure TfmTaskList.UpdateLogTab;
var
  i: integer;
begin
  With TabControl1.Tabs do
  begin
    i := FindTabByType(_TaskLogIndex);
    if i = - 1 then
      AddObject(_str(STabLog), TObject(_TaskLogIndex))
    else
      Move(i, TabControl1.Tabs.Count - 1);
  end;
end;

procedure TfmTaskList.FormDestroy(Sender: TObject);
begin
  if FWorkIns <> nil then
  begin
    FWorkIns.Free;
    FWorkIns := nil;
  end;
end;

function TfmTaskList.GetWorkIns: TWorkflowInstance;
begin
  {Check if WorkIns is already loaded}
  if FWorkIns <> nil then
  begin
    Case lvTasks.FilterType of
      tfWorkIns:
        if FWorkIns.Key = lvTasks.FilterKey then
        begin
          result := FWorkIns;
          exit;
        end;
    else
      begin
        if (lvTasks.SelectedTask <> nil) and (FWorkIns.Key = lvTasks.SelectedTask.WorkInsKey) then
        begin
          result := FWorkIns;
          exit;
        end;
      end;
    end;
  end;

  {FWorkIns must be reloaded}
  if FWorkIns <> nil then
    FWorkIns.Free;

  FWorkIns := TWorkflowInstance.Create(nil);
  if lvTasks.FilterType = tfWorkIns then
    FWorkIns.Key := lvTasks.FilterKey {workInskey}
  else
    if lvTasks.SelectedTask <> nil then
      FWorkIns.Key := lvTasks.SelectedTask.WorkInsKey
    else
    begin
      FWorkIns.Free;
      FWorkIns := nil;
    end;

  WorkflowStudio.WorkflowManager.LoadWorkflowInstance(FWorkIns);
  result := FWorkIns;
end;

procedure TfmTaskList.btSaveChangesClick(Sender: TObject);
begin
  SaveChanges;
end;

procedure TfmTaskList.WorkflowDiagram1Click(Sender: TObject);
begin
  WorkflowDiagram1.SetFocus;
end;

procedure TfmTaskList.TabControl1Change(Sender: TObject);
begin
  UpdateActivePage;
end;

procedure TfmTaskList.BeginUpdateTabs;
begin
  inc(FUpdatingTabs);
end;

procedure TfmTaskList.EndUpdateTabs;
begin
  dec(FUpdatingTabs);
end;

procedure TfmTaskList.lvTasksSelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
begin
  Timer1.Enabled := false;
  Timer1.Enabled := true;
end;

procedure TfmTaskList.Localize;
begin
  Self.Caption := _str('fmTaskList.Self.Caption');
  btSaveChanges.Caption := _str('fmTaskList.btSaveChanges.Caption');
  acShowOnlyOpen.Caption := _str('fmTaskList.acShowOnlyOpen.Caption');
  acShowAllTasks.Caption := _str('fmTaskList.acShowAllTasks.Caption');
  miView.Caption := _str('fmTaskList.miView.Caption');
end;

procedure TfmTaskList.Loaded;
begin
  inherited;
  Localize;
end;

procedure TfmTaskList.acShowOnlyOpenExecute(Sender: TObject);
begin
  lvTasks.OnlyCompleted := true;
  LoadData;
end;

procedure TfmTaskList.acShowOnlyOpenUpdate(Sender: TObject);
begin
  acShowOnlyOpen.Checked := lvTasks.OnlyCompleted;
end;

procedure TfmTaskList.acShowAllTasksExecute(Sender: TObject);
begin
  lvTasks.OnlyCompleted := false;
  LoadData;
end;

procedure TfmTaskList.acShowAllTasksUpdate(Sender: TObject);
begin
  acShowAllTasks.Checked := not lvTasks.OnlyCompleted;
end;

procedure TfmTaskList.lvTasksCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  ATask: TTaskInstance;
begin
  ATask := nil;
  if Item <> nil then
    ATask := lvTasks.TaskFromItem(Item);
  if ATask <> nil then
  begin
    if ATask.Completed then
      lvTasks.Canvas.Font.Color := clGray;
  end;
  DefaultDraw := true;
end;

procedure TfmTaskList.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := false;
  if (not (csDestroying in ComponentState)) then
  begin
    {Save last active page name}
    if TabControl1.TabIndex > -1 then
      FLastActivePageName := TabControl1.Tabs[TabControl1.TabIndex];

    BeginUpdateTabs;
    try
      frTaskView.Task := lvTasks.SelectedTask;
      UpdateWorkflowDiagram;
      UpdateAttachmentTabs;

      {The following methods *must* be called in that order}
      UpdateFixedTabs;
      UpdateFieldsTab;
      UpdateLogTab;

      if lvTasks.SelectedTask <> nil then
      begin
        {Recover the active page}
        TabControl1.TabIndex := TabControl1.Tabs.IndexOf(FLastActivePageName);
        {for c := 0 to TabContro1.PageCount - 1 do
          if CompareText(PageControl1.Pages[c].Caption, FLastActivePageName) = 0 then
          begin
            PageControl1.ActivePage := PageControl1.Pages[c];
            break;
          end;}
      end;
      btSaveChanges.Enabled := (lvTasks.SelectedTask <> nil) and not lvTasks.SelectedTask.Completed
        and lvTasks.SelectedTask.CanUpdate(WorkflowStudio.UserManager.LoggedUserId);
      
    finally
      EndUpdateTabs;
    end;

    UpdateActivePage;

    {if TabControl1.TabIndex > -1 then
      FLastActivePageName := TabControl1.Tabs[TabControl1.TabIndex];}
  end;
end;

procedure TfmTaskList.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if FFreeOnClose then
    Action := caFree;
end;

end.

⌨️ 快捷键说明

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