📄 ftasklist.pas
字号:
unit fTaskList;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, wsMain,
Db, Grids, DBGrids, ComCtrls, wsControls, ExtCtrls, fTaskInstanceView,
atDiagram, LiveDiagram, wsClasses, wsDB, StdCtrls, ActnList, Menus;
type
TfmTaskList = class(TForm)
Panel1: TPanel;
lvTasks: TTaskListView;
Panel2: TPanel;
Panel3: TPanel;
Splitter1: TSplitter;
Splitter2: TSplitter;
Splitter3: TSplitter;
btSaveChanges: TButton;
TabControl1: TTabControl;
frTaskView: TfrTaskInstanceView;
ActionList1: TActionList;
acShowAllTasks: TAction;
PopupMenu1: TPopupMenu;
acShowOnlyOpen: TAction;
miView: TMenuItem;
Showonlyopentasks2: TMenuItem;
Showalltasks2: TMenuItem;
WorkflowDiagram1: TWorkflowDiagram;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btSaveChangesClick(Sender: TObject);
procedure WorkflowDiagram1Click(Sender: TObject);
procedure TabControl1Change(Sender: TObject);
procedure lvTasksSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
procedure acShowOnlyOpenExecute(Sender: TObject);
procedure acShowOnlyOpenUpdate(Sender: TObject);
procedure acShowAllTasksExecute(Sender: TObject);
procedure acShowAllTasksUpdate(Sender: TObject);
procedure lvTasksCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
FWorkIns: TWorkflowInstance;
FLastActivePageName: string;
FUpdatingTabs: integer;
FFieldPanel: TTaskFieldPanel;
FLogView: TTaskLogListView;
FFreeOnClose: boolean;
function GetWorkIns: TWorkflowInstance;
procedure AddAttachmentTab(AAttach: TWorkflowAttachment; APermissions: TAttachmentPermissions);
procedure UpdateFieldsTab;
procedure UpdateActivePage;
procedure UpdateFixedTabs;
function FindTabByType(AType: integer): integer;
procedure SaveChanges;
procedure UpdateWorkflowDiagram;
procedure UpdateAttachmentTabs;
procedure BeginUpdateTabs;
procedure EndUpdateTabs;
procedure Localize;
procedure UpdateLogTab;
{ Private declarations }
protected
procedure Loaded; override;
public
{ Public declarations }
procedure SetFilter(FilterType: TTaskFilterType; AFilter: string);
procedure LoadData;
property FreeOnClose: boolean read FFreeOnClose write FFreeOnClose;
end;
implementation
uses fAttachmentFrame, wsRes;
{$R *.DFM}
const
_TaskTabIndex = 1;
_WorkflowTabIndex = 2;
_FieldTabIndex = 3;
_TaskLogIndex = 4;
_MaxFixedTab = 4;
{ TfmTaskList }
procedure TfmTaskList.LoadData;
begin
lvTasks.LoadFromDatabase;
if lvTasks.SelectedTask = nil then
begin
if lvTasks.Items.Count > 0 then
lvTasks.Items.Item[0].Selected := true
else
lvTasksSelectItem(nil, nil, false);
end;
end;
procedure TfmTaskList.UpdateActivePage;
var
AFrame: TfrAttachmentFrame;
begin
if FUpdatingTabs = 0 then
begin
if (TabControl1.TabIndex = -1) and (TabControl1.Tabs.Count > 0) then
begin
TabControl1.TabIndex := 0;
end;
if TabControl1.TabIndex > -1 then
{$WARNINGS OFF}
Case integer(TabControl1.Tabs.Objects[TabControl1.TabIndex]) of
{$WARNINGS ON}
_TaskTabIndex:
begin
//frTaskView.Visible := true;
frTaskView.BringToFront;
end;
_WorkflowTabIndex:
begin
//WorkflowDiagram1.Visible := true;
TControl(WorkflowDiagram1).BringToFront;
WorkflowDiagram1.MakeActiveNodeVisible;
//WorkflowDiagram1.SetFocus;
end;
_FieldTabIndex:
begin
FFieldPanel.BringToFront;
end;
_TaskLogIndex:
begin
if lvTasks.SelectedTask <> nil then
FLogView.TaskInsKey := lvTasks.SelectedTask.Key
else
FLogView.TaskInsKey := '';
FLogView.LoadFromDatabase;
FLogView.BringToFront;
end;
else
AFrame := TfrAttachmentFrame(TabControl1.Tabs.Objects[TabControl1.TabIndex]);
//AFrame.Visible := true;
AFrame.BringToFront;
end;
end;
end;
(*function TfmTaskList.WorkflowTabVisible: boolean;
begin
result := (TabControl1.TabIndex > -1) and (integer(TabControl1.Tabs.Objects[TabControl1.TabIndex]) = _WorkflowTabIndex);
end;*)
procedure TfmTaskList.UpdateWorkflowDiagram;
var
AWorkIns: TWorkflowInstance;
begin
// if WorkflowTabVisible then
if (lvTasks.SelectedTask <> nil) or (lvTasks.FilterType = tfWorkIns) then
begin
WorkflowDiagram1.BeginUpdate;
try
AWorkIns := GetWorkIns;
AWorkIns.AssignToDiagram(WorkflowDiagram1, true);
Case AWorkIns.Status of
wsNotStarted:
WorkflowDiagram1.ViewStateMode := vmStart;
wsFinished, wsFinishedWithError:
WorkflowDiagram1.ViewStateMode := vmEnd;
else
WorkflowDiagram1.ViewStateMode := vmRun;
end;
WorkflowDiagram1.TopRuler.Visible := false;
WorkflowDiagram1.LeftRuler.Visible := false;
WorkflowDiagram1.AutoPage := false;
WorkflowDiagram1.AutoScroll := true;
WorkflowDiagram1.PageLines.Visible := false;
WorkflowDiagram1.State := dsView;
WorkflowDiagram1.MakeActiveNodeVisible;
finally
WorkflowDiagram1.EndUpdate;
end;
end else
WorkflowDiagram1.Clear;
end;
procedure TfmTaskList.FormCreate(Sender: TObject);
begin
//frTaskView.OnTaskChanged := TaskEdited;
FFieldPanel := TTaskFieldPanel.Create(Self);
FFieldPanel.Parent := TabControl1;
FFieldPanel.Align := alClient;
FLogView := TTaskLogListView.Create(Self);
FLogView.Parent := TabControl1;
FLogView.Align := alClient;
FUpdatingTabs := 0;
frTaskView.Task := nil;
{Create list view columns}
lvTasks.Columns.Clear;
With lvTasks.Columns.Add do
begin
Caption := _str(SColumnKey);
Width := 40;
end;
With lvTasks.Columns.Add do
begin
Caption := _str(SColumnName);
Width := 100;
end;
With lvTasks.Columns.Add do
begin
Caption := _str(SColumnWorkflow);
Width := 100;
end;
With lvTasks.Columns.Add do
begin
Caption := _str(SColumnSubject);
Width := 220;
end;
With lvTasks.Columns.Add do
begin
Caption := _str(SColumnStatus);
Width := 100;
end;
With lvTasks.Columns.Add do
begin
Caption := _str(SColumnUser);
Width := 100;
end;
end;
procedure TfmTaskList.SaveChanges;
(*function FindListView(ATab: TComponent): TAttachmentListView;
var
c: integer;
begin
result := nil;
for c := 0 to ATab.ComponentCount - 1 do
begin
if ATab.Components[c] is TAttachmentListView then
begin
result := TAttachmentListView(ATab.Components[c]);
exit;
end else
begin
result := FindListView(ATab.Components[c]);
if result <> nil then
exit;
end;
end;
end;*)
var
AAttach: TWorkflowAttachment;
AWorkIns: TWorkflowInstance;
lvItems: TAttachmentListView;
c: integer;
begin
if lvTasks.SelectedTask <> nil then
begin
{Get the workflowinstance related to the task}
AWorkIns := GetWorkIns;
{Save the attachments}
{$WARNINGS OFF}
for c := 0 to TabControl1.Tabs.Count - 1 do if integer(TabControl1.Tabs.Objects[c]) > _MaxFixedTab then
{$WARNINGS ON}
begin
AAttach := AWorkIns.Diagram.Attachments.FindByName(TabControl1.Tabs[c]);
if AAttach <> nil then
begin
lvItems := TfrAttachmentFrame(TabControl1.Tabs.Objects[c]).lvItems;
if lvItems <> nil then
begin
AAttach.Items.Assign(lvItems.Attachments);
end;
end;
end;
{Save the fields}
if FindTabByType(_FieldTabIndex) > -1 then
begin
if not FFieldPanel.ValidateValues then
begin
TabControl1.TabIndex := FindTabByType(_FieldTabIndex);
TabControl1Change(TabControl1);
if FFieldPanel.CanFocus then
FFieldPanel.SetFocus;
FFieldPanel.FocusLastError;
ShowMessage(FFieldPanel.ErrorInfo.Msg);
Abort;
//raise EWorkflowException.Create(FFieldPanel.ErrorInfo.Msg);
end;
FFieldPanel.SaveDiagramVariables(AWorkIns.Diagram);
end;
{Save the workflow instance}
WorkflowStudio.WorkflowManager.SaveWorkflowInstance(AWorkIns);
{Save the task instance. WARNING - this should be done after any saving code, because
it loads the workflowinstance and signal it (run it again). So, it must be executed
after all processing so it gets the most up to date workflow instance object}
WorkflowStudio.TaskManager.SaveTaskInstance(lvTasks.SelectedTask);
{From below, it's only visual stuff}
{Reload the task list from database, in case it's not more in the list (for example,
it might be completed}
LoadData;
//lvTasks.LoadFromDatabase;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -