IDE: many improvements for todolist from Gerard

git-svn-id: trunk@13010 -
This commit is contained in:
mattias 2007-11-24 21:23:19 +00:00
parent 65ae8c2e56
commit 42edb792e6
8 changed files with 883 additions and 378 deletions

View File

@ -2295,11 +2295,15 @@ resourcestring
lisTodoListGotoLine='Goto selected source line';
lisTodoListPrintList='Print todo items';
lisToDoListOptions='ToDo options...';
lisToDoLDescription = 'Description';
lisCTInsertMacro = 'Insert Macro';
lisToDoLFile = 'File';
lisToDoLLine = 'Line';
lisToDoLDone = 'Done';
lisToDoLDescription = 'Description';
lisToDoLPriority = 'Priority';
lisToDoLFile = 'Module';
lisToDoLLine = 'Line';
lisToDoLOwner = 'Owner';
listToDoLCategory = 'Category';
// packages
lisPkgFileTypeUnit = 'Unit';
lisPkgFileTypeVirtualUnit = 'Virtual Unit';

View File

@ -1,47 +1,94 @@
object TodoDialog: TTodoDialog
Left = 354
Height = 257
Top = 215
Width = 400
HorzScrollBar.Page = 399
VertScrollBar.Page = 256
Left = 342
Height = 248
Top = 202
Width = 483
HorzScrollBar.Page = 482
VertScrollBar.Page = 247
ActiveControl = OkButton
Caption = 'Insert Todo'
ClientHeight = 257
ClientWidth = 400
ClientHeight = 248
ClientWidth = 483
OnShow = FormShow
object TodoLabel: TLabel
Left = 16
Height = 20
Left = 8
Height = 14
Top = 8
Width = 30
Width = 27
Caption = 'Text:'
FocusControl = TodoMemo
ParentColor = False
end
object PriorityLabel: TLabel
Left = 10
Height = 14
Top = 167
Width = 35
Caption = 'Priority'
ParentColor = False
end
object OwnerLabel: TLabel
Left = 56
Height = 14
Top = 168
Width = 33
Caption = 'Owner'
ParentColor = False
end
object CategoryLabel: TLabel
Left = 248
Height = 14
Top = 168
Width = 46
Caption = 'Category'
ParentColor = False
end
object OkButton: TButton
Left = 112
Left = 312
Height = 25
Top = 208
Top = 216
Width = 75
Caption = 'Ok'
ModalResult = 1
TabOrder = 1
end
object CancelButton: TButton
Left = 208
Left = 397
Height = 25
Top = 208
Top = 216
Width = 75
Caption = 'Cancel'
ModalResult = 2
TabOrder = 2
end
object TodoMemo: TMemo
Left = 16
Height = 168
Left = 8
Height = 136
Top = 24
Width = 368
Width = 464
ScrollBars = ssAutoBoth
TabOrder = 0
end
object PriorityEdit: TEdit
Left = 8
Height = 23
Top = 181
Width = 38
OnKeyPress = PriorityEditKeyPress
TabOrder = 3
end
object OwnerEdit: TEdit
Left = 56
Height = 23
Top = 181
Width = 182
TabOrder = 4
end
object CategoryEdit: TEdit
Left = 248
Height = 23
Top = 181
Width = 224
TabOrder = 5
end
end

View File

@ -1,16 +1,26 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TTodoDialog','FORMDATA',[
'TPF0'#11'TTodoDialog'#10'TodoDialog'#4'Left'#3'b'#1#6'Height'#3#1#1#3'Top'#3
+#215#0#5'Width'#3#144#1#18'HorzScrollBar.Page'#3#143#1#18'VertScrollBar.Page'
+#3#0#1#13'ActiveControl'#7#8'OkButton'#7'Caption'#6#11'Insert Todo'#12'Clien'
+'tHeight'#3#1#1#11'ClientWidth'#3#144#1#0#6'TLabel'#9'TodoLabel'#4'Left'#2#16
+#6'Height'#2#20#3'Top'#2#8#5'Width'#2#30#7'Caption'#6#5'Text:'#12'FocusContr'
+'ol'#7#8'TodoMemo'#11'ParentColor'#8#0#0#7'TButton'#8'OkButton'#4'Left'#2'p'
+#6'Height'#2#25#3'Top'#3#208#0#5'Width'#2'K'#7'Caption'#6#2'Ok'#11'ModalResu'
+'lt'#2#1#8'TabOrder'#2#1#0#0#7'TButton'#12'CancelButton'#4'Left'#3#208#0#6'H'
+'eight'#2#25#3'Top'#3#208#0#5'Width'#2'K'#7'Caption'#6#6'Cancel'#11'ModalRes'
+'ult'#2#2#8'TabOrder'#2#2#0#0#5'TMemo'#8'TodoMemo'#4'Left'#2#16#6'Height'#3
+#168#0#3'Top'#2#24#5'Width'#3'p'#1#10'ScrollBars'#7#10'ssAutoBoth'#8'TabOrde'
+'r'#2#0#0#0#0
'TPF0'#11'TTodoDialog'#10'TodoDialog'#4'Left'#3'V'#1#6'Height'#3#248#0#3'Top'
+#3#202#0#5'Width'#3#227#1#18'HorzScrollBar.Page'#3#226#1#18'VertScrollBar.Pa'
+'ge'#3#247#0#13'ActiveControl'#7#8'OkButton'#7'Caption'#6#11'Insert Todo'#12
+'ClientHeight'#3#248#0#11'ClientWidth'#3#227#1#6'OnShow'#7#8'FormShow'#0#6'T'
+'Label'#9'TodoLabel'#4'Left'#2#8#6'Height'#2#14#3'Top'#2#8#5'Width'#2#27#7'C'
+'aption'#6#5'Text:'#12'FocusControl'#7#8'TodoMemo'#11'ParentColor'#8#0#0#6'T'
+'Label'#13'PriorityLabel'#4'Left'#2#10#6'Height'#2#14#3'Top'#3#167#0#5'Width'
+#2'#'#7'Caption'#6#8'Priority'#11'ParentColor'#8#0#0#6'TLabel'#10'OwnerLabel'
+#4'Left'#2'8'#6'Height'#2#14#3'Top'#3#168#0#5'Width'#2'!'#7'Caption'#6#5'Own'
+'er'#11'ParentColor'#8#0#0#6'TLabel'#13'CategoryLabel'#4'Left'#3#248#0#6'Hei'
+'ght'#2#14#3'Top'#3#168#0#5'Width'#2'.'#7'Caption'#6#8'Category'#11'ParentCo'
+'lor'#8#0#0#7'TButton'#8'OkButton'#4'Left'#3'8'#1#6'Height'#2#25#3'Top'#3#216
+#0#5'Width'#2'K'#7'Caption'#6#2'Ok'#11'ModalResult'#2#1#8'TabOrder'#2#1#0#0#7
+'TButton'#12'CancelButton'#4'Left'#3#141#1#6'Height'#2#25#3'Top'#3#216#0#5'W'
+'idth'#2'K'#7'Caption'#6#6'Cancel'#11'ModalResult'#2#2#8'TabOrder'#2#2#0#0#5
+'TMemo'#8'TodoMemo'#4'Left'#2#8#6'Height'#3#136#0#3'Top'#2#24#5'Width'#3#208
+#1#10'ScrollBars'#7#10'ssAutoBoth'#8'TabOrder'#2#0#0#0#5'TEdit'#12'PriorityE'
+'dit'#4'Left'#2#8#6'Height'#2#23#3'Top'#3#181#0#5'Width'#2'&'#10'OnKeyPress'
+#7#20'PriorityEditKeyPress'#8'TabOrder'#2#3#0#0#5'TEdit'#9'OwnerEdit'#4'Left'
+#2'8'#6'Height'#2#23#3'Top'#3#181#0#5'Width'#3#182#0#8'TabOrder'#2#4#0#0#5'T'
+'Edit'#12'CategoryEdit'#4'Left'#3#248#0#6'Height'#2#23#3'Top'#3#181#0#5'Widt'
+'h'#3#224#0#8'TabOrder'#2#5#0#0#0
]);

View File

@ -18,6 +18,10 @@
* *
***************************************************************************
}
(*
Modified by Gerard Visent <gerardusmercator@gmail.com> on 5/11/2007
- Extended to allow adding Owner, Category and priority
*)
unit ToDoDlg;
{$mode objfpc}{$H+}
@ -25,37 +29,72 @@ unit ToDoDlg;
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls;
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, TodoList;
type
{ TTodoDialog }
TTodoDialog = class(TForm)
OwnerEdit: TEdit;
CategoryEdit: TEdit;
CategoryLabel: TLabel;
PriorityEdit: TEdit;
PriorityLabel: TLabel;
OwnerLabel: TLabel;
OkButton: TButton;
CancelButton: TButton;
TodoLabel: TLabel;
TodoMemo: TMemo;
procedure FormShow(Sender: TObject);
procedure PriorityEditKeyPress(Sender: TObject; var Key: char);
private
{ private declarations }
public
{ public declarations }
end;
Function ExecuteTodoDialog: TTodoItem;
function ShowTodoDialog(TodoMessage: TStrings): Boolean;
implementation
{ TTodoDialog }
function ShowTodoDialog(TodoMessage: TStrings): Boolean;
var
TodoDialog: TTodoDialog;
{ TTodoDialog }
procedure TTodoDialog.PriorityEditKeyPress(Sender: TObject; var Key: char);
begin
TodoDialog:=TTodoDialog.Create(nil);
Result:=TodoDialog.ShowModal = mrOk;
If Result and (TodoMessage <> nil) Then TodoMessage.Assign(TodoDialog.TodoMemo.Lines);
TodoDialog.Free;
if not (Key in ['0'..'9']) then
Key := #0;
end;
procedure TTodoDialog.FormShow(Sender: TObject);
begin
TodoMemo.SetFocus;
end;
function ExecuteTodoDialog: TTodoItem;
var
aTodoDialog: TTodoDialog;
aPriority: integer;
begin
Result := nil;
aTodoDialog := TTodoDialog.Create(nil);
aTodoDialog.ShowModal;
if aTodoDialog.ModalResult = mrOk then
begin
Result := TTodoItem.Create;
Result.AltNotation := True; // TODO: Should be an option in the future
Result.Category := aTodoDialog.CategoryEdit.Text;
Result.Done := False;
Result.Owner := aTodoDialog.OwnerEdit.Text;
Result.Text := aTodoDialog.TodoMemo.Text;
if TryStrToInt(aTodoDialog.PriorityEdit.Text, aPriority) then
Result.Priority := aPriority;
end;
aTodoDialog.Release;
end;
initialization

View File

@ -1,71 +1,86 @@
object frmTodo: TfrmTodo
Left = 313
Left = 177
Height = 300
Top = 610
Width = 500
HorzScrollBar.Page = 499
Top = 209
Width = 643
HorzScrollBar.Page = 642
VertScrollBar.Page = 299
ActiveControl = lvTodo
Caption = 'frmTodo'
ClientHeight = 300
ClientWidth = 643
KeyPreview = True
OnCreate = FormCreate
OnKeyDown = FormKeyDown
Position = poScreenCenter
object StatusBar: TStatusBar
Height = 20
Top = 280
Width = 500
Height = 23
Top = 277
Width = 643
Panels = <>
end
object lvTodo: TListView
Height = 232
Height = 229
Top = 48
Width = 500
Width = 643
Align = alClient
Columns = <
item
AutoSize = True
Caption = 'Caption'
Width = 40
end
item
AutoSize = True
Caption = 'Caption'
Width = 100
end
item
AutoSize = True
Caption = 'Caption'
Width = 40
end
item
AutoSize = True
Caption = 'Caption'
Width = 100
end
item
Caption = 'Caption'
end
item
Caption = 'Caption'
end
item
Caption = 'Caption'
end>
RowSelect = True
ScrollBars = ssAutoBoth
TabOrder = 0
ViewStyle = vsReport
OnDblClick = tbGotoClick
OnClick = lvTodoClick
end
object ToolBar: TToolBar
Height = 48
Width = 500
Width = 643
ButtonHeight = 46
ButtonWidth = 47
Caption = 'ToolBar'
Flat = True
Images = ImageList1
Images = ImageList
ParentShowHint = False
ShowCaptions = True
ShowHint = True
TabOrder = 1
object tbOptions: TToolButton
Left = 145
Left = 142
Top = 2
Caption = 'Options'
ImageIndex = 3
Visible = False
end
object tbPrint: TToolButton
Left = 98
Left = 95
Top = 2
Caption = 'Print'
ImageIndex = 2
@ -74,78 +89,164 @@ object frmTodo: TfrmTodo
object tbRefresh: TToolButton
Left = 1
Top = 2
Caption = 'Refresh'
ImageIndex = 0
OnClick = tbRefreshClick
Action = acRefresh
end
object tbGoto: TToolButton
Left = 51
Left = 48
Top = 2
Caption = 'Goto'
ImageIndex = 1
OnClick = tbGotoClick
Action = acGoto
end
end
object ImageList1: TImageList
left = 121
top = 42
object ImageList: TImageList
left = 232
top = 8
Bitmap = {
6C690400000010000000100000009C0100002F2A2058504D202A2F0A73746174
69632063686172202A677261706869635B5D203D207B0A223136203136203320
31222C0A222E2063204E6F6E65222C0A222C20632023333133313331222C0A22
2D20632023354141444646222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E22
2C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2E2E
2E2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2C2C2C2C2C2C2E2E2E222C0A222E
2E2E2E2E2C2C2D2D2D2C2C2C2C2E2E222C0A222E2E2E2E2C2C2D2D2C2C2C2E2E
2E2E2E222C0A222E2E2E2E2C2D2D2C2E2E2E2E2E2E2E2E222C0A222E2E2E2C2C
2D2D2C2E2E2E2E2E2E2E2E222C0A222E2E2E2C2D2D2C2E2E2E2E2E2E2E2E2E22
2C0A222E2E2E2C2D2D2C2E2E2E2E2E2E2E2E2E222C0A222E2E2E2C2D2D2C2E2E
2E2E2E2E2E2E2E222C0A222E2C2C2D2D2D2C2C2C2C2E2E2E2E2E2E222C0A222E
2E2C2D2D2D2D2D2C2E2E2E2E2E2E2E222C0A222E2E2E2C2C2D2C2C2E2E2E2E2E
2E2E2E222C0A222E2E2E2E2C2C2C2E2E2E2E2E2E2E2E2E222C0A222E2E2E2E2E
2C2E2E2E2E2E2E2E2E2E2E227D0AAB0100002F2A2058504D202A2F0A73746174
69632063686172202A677261706869635B5D203D207B0A223136203136203420
31222C0A222E2063204E6F6E65222C0A222C20632023333133313331222C0A22
2D20632023464646464646222C0A222A20632023464630303030222C0A222E2E
2E2E2E2E2E2E2E2E2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E
2E2E222C0A222E2E2E2C2C2C2C2C2C2C2E2E2E2E2E2E222C0A222E2E2E2C2D2D
2D2D2D2D2C2E2E2E2E2E222C0A222E2E2E2C2D2D2D2D2D2D2D2C2E2E2E2E222C
0A222E2E2E2C2D2D2D2D2D2D2D2D2C2E2E2E222C0A222E2E2E2C2D2D2D2D2D2D
2D2D2C2E2E2E222C0A222E2E2E2C2D2D2D2D2D2D2D2D2C2E2E2E222C0A222E2A
2E2C2D2D2D2D2D2D2D2D2C2E2E2E222C0A222E2E2A2A2A2A2A2A2A2A2A2A2A2E
2E2E222C0A222E2A2E2C2D2D2D2D2D2D2D2D2C2E2E2E222C0A222E2E2E2C2D2D
2D2D2D2D2D2D2C2E2E2E222C0A222E2E2E2C2D2D2D2D2D2D2D2D2C2E2E2E222C
0A222E2E2E2C2C2C2C2C2C2C2C2C2C2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E
2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E227D0AC90100
002F2A2058504D202A2F0A7374617469632063686172202A677261706869635B
5D203D207B0A22313620313620362031222C0A222E2063202330303030303022
2C0A222C20632023383438343834222C0A222D20632023333133313331222C0A
222A2063204E6F6E65222C0A226120632023433743374337222C0A2262206320
23303046463030222C0A222E2E2C2E2D2E2E2E2E2E2E2E2E2E2E2E222C0A222E
2E2C2E2D2E2E2E2E2E2E2E2E2E2E2E222C0A222A2A2A2A2A2A2A2A2A2A2A2A2A
2A2A2A222C0A222A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A222C0A222A2A2A2A2A
2A2A2D2D2D2D2D2D2D2A2A222C0A222A2A2A2A2A2A2D2E2E2E2E2E2D2A2A2A22
2C0A222A2A2A2A2A2D2E2E2E2E2E2D2A2A2A2A222C0A222A2A2A2A2D2E2E2E2E
2E2D2D2D2D2D2A222C0A222A2A2A2D2D2D2D2D2D2D2D61612D2D2A222C0A222A
2A2D6161616161616161612D2C2D2A222C0A222A2A2D2D2D2D2D2D2D2D2D2D2C
2C2D2A222C0A222A2A2D612E61626161612D2C2C2D2D2A222C0A222A2A2D2D2D
2D2D2D2D2D2D2D2D2D2A2A222C0A222A2A2D61616161616161612D2D2A2A2A22
2C0A222A2A2A2D2D2D2D2D2D2D2D2D2A2A2A2A222C0A222A2A2A2A2A2A2A2A2A
2A2A2A2A2A2A2A227D0ABA0100002F2A2058504D202A2F0A7374617469632063
686172202A677261706869635B5D203D207B0A22313620313620352031222C0A
222E2063204E6F6E65222C0A222C20632023333133313331222C0A222D206320
23303035414336222C0A222A20632023464646464646222C0A22612063202346
4630303030222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E222C0A222E2C2C
2C2C2C2C2C2C2C2C2C2C2C2C2E222C0A222E2C2D2D2D2D2D2D2D2D2D2D2D2D2C
2E222C0A222E2C2C2C2C2C2C2C2C2C2C2C2C2C2C2E222C0A222E2C2A2A2A2A2A
2A2A2A2A2A2A2A2C2E222C0A222E2C2A612A2A2A61612A2A2A2A2A2C2E222C0A
222E2C2A61612A61612A2A2A2A2A2A2C2E222C0A222E2C2A2A6161612A2A2A2A
2A2A2A2C2E222C0A222E2C2A2A2A612A2A2A2A2A2A2A2A2C2E222C0A222E2C2A
612A2A2A61612A2A2A2A2A2C2E222C0A222E2C2A61612A61612A2A2A2A2A2A2C
2E222C0A222E2C2A2A6161612A2A2A2A2A2A2A2C2E222C0A222E2C2A2A2A612A
2A2A2A2A2A2A2A2C2E222C0A222E2C2A2A2A2A2A2A2A2A2A2A2A2A2C2E222C0A
222E2C2C2C2C2C2C2C2C2C2C2C2C2C2C2E222C0A222E2E2E2E2E2E2E2E2E2E2E
2E2E2E2E2E227D0A
4C69040000001000000010000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000313131FF313131FF313131FF313131FF313131FF3131
31FF000000000000000000000000000000000000000000000000000000000000
0000313131FF313131FFFFAD5AFFFFAD5AFFFFAD5AFF313131FF313131FF3131
31FF313131FF0000000000000000000000000000000000000000000000003131
31FF313131FFFFAD5AFFFFAD5AFF313131FF313131FF313131FF000000000000
0000000000000000000000000000000000000000000000000000000000003131
31FFFFAD5AFFFFAD5AFF313131FF000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000313131FF3131
31FFFFAD5AFFFFAD5AFF313131FF000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000313131FFFFAD
5AFFFFAD5AFF313131FF00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000313131FFFFAD
5AFFFFAD5AFF313131FF00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000313131FFFFAD
5AFFFFAD5AFF313131FF00000000000000000000000000000000000000000000
000000000000000000000000000000000000313131FF313131FFFFAD5AFFFFAD
5AFFFFAD5AFF313131FF313131FF313131FF313131FF00000000000000000000
00000000000000000000000000000000000000000000313131FFFFAD5AFFFFAD
5AFFFFAD5AFFFFAD5AFFFFAD5AFF313131FF0000000000000000000000000000
0000000000000000000000000000000000000000000000000000313131FF3131
31FFFFAD5AFF313131FF313131FF000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000003131
31FF313131FF313131FF00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000313131FF0000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000313131FF3131
31FF313131FF313131FF313131FF313131FF313131FF00000000000000000000
0000000000000000000000000000000000000000000000000000313131FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF313131FF000000000000
0000000000000000000000000000000000000000000000000000313131FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF313131FF0000
0000000000000000000000000000000000000000000000000000313131FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3131
31FF000000000000000000000000000000000000000000000000313131FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3131
31FF000000000000000000000000000000000000000000000000313131FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3131
31FF000000000000000000000000000000000000FFFF00000000313131FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3131
31FF00000000000000000000000000000000000000000000FFFF0000FFFF0000
FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
FFFF000000000000000000000000000000000000FFFF00000000313131FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3131
31FF000000000000000000000000000000000000000000000000313131FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3131
31FF000000000000000000000000000000000000000000000000313131FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3131
31FF000000000000000000000000000000000000000000000000313131FF3131
31FF313131FF313131FF313131FF313131FF313131FF313131FF313131FF3131
31FF000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000FF000000FF848484FF000000FF3131
31FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
00FF000000FF000000FF000000FF000000FF000000FF848484FF000000FF3131
31FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
00FF000000FF000000FF000000FF000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000313131FF313131FF313131FF313131FF313131FF3131
31FF313131FF0000000000000000000000000000000000000000000000000000
000000000000313131FF000000FF000000FF000000FF000000FF000000FF3131
31FF000000000000000000000000000000000000000000000000000000000000
0000313131FF000000FF000000FF000000FF000000FF000000FF313131FF0000
0000000000000000000000000000000000000000000000000000000000003131
31FF000000FF000000FF000000FF000000FF000000FF313131FF313131FF3131
31FF313131FF313131FF00000000000000000000000000000000313131FF3131
31FF313131FF313131FF313131FF313131FF313131FF313131FFC7C7C7FFC7C7
C7FF313131FF313131FF000000000000000000000000313131FFC7C7C7FFC7C7
C7FFC7C7C7FFC7C7C7FFC7C7C7FFC7C7C7FFC7C7C7FFC7C7C7FFC7C7C7FF3131
31FF848484FF313131FF000000000000000000000000313131FF313131FF3131
31FF313131FF313131FF313131FF313131FF313131FF313131FF313131FF8484
84FF848484FF313131FF000000000000000000000000313131FFC7C7C7FF0000
00FFC7C7C7FF00FF00FFC7C7C7FFC7C7C7FFC7C7C7FF313131FF848484FF8484
84FF313131FF313131FF000000000000000000000000313131FF313131FF3131
31FF313131FF313131FF313131FF313131FF313131FF313131FF313131FF3131
31FF313131FF00000000000000000000000000000000313131FFC7C7C7FFC7C7
C7FFC7C7C7FFC7C7C7FFC7C7C7FFC7C7C7FFC7C7C7FFC7C7C7FF313131FF3131
31FF000000000000000000000000000000000000000000000000313131FF3131
31FF313131FF313131FF313131FF313131FF313131FF313131FF313131FF0000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000313131FF313131FF313131FF3131
31FF313131FF313131FF313131FF313131FF313131FF313131FF313131FF3131
31FF313131FF313131FF0000000000000000313131FFC65A00FFC65A00FFC65A
00FFC65A00FFC65A00FFC65A00FFC65A00FFC65A00FFC65A00FFC65A00FFC65A
00FFC65A00FF313131FF0000000000000000313131FF313131FF313131FF3131
31FF313131FF313131FF313131FF313131FF313131FF313131FF313131FF3131
31FF313131FF313131FF0000000000000000313131FFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFF313131FF0000000000000000313131FFFFFFFFFF0000FFFFFFFF
FFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFF313131FF0000000000000000313131FFFFFFFFFF0000FFFF0000
FFFFFFFFFFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFF313131FF0000000000000000313131FFFFFFFFFFFFFFFFFF0000
FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFF313131FF0000000000000000313131FFFFFFFFFFFFFFFFFFFFFF
FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFF313131FF0000000000000000313131FFFFFFFFFF0000FFFFFFFF
FFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFF313131FF0000000000000000313131FFFFFFFFFF0000FFFF0000
FFFFFFFFFFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFF313131FF0000000000000000313131FFFFFFFFFFFFFFFFFF0000
FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFF313131FF0000000000000000313131FFFFFFFFFFFFFFFFFFFFFF
FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFF313131FF0000000000000000313131FFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFF313131FF0000000000000000313131FF313131FF313131FF3131
31FF313131FF313131FF313131FF313131FF313131FF313131FF313131FF3131
31FF313131FF313131FF00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000
}
end
object ActionList: TActionList
Images = ImageList
left = 414
top = 11
object acGoto: TAction
Caption = 'Goto'
DisableIfNoHandler = True
ImageIndex = 1
OnExecute = acGotoExecute
end
object acRefresh: TAction
Caption = 'Refresh'
DisableIfNoHandler = True
ImageIndex = 0
OnExecute = acRefreshExecute
end
end
end

View File

@ -1,55 +1,169 @@
{ This is an automatically generated lazarus resource file }
LazarusResources.Add('TfrmTodo','FORMDATA',[
'TPF0'#8'TfrmTodo'#7'frmTodo'#4'Left'#3'9'#1#6'Height'#3','#1#3'Top'#3'b'#2#5
+'Width'#3#244#1#18'HorzScrollBar.Page'#3#243#1#18'VertScrollBar.Page'#3'+'#1
+#13'ActiveControl'#7#6'lvTodo'#7'Caption'#6#7'frmTodo'#10'KeyPreview'#9#8'On'
+'Create'#7#10'FormCreate'#9'OnKeyDown'#7#11'FormKeyDown'#8'Position'#7#14'po'
+'ScreenCenter'#0#10'TStatusBar'#9'StatusBar'#6'Height'#2#20#3'Top'#3#24#1#5
+'Width'#3#244#1#6'Panels'#14#0#0#0#9'TListView'#6'lvTodo'#6'Height'#3#232#0#3
+'Top'#2'0'#5'Width'#3#244#1#5'Align'#7#8'alClient'#7'Columns'#14#1#8'AutoSiz'
+'e'#9#7'Caption'#6#7'Caption'#0#1#8'AutoSize'#9#7'Caption'#6#7'Caption'#0#1#8
+'AutoSize'#9#7'Caption'#6#7'Caption'#0#1#8'AutoSize'#9#7'Caption'#6#7'Captio'
+'n'#0#0#9'RowSelect'#9#10'ScrollBars'#7#10'ssAutoBoth'#8'TabOrder'#2#0#9'Vie'
+'wStyle'#7#8'vsReport'#10'OnDblClick'#7#11'tbGotoClick'#0#0#8'TToolBar'#7'To'
+'olBar'#6'Height'#2'0'#5'Width'#3#244#1#12'ButtonHeight'#2'.'#11'ButtonWidth'
+#2'/'#7'Caption'#6#7'ToolBar'#4'Flat'#9#6'Images'#7#10'ImageList1'#14'Parent'
+'ShowHint'#8#12'ShowCaptions'#9#8'ShowHint'#9#8'TabOrder'#2#1#0#11'TToolButt'
+'on'#9'tbOptions'#4'Left'#3#145#0#3'Top'#2#2#7'Caption'#6#7'Options'#10'Imag'
+'eIndex'#2#3#7'Visible'#8#0#0#11'TToolButton'#7'tbPrint'#4'Left'#2'b'#3'Top'
+#2#2#7'Caption'#6#5'Print'#10'ImageIndex'#2#2#7'Visible'#8#0#0#11'TToolButto'
+'n'#9'tbRefresh'#4'Left'#2#1#3'Top'#2#2#7'Caption'#6#7'Refresh'#10'ImageInde'
+'x'#2#0#7'OnClick'#7#14'tbRefreshClick'#0#0#11'TToolButton'#6'tbGoto'#4'Left'
+#2'3'#3'Top'#2#2#7'Caption'#6#4'Goto'#10'ImageIndex'#2#1#7'OnClick'#7#11'tbG'
+'otoClick'#0#0#0#10'TImageList'#10'ImageList1'#4'left'#2'y'#3'top'#2'*'#6'Bi'
+'tmap'#10#232#6#0#0'li'#4#0#0#0#16#0#0#0#16#0#0#0#156#1#0#0'/* XPM */'#10'st'
+'atic char *graphic[] = {'#10'"16 16 3 1",'#10'". c None",'#10'", c #313131"'
+','#10'"- c #5AADFF",'#10'"................",'#10'"................",'#10'".'
+'...............",'#10'".......,,,,,,...",'#10'".....,,---,,,,..",'#10'"....'
+',,--,,,.....",'#10'"....,--,........",'#10'"...,,--,........",'#10'"...,--,'
+'.........",'#10'"...,--,.........",'#10'"...,--,.........",'#10'".,,---,,,,'
+'......",'#10'"..,-----,.......",'#10'"...,,-,,........",'#10'"....,,,......'
+'...",'#10'".....,.........."}'#10#171#1#0#0'/* XPM */'#10'static char *grap'
+'hic[] = {'#10'"16 16 4 1",'#10'". c None",'#10'", c #313131",'#10'"- c #FFF'
+'FFF",'#10'"* c #FF0000",'#10'"................",'#10'"................",'#10
+'"...,,,,,,,......",'#10'"...,------,.....",'#10'"...,-------,....",'#10'"..'
+'.,--------,...",'#10'"...,--------,...",'#10'"...,--------,...",'#10'".*.,-'
+'-------,...",'#10'"..***********...",'#10'".*.,--------,...",'#10'"...,----'
+'----,...",'#10'"...,--------,...",'#10'"...,,,,,,,,,,...",'#10'"...........'
+'.....",'#10'"................"}'#10#201#1#0#0'/* XPM */'#10'static char *gr'
+'aphic[] = {'#10'"16 16 6 1",'#10'". c #000000",'#10'", c #848484",'#10'"- c'
+' #313131",'#10'"* c None",'#10'"a c #C7C7C7",'#10'"b c #00FF00",'#10'"..,.-'
+'...........",'#10'"..,.-...........",'#10'"****************",'#10'"********'
+'********",'#10'"*******-------**",'#10'"******-.....-***",'#10'"*****-.....'
+'-****",'#10'"****-.....-----*",'#10'"***--------aa--*",'#10'"**-aaaaaaaaa-,'
+'-*",'#10'"**----------,,-*",'#10'"**-a.abaaa-,,--*",'#10'"**------------**"'
+','#10'"**-aaaaaaaa--***",'#10'"***---------****",'#10'"****************"}'
+#10#186#1#0#0'/* XPM */'#10'static char *graphic[] = {'#10'"16 16 5 1",'#10
+'". c None",'#10'", c #313131",'#10'"- c #005AC6",'#10'"* c #FFFFFF",'#10'"a'
+' c #FF0000",'#10'"................",'#10'".,,,,,,,,,,,,,,.",'#10'".,-------'
+'-----,.",'#10'".,,,,,,,,,,,,,,.",'#10'".,************,.",'#10'".,*a***aa***'
+'**,.",'#10'".,*aa*aa******,.",'#10'".,**aaa*******,.",'#10'".,***a********,'
+'.",'#10'".,*a***aa*****,.",'#10'".,*aa*aa******,.",'#10'".,**aaa*******,.",'
+#10'".,***a********,.",'#10'".,************,.",'#10'".,,,,,,,,,,,,,,.",'#10
+'"................"}'#10#0#0#0
'TPF0'#8'TfrmTodo'#7'frmTodo'#4'Left'#3#177#0#6'Height'#3','#1#3'Top'#3#209#0
+#5'Width'#3#131#2#18'HorzScrollBar.Page'#3#130#2#18'VertScrollBar.Page'#3'+'
+#1#13'ActiveControl'#7#6'lvTodo'#7'Caption'#6#7'frmTodo'#12'ClientHeight'#3
+','#1#11'ClientWidth'#3#131#2#10'KeyPreview'#9#8'OnCreate'#7#10'FormCreate'#9
+'OnKeyDown'#7#11'FormKeyDown'#8'Position'#7#14'poScreenCenter'#0#10'TStatusB'
+'ar'#9'StatusBar'#6'Height'#2#23#3'Top'#3#21#1#5'Width'#3#131#2#6'Panels'#14
+#0#0#0#9'TListView'#6'lvTodo'#6'Height'#3#229#0#3'Top'#2'0'#5'Width'#3#131#2
+#5'Align'#7#8'alClient'#7'Columns'#14#1#8'AutoSize'#9#7'Caption'#6#7'Caption'
+#5'Width'#2'('#0#1#8'AutoSize'#9#7'Caption'#6#7'Caption'#5'Width'#2'd'#0#1#8
+'AutoSize'#9#7'Caption'#6#7'Caption'#5'Width'#2'('#0#1#8'AutoSize'#9#7'Capti'
+'on'#6#7'Caption'#5'Width'#2'd'#0#1#7'Caption'#6#7'Caption'#0#1#7'Caption'#6
+#7'Caption'#0#1#7'Caption'#6#7'Caption'#0#0#9'RowSelect'#9#10'ScrollBars'#7
+#10'ssAutoBoth'#8'TabOrder'#2#0#9'ViewStyle'#7#8'vsReport'#7'OnClick'#7#11'l'
+'vTodoClick'#0#0#8'TToolBar'#7'ToolBar'#6'Height'#2'0'#5'Width'#3#131#2#12'B'
+'uttonHeight'#2'.'#11'ButtonWidth'#2'/'#7'Caption'#6#7'ToolBar'#4'Flat'#9#6
+'Images'#7#9'ImageList'#14'ParentShowHint'#8#12'ShowCaptions'#9#8'ShowHint'#9
+#8'TabOrder'#2#1#0#11'TToolButton'#9'tbOptions'#4'Left'#3#142#0#3'Top'#2#2#7
+'Caption'#6#7'Options'#10'ImageIndex'#2#3#7'Visible'#8#0#0#11'TToolButton'#7
+'tbPrint'#4'Left'#2'_'#3'Top'#2#2#7'Caption'#6#5'Print'#10'ImageIndex'#2#2#7
+'Visible'#8#0#0#11'TToolButton'#9'tbRefresh'#4'Left'#2#1#3'Top'#2#2#6'Action'
+#7#9'acRefresh'#0#0#11'TToolButton'#6'tbGoto'#4'Left'#2'0'#3'Top'#2#2#6'Acti'
+'on'#7#6'acGoto'#0#0#0#10'TImageList'#9'ImageList'#4'left'#3#232#0#3'top'#2#8
+#6'Bitmap'#10#14#16#0#0'Li'#4#0#0#0#16#0#0#0#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255'111'#255'111'#255'111'#255'111'
+#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+'111'#255'111'#255#255#173'Z'#255#255#173'Z'#255#255#173'Z'#255'111'#255'111'
+#255'111'#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'
+#255'111'#255#255#173'Z'#255#255#173'Z'#255'111'#255'111'#255'111'#255#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255
+#255#173'Z'#255#255#173'Z'#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255'111'#255#255#173
+'Z'#255#255#173'Z'#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255#255#173'Z'#255#255#173'Z'
+#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255#255#173'Z'#255#255#173'Z'#255'111'
+#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0'111'#255#255#173'Z'#255#255#173'Z'#255'111'#255#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+'111'#255'111'#255#255#173'Z'#255#255#173'Z'#255#255#173'Z'#255'111'#255'111'
+#255'111'#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0'111'#255#255#173'Z'#255#255#173'Z'#255#255#173'Z'#255#255#173'Z'
+#255#255#173'Z'#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255'111'#255#255#173'Z'#255'111'#255'1'
+'11'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255'111'#255'111'#255#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0'111'#255'111'#255'111'#255'111'#255'111'#255'111'#255'111'#255#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0'111'#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255'111'#255#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
,#255#255#255#255#255#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0'111'#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255'111'#255#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255
+#255#0#0#0#0'111'#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255'111'
+#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#0#0#255#255#0#0#255
+#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255
+#0#0#255#255#0#0#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#0#0#0#0
+'111'#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255'111'#255#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0'111'#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255'111'#255#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255'111'#255'111'#255'111'
+#255'111'#255'111'#255'111'#255'111'#255'111'#255'111'#255#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#132#132#132#255#0#0#0
+#255'111'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0
+#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#132#132
+#132#255#0#0#0#255'111'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255
+'111'#255'111'#255'111'#255'111'#255'111'#255'111'#255#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255#0#0#0#255#0#0#0#255#0#0#0
+#255#0#0#0#255#0#0#0#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0'111'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+'111'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'111'#255'111'#255
+'111'#255'111'#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255'111'#255
+'111'#255'111'#255'111'#255'111'#255'111'#255'111'#255#199#199#199#255#199
+#199#199#255'111'#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0'111'#255#199#199#199
+#255#199#199#199#255#199#199#199#255#199#199#199#255#199#199#199#255#199#199
+#199#255#199#199#199#255#199#199#199#255#199#199#199#255'111'#255#132#132#132
+#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0'111'#255'111'#255'111'#255'111'#255'11'
+'1'#255'111'#255'111'#255'111'#255'111'#255'111'#255#132#132#132#255#132#132
+#132#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0'111'#255#199#199#199#255#0#0#0#255
+#199#199#199#255#0#255#0#255#199#199#199#255#199#199#199#255#199#199#199#255
+'111'#255#132#132#132#255#132#132#132#255'111'#255'111'#255#0#0#0#0#0#0#0#0#0
+#0#0#0'111'#255'111'#255'111'#255'111'#255'111'#255'111'#255'111'#255'111'
+#255'111'#255'111'#255'111'#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'
+#255#199#199#199#255#199#199#199#255#199#199#199#255#199#199#199#255#199#199
+#199#255#199#199#199#255#199#199#199#255#199#199#199#255'111'#255'111'#255#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255'111'#255'111'#255'11'
+'1'#255'111'#255'111'#255'111'#255'111'#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'111'#255'111'#255'111'#255'111'
+#255'111'#255'111'#255'111'#255'111'#255'111'#255'111'#255'111'#255'111'#255
+'111'#255'111'#255#0#0#0#0#0#0#0#0'111'#255#198'Z'#0#255#198'Z'#0#255#198'Z'
+#0#255#198'Z'#0#255#198'Z'#0#255#198'Z'#0#255#198'Z'#0#255#198'Z'#0#255#198
+'Z'#0#255#198'Z'#0#255#198'Z'#0#255#198'Z'#0#255'111'#255#0#0#0#0#0#0#0#0'11'
+'1'#255'111'#255'111'#255'111'#255'111'#255'111'#255'111'#255'111'#255'111'
+#255'111'#255'111'#255'111'#255'111'#255'111'#255#0#0#0#0#0#0#0#0'111'#255
,#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255'111'#255#0#0#0#0#0#0#0#0'111'#255
+#255#255#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255'111'#255#0#0#0#0#0#0#0#0'111'#255#255#255#255
+#255#0#0#255#255#0#0#255#255#255#255#255#255#0#0#255#255#0#0#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255'111'#255#0#0#0#0#0#0#0#0'111'#255#255#255#255#255#255#255#255
+#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+'111'#255#0#0#0#0#0#0#0#0'111'#255#255#255#255#255#255#255#255#255#255#255
+#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255'111'
+#255#0#0#0#0#0#0#0#0'111'#255#255#255#255#255#0#0#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255'111'#255#0#0#0#0#0#0
+#0#0'111'#255#255#255#255#255#0#0#255#255#0#0#255#255#255#255#255#255#0#0#255
+#255#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255'111'#255#0#0#0#0#0#0#0#0'111'#255#255
+#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255'111'#255#0#0#0#0#0#0#0#0'111'#255#255#255#255#255
+#255#255#255#255#255#255#255#255#0#0#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255'111'#255#0#0#0#0#0#0#0#0'111'#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+#255#255#255#255#255'111'#255#0#0#0#0#0#0#0#0'111'#255'111'#255'111'#255'111'
+#255'111'#255'111'#255'111'#255'111'#255'111'#255'111'#255'111'#255'111'#255
+'111'#255'111'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#11'TActionList'#10'ActionList'#6'Images'#7#9'ImageList'#4'left'#3#158
+#1#3'top'#2#11#0#7'TAction'#6'acGoto'#7'Caption'#6#4'Goto'#18'DisableIfNoHan'
+'dler'#9#10'ImageIndex'#2#1#9'OnExecute'#7#13'acGotoExecute'#0#0#7'TAction'#9
+'acRefresh'#7'Caption'#6#7'Refresh'#18'DisableIfNoHandler'#9#10'ImageIndex'#2
+#0#9'OnExecute'#7#16'acRefreshExecute'#0#0#0#0
]);

View File

@ -1,5 +1,4 @@
(*
/***************************************************************************
(***************************************************************************
todolist.pp
--------------------
@ -41,9 +40,18 @@
yyy..yy is the text of todo
you can create an file naming projectname.todo and add list of todo
*)
(*
Modified by Gerard Visent <gerardusmercator@gmail.com> on 5/11/2007
- Extended to recognize Delphi syntax.
- It works now with the folowing tags:
#todo, #done, TODO, DONE
- Owner and Category tags are also processed and displayed
Syntax is -oXXXXX for the owner and -cXXXXX for the category
- Info on the todo items is also stored in a TTodoItem object, for more flexibility
*)
{#todo goto line of selected unit}
{#todo options }
{#todo print an todo report }
@ -57,20 +65,52 @@ uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, LResources,
ExtCtrls, ComCtrls, Menus, Buttons, GraphType,
StdCtrls, mPasLex, LCLIntf, LCLType,
CodeCache, CodeToolManager, LazarusIDEStrConsts;
CodeCache, CodeToolManager, LazarusIDEStrConsts, ActnList;
Const
cTodoFlag = '#todo';
cDoneFlag = '#done';
cAltTodoFLag = 'TODO';
cAltDoneFLag = 'DONE';
type
TOnOpenFile = procedure(Sender: TObject; const Filename: string;
const LineNumber: integer) of object;
{ TTodoItem: Class to hold TODO item information }
TTodoItem = Class(TObject)
private
FAltNotation: boolean;
FCategory: string;
FDone: boolean;
FLineNumber: integer;
FModule: string;
FOwner: string;
FPriority: integer;
FText: string;
function GetAsComment: string;
function GetAsString: string;
published
property AltNotation: boolean read FAltNotation write FAltNotation;
property Category: string read FCategory write FCategory;
property Done: boolean read FDone write FDone;
property LineNumber: integer read FLineNumber write FLineNumber;
property Module: string read FModule write FModule;
property Owner: string read FOwner write FOwner;
property Priority: integer read FPriority write FPriority;
property Text: string read FText write FText;
property AsString: string read GetAsString;
property AsComment: string read GetAsComment;
end;
{ TfrmTodo }
TfrmTodo = class(TForm)
ImageList1: TImageList;
acGoto: TAction;
acRefresh: TAction;
ActionList: TActionList;
ImageList: TImageList;
lvTodo: TListView;
StatusBar: TStatusBar;
ToolBar: TToolBar;
@ -78,10 +118,11 @@ type
tbOptions: TToolButton;
tbPrint: TToolButton;
tbRefresh: TToolButton;
procedure acGotoExecute(Sender: TObject);
procedure acRefreshExecute(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure tbGotoClick(Sender: TObject);
procedure tbRefreshClick(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift:TShiftState);
procedure lvTodoClick(Sender: TObject);
private
{ private declarations }
fBuild : Boolean;
@ -92,11 +133,12 @@ type
procedure SetFileName(const AValue: String);
procedure ParseComment(const aFileName: string; const SComment, EComment: string;
const TokenString: string; LineNumber: Integer);
Function GetToDoItem(const aFileName: string; const SComment, EComment: string;
const TokenString: string; LineNumber: Integer): TTodoItem ;
procedure ParseDirective(aDirective : String);
procedure AddListItem(aTodoItem: TTodoItem);
procedure LoadFile(const aFileName : string);
procedure LoadFile(aFileName : string);
public
{ public declarations }
constructor Create(AOwner: TComponent); override;
@ -112,6 +154,7 @@ var
implementation
uses
Project,
StrUtils,
FileUtil;
@ -123,14 +166,269 @@ begin
end;
destructor TfrmTodo.Destroy;
var
i: integer;
begin
fScannedFile.Free;
for i := 0 to lvTodo.Items.Count-1 do
if Assigned(lvTodo.Items[i].Data) then
TTodoItem(lvTodo.Items[i].Data).Free;
inherited Destroy;
end;
//Load project main file and scan all files for find the syntax todo
procedure TfrmTodo.tbRefreshClick(Sender: TObject);
procedure TfrmTodo.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key=VK_ESCAPE then
Close;
end;
procedure TfrmTodo.lvTodoClick(Sender: TObject);
begin
acGoto.Execute;
end;
//Initialise the todo project and find them
procedure TfrmTodo.SetFileName(const AValue: String);
begin
if fFileName=AValue then exit;
fFileName:=AValue;
acRefresh.Execute;
end;
function TfrmTodo.GetToDoItem(const aFileName: string; const SComment,
EComment: string; const TokenString: string; LineNumber: Integer): TTodoItem;
var
N,Strlen : Integer;
TempStr : string;
ParsingString : string;
IsAltNotation,
IsDone : boolean;
aChar : char;
const
cSemiColon = ':';
cWhiteSpace = ' ';
Procedure SetItemFields(aItem: TTodoItem; aStr: String);
var
aPriority: integer;
begin
if aStr <> '' then
begin
// Category
if pos('-c', aStr) = 1 then
aItem.Category := Copy(aStr, 3, Length(aStr)-2)
else
begin
// Owner
if pos('-o', aStr) = 1 then
aItem.Owner := Copy(aStr, 3, Length(aStr)-2)
else
begin
// Priority
if TryStrToInt(aStr, aPriority) then
aItem.Priority := aPriority;
end;
end;
end;
end;
begin
Result := nil;
ParsingString:= Trim(TokenString);
// Remove the beginning comment chars from input string
Delete(ParsingString, 1, Length(SComment));
// Remove leading and trailing blanks from input
ParsingString := Trim(ParsingString);
// See if it's a TODO or DONE item
if (Pos(cTodoFlag, ParsingString) = 1) then
begin
IsDone := False;
IsAltNotation := False;
end
else
begin
if (Pos(cAltTodoFLag, ParsingString) = 1) then
begin
IsDone := False;
IsAltNotation := True;
end
else
begin
if (Pos(cDoneFlag, ParsingString) = 1) then
begin
IsDone := True;
IsAltNotation := False;
end
else
begin
if (Pos(cAltDoneFLag, ParsingString) = 1) then
begin
IsDone := True;
IsAltNotation := True;
end
else
// Not a Todo/Done item, leave
Exit;
end;
end;
end;
// Remove the ending comment chars from input string
if (eComment<>'') and (Pos(EComment, ParsingString)=Length(ParsingString)- Length(EComment)+1) then
ParsingString := Copy(ParsingString, 1, Length(ParsingString)-Length(eComment));
// Remove Todo/Done flag from input string
if isAltNotation then
Delete(ParsingString, 1, 4)
else
Delete(ParsingString, 1, 5);
Result := TTodoItem.Create;
Result.Done := IsDone;
Result.AltNotation := IsAltNotation;
Result.LineNumber := LineNumber;
Result.Module := aFileName;
n := 1;
TempStr := '';
Strlen := Length(ParsingString);
// Parse priority, owner and category
while (n <= StrLen) and (ParsingString[n]<>cSemiColon) do
begin
aChar := ParsingString[n];
// Add char to temporary string
if (aChar<>cSemiColon) and (aChar<>cWhiteSpace) then
TempStr := TempStr + aChar
// Process temporary string
else
begin
SetItemFields(Result, TempStr);
TempStr := '';;
end;
inc(N);
end;//while
SetItemFields(Result, TempStr);
Delete(ParsingString, 1, n);
// Set item text
Result.Text := ParsingString;
end;
procedure TfrmTodo.FormCreate(Sender: TObject);
begin
fBuild:=False;
fScannedFile:=TStringList.Create;
Caption := lisTodoListCaption;
acRefresh.Hint := lisTodolistRefresh;
acGoto.Hint := listodoListGotoLine;
tbPrint.Hint :=listodoListPrintList;
tbOptions.Hint := lisToDoListOptions;
tbOptions.Caption:=dlgFROpts;
tbPrint.Caption:=srVK_PRINT;
tbRefresh.Caption:=dlgUnitDepRefresh;
tbGoto.Caption:=lisToDoGoto;
with lvTodo do
begin
Column[0].Caption := 'Done';
Column[0].Width := 45;
Column[1].Caption := lisToDoLDescription;
Column[1].Width := 150;
Column[2].Caption := lisToDoLPriority;
Column[2].Width := 45;
Column[3].Caption := lisToDoLFile;
Column[3].Width := 80;
Column[4].Caption := lisToDoLLine;
Column[4].Width := 40;
Column[5].Caption := lisToDoLOwner;
Column[5].Width := 50;
Column[6].Caption := listToDoLCategory;
Column[6].Width := 80;
end;
end;
procedure TfrmTodo.acGotoExecute(Sender: TObject);
var
CurFilename: String;
aTodoItem: TTodoItem;
aListItem: TListItem;
TheLine: integer;
UsedInterfaceFilenames: TStrings;
UsedImplementationFilenames: TStrings;
i: integer;
Found: boolean;
begin
CurFilename:='';
aListItem:= lvtodo.Selected;
Found:= false;
if Assigned(aListItem) and Assigned(aListItem.Data) then
begin
aTodoItem := TTodoItem(aListItem.Data);
CurFileName := aTodoItem.Module;
TheLine := aTodoItem.LineNumber;
if not FileNameIsAbsolute(CurFileName) then
begin
if Assigned(CodeToolBoss) then
begin
fRootCBuffer:=CodeToolBoss.LoadFile(fFileName,false,false);
if not Assigned(fRootCBuffer) then Exit;
if CodeToolBoss.FindUsedUnitFiles(fRootCBuffer,UsedInterfaceFilenames,
UsedImplementationFilenames) then
begin
try
for i:=0 to UsedInterfaceFilenames.Count-1 do
begin
if AnsiCompareStr(ExtractFileName(UsedInterfaceFileNames[i]),
CurFileName) = 0 then
begin
CurFileName:= UsedInterFaceFileNames[i];
Found:= true;
break;
end;
end;
if not Found then
begin
for i:=0 to UsedImplementationFilenames.Count-1 do
begin
if AnsiCompareStr(ExtractFileName
(UsedImplementationFilenames[i]), CurFileName) = 0 then
begin
CurFileName:= UsedImplementationFilenames[i];
break;
end;
end;
end;
finally
UsedImplementationFilenames.Free;
UsedInterfaceFilenames.Free;
end;
end;
end;
end;
if Assigned(OnOpenFile) then OnOpenFile(Self,CurFilename,TheLine);
end;
end;
procedure TfrmTodo.acRefreshExecute(Sender: TObject);
var
UsedInterfaceFilenames,
UsedImplementationFilenames: TStrings;
@ -177,110 +475,6 @@ begin
end;
end;
procedure TfrmTodo.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key=VK_ESCAPE then
Close;
end;
//Initialise then todo project and find them
procedure TfrmTodo.SetFileName(const AValue: String);
begin
if fFileName=AValue then exit;
fFileName:=AValue;
tbRefreshClick(nil);
end;
procedure TfrmTodo.tbGotoClick(Sender: TObject);
var
CurFilename: String;
TheItem: TListItem;
TheLine: integer;
UsedInterfaceFilenames: TStrings;
UsedImplementationFilenames: TStrings;
i: integer;
Found: boolean;
begin
CurFilename:='';
TheItem:= lvtodo.Selected;
Found:= false;
if Assigned(TheItem) then
begin
CurFileName:= TheItem.SubItems[1];
TheLine:= StrToInt(TheItem.SubItems[2]);
if not FileNameIsAbsolute(CurFileName) then
begin
if Assigned(CodeToolBoss) then
begin
fRootCBuffer:=CodeToolBoss.LoadFile(fFileName,false,false);
if not Assigned(fRootCBuffer) then Exit;
if CodeToolBoss.FindUsedUnitFiles(fRootCBuffer,UsedInterfaceFilenames,
UsedImplementationFilenames) then
begin
try
for i:=0 to UsedInterfaceFilenames.Count-1 do
begin
if AnsiCompareStr(ExtractFileName(UsedInterfaceFileNames[i]),
CurFileName) = 0 then
begin
CurFileName:= UsedInterFaceFileNames[i];
Found:= true;
break;
end;
end;
if not Found then
begin
for i:=0 to UsedImplementationFilenames.Count-1 do
begin
if AnsiCompareStr(ExtractFileName
(UsedImplementationFilenames[i]), CurFileName) = 0 then
begin
CurFileName:= UsedImplementationFilenames[i];
break;
end;
end;
end;
finally
UsedImplementationFilenames.Free;
UsedInterfaceFilenames.Free;
end;
end;
end;
end;
if Assigned(OnOpenFile) then OnOpenFile(Self,CurFilename,TheLine);
end;
end;
procedure TfrmTodo.FormCreate(Sender: TObject);
begin
fBuild:=False;
fScannedFile:=TStringList.Create;
Caption := lisTodoListCaption;
tbRefresh.Hint := lisTodolistRefresh;
tbGoto.Hint := listodoListGotoLine;
tbPrint.Hint :=listodoListPrintList;
tbOptions.Hint := lisToDoListOptions;
tbOptions.Caption:=dlgFROpts;
tbPrint.Caption:=srVK_PRINT;
tbRefresh.Caption:=dlgUnitDepRefresh;
tbGoto.Caption:=lisToDoGoto;
with lvTodo do
begin
Column[0].Caption := ' !';
Column[0].Width := 25;
Column[1].Caption := lisToDoLDescription;
Column[1].Width := 250;
Column[2].Caption := lisToDoLFile;
Column[2].Width := 150;
Column[3].Caption := lisToDoLLine;
Column[3].Width := 50;
end;
end;
//Find the {$I filename} directive. If exists, call LoadFile()
procedure TfrmTodo.ParseDirective(aDirective : String);
Var N : Integer;
@ -298,100 +492,57 @@ begin
end;
end;
//Find in comment the ToDo message
procedure TfrmTodo.ParseComment(const aFileName: string;
const SComment, EComment: string;
const TokenString: string; LineNumber: Integer);
Var
N,J : Integer;
ParsingString : string;
CListItem : TListItem;
TodoFlag : string;
function IsTodoFlag(const Flag: string): boolean;
begin
TodoFLag := Flag;
Result := Pos(UpperCase(Flag),UpperCase(TokenString)) > 1;
end;
procedure TfrmTodo.AddListItem(aTodoItem: TTodoItem);
var
aListItem: TListItem;
begin
if IsTodoFlag(cTodoFlag) or IsTodoFlag(cAltTodoFlag) then
if Assigned(aTodoItem) then
begin
// We found a token that looks like a TODO comment. Now
// verify that it *is* one: either a white-space or the
// comment token need to be in front of the TODO item
// Remove comment characters
ParsingString := TokenString;
Delete(ParsingString, 1, Length(SComment));
// Remove white-space left and right
ParsingString := Trim(ParsingString);
// The TODO token should be at the beginning of the comment
N:=Pos(UpperCase(TodoFlag),UpperCase(ParsingString));
if N=1 then
begin
// Remove token from string
Delete(ParsingString, 1, Length(TodoFlag));
ParsingString := TrimRight(ParsingString);
if EComment<>'' then
begin
N:=Pos(EComment,ParsingString);
// Remove end comment from string
Delete(ParsingString, N, Length(EComment));
ParsingString := TrimRight(ParsingString);
end;
CListItem := lvToDo.Items.Add;
// Identify numeric priority (if there is one)
j := 0;
while j < Length(ParsingString) do
begin
if not (ParsingString[j + 1] in ['0'..'9']) then
Break;
Inc(j);
end;
N:=StrToIntDef(Copy(ParsingString, 1, j), 0);
ClistItem.Caption:=IntToStr(N);
Delete(ParsingString, 1, j);
ParsingString := TrimLeft(ParsingString);
if (j=0) and AnsiStartsText(':', ParsingString) then begin
{ Remove Leading : from comment }
Delete(ParsingString, 1, 1);
ParsingString := TrimLeft(ParsingString);
end;
ClistItem.SubItems.Add(ParsingString);
ClistItem.SubItems.Add(ExtractFileName(aFileName));
ClistItem.SubItems.Add(IntToStr(LineNumber));
// CListItem.ImageIndex := Ord(Info.Priority);
end;
aListitem := lvTodo.Items.Add;
aListitem.Data := aTodoItem;
if aTodoItem.Done then
aListItem.Caption := 'X'
else
aListItem.Caption := ' ';
aListitem.SubItems.Add(aTodoItem.Text);
aListitem.SubItems.Add(IntToStr(aTodoItem.Priority));
aListitem.SubItems.Add(aTodoItem.Module);
aListitem.SubItems.Add(IntToStr(aTodoItem.LineNumber));
aListitem.SubItems.Add(aTodoItem.Owner);
aListitem.SubItems.Add(aTodoItem.Category);
end;
end;
//Load an FileName and find {#todox yyyyyy} where
// x is the priority (0 by default)
// yyyy it's the message one line only
procedure TfrmTodo.LoadFile(const aFileName: string);
procedure TfrmTodo.LoadFile(aFileName: string);
var
Parser : TmwPasLex;
EStream : TMemoryStream;
ST : String;
aTodoItem: TTodoItem;
begin
St:=ExtractFileName(aFileName);
//Quit this method if we have already scan this file
if fScannedFile.IndexOf(St)<>-1 then Exit;
StatusBar.SimpleText :=aFileName;// St;
StatusBar.Repaint;
// Abort if this file has already been scanned
if fScannedFile.IndexOf(St)<>-1 then
Exit;
// Add file name to list of scanned files
fScannedFile.Add(St);
// Display file name being processed
//StatusBar.SimpleText := aFileName;
//StatusBar.Repaint;
EStream := TMemoryStream.Create;
try
//Echange of stream
Try
if not FileExists(aFileName) then
if Assigned(Project1) then
aFileName := AppendPathDelim(Project1.ProjectDirectory)+aFileName;
EStream.LoadFromFile(aFileName);
EStream.Position := EStream.Size;
EStream.WriteByte(0); // Terminate string for TmwPasLex
@ -411,13 +562,15 @@ begin
the strategy ought to be to read the complete comment and only then
start parsing. Also it would be better to move deleting of the comment
tokens out of the parser }
aTodoItem := nil;
case Parser.TokenID of
tkBorComment: ParseComment(aFileName, '{', '}', Parser.Token, Parser.LineNumber + 1);
tkAnsiComment: ParseComment(aFileName, '(*', '*)', Parser.Token, Parser.LineNumber + 1);
tkBorComment: aTodoItem := GetToDoItem(aFileName, '{', '}', Parser.Token, Parser.LineNumber + 1);
tkAnsiComment: aTodoItem := GetToDoItem(aFileName, '(*', '*)', Parser.Token, Parser.LineNumber + 1);
// Slash comments in CPP files should work if they are not in a {}
tkSlashesComment: ParseComment(aFileName, '//', '', Parser.Token, Parser.LineNumber + 1);
tkSlashesComment: aTodoItem := GetToDoItem(aFileName, '//', '', Parser.Token, Parser.LineNumber + 1);
tkCompDirect : ParseDirective(Parser.Token);
end;
AddListItem(aTodoItem);
Parser.Next;
end;
finally
@ -429,6 +582,43 @@ begin
end;
end;
{ TTodoItem }
function TTodoItem.GetAsString: string;
begin
// Todo/Done in two notations
if AltNotation then
begin
if Done then
Result := 'DONE'
else
Result := 'TODO';
end
else
begin
if Done then
Result := '#done'
else
Result := '#todo';
end;
// Priority
if Priority > 0 then
Result := Result + ' '+IntToStr(Priority);
// Owner
if Owner <> '' then
Result := Result + ' -o'+Owner;
// Category
if Category <> '' then
Result := Result + ' -c'+Category;
// Text
Result := Result + ' : ' + Text;
end;
function TTodoItem.GetAsComment: string;
begin
Result := '{ '+AsString+' }';
end;
initialization
{$i todolist.lrs}

View File

@ -57,11 +57,11 @@ uses
WordCompletion, FindReplaceDialog, FindInFilesDlg, IDEProcs, IDEOptionDefs,
MacroPromptDlg, TransferMacros, CodeContextForm, CodeHelpForm,
EnvironmentOpts, MsgView, SearchResultView, InputHistory, CodeMacroPrompt,
CodeTemplatesDlg,
CodeTemplatesDlg, TodoDlg, TodoList,
SortSelectionDlg, EncloseSelectionDlg, DiffDialog, ConDef, InvertAssignTool,
SourceEditProcs, SourceMarks, CharacterMapDlg, frmSearch,
LazDocHints, LazDocFrm,
BaseDebugManager, Debugger, MainIntf, TodoDlg;
BaseDebugManager, Debugger, MainIntf;
type
TSourceNotebook = class;
@ -1918,13 +1918,13 @@ end;
procedure TSourceEditor.InsertTodo;
Var
TodoMsg: TStrings;
aTodoItem: TTodoItem;
begin
if ReadOnly then Exit;
TodoMsg:= TStringList.Create;
if ShowTodoDialog(TodoMsg) then
FEditor.SelText:=CommentText('TODO: '+TodoMsg.Text, comtPascal);
TodoMsg.Free;
aTodoItem := ExecuteTodoDialog;
if Assigned(aTodoItem) then
FEditor.SelText := aTodoItem.AsComment;
aTodoItem.Free;
end;
procedure TSourceEditor.InsertDateTime;