tvplant: More features in demo project.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4805 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2016-06-22 20:19:35 +00:00
parent 705a6878ac
commit 9b5d03f687
6 changed files with 1614 additions and 491 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,25 @@
TMAINFORM.CAPTION=Turbo Power VisualPlanIt Demo
TMAINFORM.BTNNEWRES.CAPTION=New resource
TMAINFORM.BTNEDITRES.CAPTION=Edit resource
TMAINFORM.LABEL1.CAPTION=Language
TMAINFORM.TABEVENTS.CAPTION=Events
TMAINFORM.LABEL2.CAPTION=Tage
TMAINFORM.LBLVISIBLEDAYS.CAPTION=Visible days
TMAINFORM.CBGRANULARITY.TEXT=30 Min
TMAINFORM.LBLGRANULARITY.CAPTION=Granularity
TMAINFORM.TABTASKS.CAPTION=Tasks
TMAINFORM.RBALLTASKS.CAPTION=All tasks
TMAINFORM.RBHIDECOMPLETEDTASKS.CAPTION=Hide completed tasks
TMAINFORM.TABCONTACTS.CAPTION=Contacts
TMAINFORM.TABINFO.CAPTION=Info
TMAINFORM.TABRESOURCES.CAPTION=Maintenance
TMAINFORM.BTNNEWRES.CAPTION=New
TMAINFORM.BTNEDITRES.CAPTION=Edit
TMAINFORM.BTNDELETERES.CAPTION=Delete
TMAINFORM.TABSETTINGS.CAPTION=Settings
TMAINFORM.LBLLANGUAGE.CAPTION=Language
TMAINFORM.LBLTIMEFORMAT.CAPTION=Time format
TMAINFORM.LBLFIRSTDAYOFWEEK.CAPTION=First day of week
TMAINFORM.TITLELBL.CAPTION=TitleLbl
TMAINFORM.MENUITEM1.CAPTION=File
TMAINFORM.MNUQUIT.CAPTION=Quit
TMAINFORM.MNUMAINTENANCE.CAPTION=Maintenance
TMAINFORM.MNURESOURCES.CAPTION=Resources
TMAINFORM.MNUSETTINGS.CAPTION=Settings
TMAINFORM.MENUITEM2.CAPTION=Help
TMAINFORM.MNUABOUT.CAPTION=About Visual PlanIt

View File

@ -6,8 +6,8 @@ interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, ComCtrls, LCLTranslator,
VpBaseDS, VpDayView, VpWeekView, VpTaskList,
StdCtrls, ComCtrls, LCLTranslator, Menus,
VpBaseDS, VpDayView, VpWeekView, VpTaskList, VpAbout,
VpContactGrid, VpMonthView, VpResEditDlg, VpContactButtons, VpBufDS, VpNavBar;
type
@ -17,25 +17,43 @@ type
TMainForm = class(TForm)
BtnNewRes: TButton;
BtnEditRes: TButton;
BtnDeleteRes: TButton;
CbLanguages: TComboBox;
CbGranularity: TComboBox;
CbTimeFormat: TComboBox;
CbFirstDayOfWeek: TComboBox;
Img: TImage;
ImageList1: TImageList;
Label1: TLabel;
Label2: TLabel;
Memo1: TMemo;
LblFirstDayOfWeek: TLabel;
LblTimeFormat: TLabel;
LblGranularity: TLabel;
LblLanguage: TLabel;
LblVisibleDays: TLabel;
TitleLbl: TLabel;
MainMenu1: TMainMenu;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem;
MnuSettings: TMenuItem;
MnuAbout: TMenuItem;
MnuMaintenance: TMenuItem;
MnuQuit: TMenuItem;
MnuResources: TMenuItem;
PageControl1: TPageControl;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
LeftPanel: TPanel;
DaySelectorPanel: TPanel;
HeaderPanel: TPanel;
Panel6: TPanel;
RbAllTasks: TRadioButton;
RbHideCompletedTasks: TRadioButton;
Splitter2: TSplitter;
Splitter3: TSplitter;
TabEvents: TTabSheet;
TabContacts: TTabSheet;
TabInfo: TTabSheet;
TabResources: TTabSheet;
TabSettings: TTabSheet;
TabTasks: TTabSheet;
TrackBar1: TTrackBar;
DaysTrackBar: TTrackBar;
VpBufDSDataStore1: TVpBufDSDataStore;
VpContactButtonBar1: TVpContactButtonBar;
VpContactGrid1: TVpContactGrid;
@ -47,23 +65,42 @@ type
VpResourceEditDialog1: TVpResourceEditDialog;
VpTaskList1: TVpTaskList;
VpWeekView1: TVpWeekView;
procedure BtnDeleteResClick(Sender: TObject);
procedure BtnNewResClick(Sender: TObject);
procedure BtnEditResClick(Sender: TObject);
procedure CbFirstDayOfWeekChange(Sender: TObject);
procedure CbGranularityChange(Sender: TObject);
procedure CbLanguagesChange(Sender: TObject);
procedure CbTimeFormatChange(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
procedure FormCreate(Sender: TObject);
procedure MnuQuitClick(Sender: TObject);
procedure MnuResourcesClick(Sender: TObject);
procedure MnuSettingsClick(Sender: TObject);
procedure MnuAboutClick(Sender: TObject);
procedure RbAllTasksChange(Sender: TObject);
procedure RbHideCompletedTasksChange(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure DaysTrackBarChange(Sender: TObject);
procedure VpNavBar1ItemClick(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; Index: Integer);
private
{ private declarations }
FLang: String;
FActiveView: Integer;
procedure PopulateLanguages;
procedure ReadIni;
procedure SetActiveView(AValue: Integer);
procedure SetLanguage(ALang: String); overload;
procedure SetLanguage(AIndex: Integer); overload;
procedure ShowAllEvents;
procedure ShowContacts;
procedure ShowEventsPerDay;
procedure ShowEventsPerMonth;
procedure ShowEventsPerWeek;
procedure ShowResources;
procedure ShowSettings;
procedure ShowTasks;
procedure WriteIni;
public
{ public declarations }
@ -80,12 +117,42 @@ uses
{$IFDEF WINDOWS}
Windows,
{$ENDIF}
LResources, LazUTF8, LazFileUtils, StrUtils, Translations, IniFiles,
LResources, LazUTF8, LazFileUtils, StrUtils, Translations, IniFiles, Math,
VpMisc, VpBase, VpData;
const
LANGUAGE_DIR = '..\..\languages\';
resourcestring
RSConfirmDeleteRes = 'Do you really want to delete resource %s?';
RSEventsOverview = 'Events overview';
RSEventsPerMonth = 'Events per month';
RSEventsPerWeek = 'Events per week';
RSEventsPerDay = 'Events per day';
RSTasks = 'Tasks';
RSContacts = 'Contacts';
RSResources = 'Resources';
RSSettings = 'Program settings';
RSSettings_short = 'Settings';
RSPlanner = 'Planner';
RSMaintenance = 'Maintenance';
RS24Hours = '24 hours';
RS12Hours = '12 hours AM/PM';
RS5Min = '5 min';
RS6Min = '6 min';
RS10Min = '10 min';
RS15Min = '15 min';
RS20Min = '20 min';
RS30Min = '30 min';
RS60Min = '60 min';
RSSunday = 'Sunday';
RSMonday = 'Monday';
RSTuesday = 'Tuesday';
RSWednesday = 'Wednesday';
RSThursday = 'Thursday';
RSFriday = 'Friday';
RSSaturday = 'Saturday';
{$IFDEF WINDOWS}
{ This function determines the LCID from the language code.
Works only for Windows. }
@ -140,19 +207,57 @@ begin
Result := dtSunday;
end;
{ TMainForm }
procedure TMainForm.BtnDeleteResClick(Sender: TObject);
var
res: TVpResource;
begin
res := VpControlLink1.Datastore.Resource;
if res = nil then
exit;
if MessageDlg(Format(RSConfirmDeleteRes, [res.Description]), mtConfirmation, [mbYes, mbNo], 0) = mrOK then
VpControlLink1.Datastore.Resources.RemoveResource(res);
end;
// Edits the currently selected resource
procedure TMainForm.BtnEditResClick(Sender: TObject);
begin
// Open the resource editor dialog, everything is done here.
VpResourceEditDialog1.Execute;
end;
// Adds a new resource
procedure TMainForm.BtnNewResClick(Sender: TObject);
begin
VpResourceEditDialog1.AddNewResource;
end;
procedure TMainForm.CbFirstDayOfWeekChange(Sender: TObject);
begin
VpWeekView1.WeekStartsOn := TVpDayType(CbFirstDayOfWeek.ItemIndex);
VpMonthView1.WeekStartsOn := TVpDayType(CbFirstDayOfWeek.ItemIndex);
end;
procedure TMainForm.CbGranularityChange(Sender: TObject);
begin
VpDayView1.Granularity := TVpGranularity(CbGranularity.ItemIndex);
end;
procedure TMainForm.CbLanguagesChange(Sender: TObject);
begin
SetLanguage(CbLanguages.ItemIndex);
end;
procedure TMainForm.CbTimeFormatChange(Sender: TObject);
begin
VpDayView1.TimeFormat := TVpTimeFormat(CbTimeFormat.ItemIndex);
VpWeekView1.TimeFormat := TVpTimeFormat(CbTimeFormat.ItemIndex);
VpMonthView1.TimeFormat := TVpTimeFormat(CbTimeFormat.ItemIndex);
end;
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: boolean);
begin
if CanClose then
@ -162,28 +267,50 @@ begin
end;
end;
// Edits the currently selected resource
procedure TMainForm.BtnEditResClick(Sender: TObject);
begin
// Open the resource editor dialog, everything is done here.
VpResourceEditDialog1.Execute;
end;
// Load the last resource.
procedure TMainForm.FormCreate(Sender: TObject);
var
lastRes: TVpResource;
ds: TVpCustomDataStore;
begin
PopulateLanguages;
ReadIni;
if VpBufDSDatastore1.Resources.Count > 0 then
ds := VpControlLink1.Datastore;
if ds.Resources.Count > 0 then
begin
lastRes := VpBufDSDatastore1.Resources.Items[VpBufDSDatastore1.Resources.Count-1];
VpBufDSDatastore1.ResourceID := lastRes.ResourceID;
lastRes := ds.Resources.Items[ds.Resources.Count-1];
ds.ResourceID := lastRes.ResourceID;
end;
end;
procedure TMainForm.MnuAboutClick(Sender: TObject);
var
F: TfrmAbout;
begin
F := TfrmAbout.Create(nil);
try
F.ShowModal;
finally
F.Free;
end;
end;
procedure TMainForm.MnuSettingsClick(Sender: TObject);
begin
ShowSettings;
end;
procedure TMainForm.MnuQuitClick(Sender: TObject);
begin
Close;
end;
procedure TMainForm.MnuResourcesClick(Sender: TObject);
begin
ShowResources;
end;
procedure TMainForm.PopulateLanguages;
function ExtractLanguage(s: String): String;
@ -250,11 +377,47 @@ procedure TMainForm.ReadIni;
var
ini: TCustomIniFile;
lang: String;
idx: Integer;
L,T, W,H: Integer;
R: TRect;
begin
ini := TMemIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
try
WindowState := wsNormal;
R := Screen.WorkAreaRect;
L := ini.ReadInteger('Form', 'Left', Left);
T := ini.ReadInteger('Form', 'Top', Top);
W := ini.ReadInteger('Form', 'Width', Width);
H := ini.ReadInteger('Form', 'Height', Height);
if L < R.Left then L := R.Left;
if L + W > R.Right then L := R.Right - W;
if L < R.Left then W := R.Right - R.Left;
if T < R.Top then T := R.Top;
if T + H > R.Bottom then T := R.Bottom - H;
if T < R.Top then H := R.Bottom - R.Top;
SetBounds(L, T, W, H);
w := ini.ReadInteger('Form', 'LeftPanel_Width', LeftPanel.Width);
if w < 200 then w := 200;
LeftPanel.Width := w;
h := ini.ReadInteger('Form', 'BottomPanel_Height', VpMonthView1.Height);
if h < 160 then h := 160;
VpMonthView1.Height := h;
lang := ini.ReadString('Settings', 'Language', GetDefaultLang);
SetLanguage(lang);
SetActiveView(ini.ReadInteger('Settings', 'ActiveView', 0));
VpNavBar1.ActiveFolder := FActiveView mod 1000;
CbTimeFormat.ItemIndex := ini.ReadInteger('Settings', 'TimeFormat', ord(VpDayView1.TimeFormat));
CbTimeFormatChange(nil);
CbGranularity.ItemIndex := ini.ReadInteger('Settings', 'Granularity', ord(VpDayView1.Granularity));
CbGranularityChange(nil);
CbFirstDayOfWeek.ItemIndex := ini.ReadInteger('Settings', 'FirstDayOfWeek', ord(VpWeekView1.WeekStartsOn));
CbFirstDayOfWeekChange(nil);
finally
ini.Free;
end;
@ -266,7 +429,19 @@ var
begin
ini := TMemIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
try
if WindowState = wsNormal then begin
ini.WriteInteger('Form', 'Width', Width);
ini.WriteInteger('Form', 'Height', Height);
ini.WriteInteger('Left', 'Left', Left);
ini.WriteInteger('Form', 'Top', Top);
ini.WriteInteger('Form', 'LeftPanel_Width', LeftPanel.Width);
ini.WriteInteger('Form', 'BottomPanel_Height', VpMonthView1.Height);
end;
ini.WriteString('Settings', 'Language', FLang);
ini.WriteInteger('Settings', 'ActiveView', FActiveView);
ini.WriteInteger('Settings', 'TimeFormat', ord(VpDayView1.TimeFormat));
ini.WriteInteger('Settings', 'Granularity', ord(VpDayView1.Granularity));
ini.WriteInteger('Settings', 'FirstDayOfWeek', ord(VpWeekView1.WeekStartsOn));
finally
ini.Free;
end;
@ -304,6 +479,8 @@ var
tfmt: TVpTimeFormat;
firstWeekDay: TVpDayType;
translator: TUpdateTranslator;
nf: TVpNavFolder;
w: Integer;
begin
langdir := ExpandFileName(AppendPathDelim(Application.Location) + LANGUAGE_DIR);
@ -347,6 +524,55 @@ begin
if not found then
CbLanguages.ItemIndex := 0;
// Update UI strings
nf := TVpNavFolder(VpNavBar1.FolderCollection.ItemByName('NFPlanner'));
nf.Caption := RSPlanner;
nf.ItemByName('NIEvents').Caption := RSEventsOverview;
nf.ItemByName('NIEventsByMonth').Caption := RSEventsPerMonth;
nf.ItemByName('NIEventsByWeek').Caption := RSEventsPerWeek;
nf.ItemByName('NIEventsByDay').Caption := RSEventsPerDay;
nf.ItemByName('NITasks').Caption := RSTasks;
nf.ItemByName('NIContacts').Caption := RSContacts;
nf := TVpNavFolder(VpNavBar1.FolderCollection.ItemByName('NFMaintenance'));
nf.Caption := RSMaintenance;
nf.ItemByname('NIResources').Caption := RSResources;
nf.ItembyName('NISettings').Caption := RSSettings_short;
CbTimeFormat.Items.Clear;
CbTimeFormat.Items.Add(RS24hours);
CbTimeFormat.Items.Add(RS12hours);
CbGranularity.Items.Clear;
CbGranularity.Items.Add(RS5Min);
CbGranularity.Items.Add(RS6Min);
CbGranularity.Items.Add(RS10Min);
CbGranularity.Items.Add(RS15Min);
CbGranularity.Items.Add(RS20Min);
CbGranularity.Items.Add(RS30Min);
CbGranularity.Items.Add(RS60Min);
CbFirstDayOfWeek.Items.Clear;
CbFirstDayOfWeek.Items.Add(RSSunday);
CbFirstDayOfWeek.Items.Add(RSMonday);
CbFirstDayOfWeek.Items.Add(RSTuesday);
CbFirstDayOfWeek.Items.Add(RSWednesday);
CbFirstDayOfWeek.Items.Add(RSThursday);
CbFirstDayOfWeek.Items.Add(RSFriday);
CbFirstDayOfWeek.Items.Add(RSSaturday);
DaysTrackbar.Left := GetLabelWidth(LblVisibleDays) + LblVisibleDays.Left + 8;
LblGranularity.Left := DaysTrackbar.Left + DaysTrackbar.Width + 32;
CbGranularity.Left := LblGranularity.Left + GetLabelWidth(LblGranularity) + 8;
w := MaxValue([GetLabelWidth(LblLanguage), GetLabelWidth(LblTimeFormat), GetLabelWidth(LblFirstDayOfWeek)]);
CbLanguages.Left := 24 + w + 8;
LblLanguage.Left := CbLanguages.Left - 8 - GetLabelWidth(LblLanguage);
CbTimeFormat.Left := CbLanguages.Left;
LblTimeFormat.Left := CbTimeFormat.Left - 8 - GetLabelWidth(LblTimeFormat);
CbFirstDayOfWeek.Left := CbLanguages.Left;
LblFirstDayOfWeek.Left := CbFirstDayOfWeek.Left - 8 - GetLabelWidth(LblFirstDayOfWeek);
RbHideCompletedTasks.Left := RbAllTasks.Left + RbAllTasks.Width + 48;
// Next settings work correctly only for Windows.
{$IFDEF WINDOWS}
UpdateFormatSettings(ALang);
@ -364,84 +590,123 @@ begin
VpWeekView1.WeekStartsOn := firstWeekDay;
{$ENDIF}
SetActiveView(FActiveView);
Invalidate;
end;
procedure TMainForm.TrackBar1Change(Sender: TObject);
procedure TMainForm.ShowAllEvents;
begin
VpDayView1.NumDays := Trackbar1.Position;
PageControl1.ActivePage := TabEvents;
VpDayView1.Parent := LeftPanel;
VpMonthView1.Parent := LeftPanel;
VpMonthView1.Align := alBottom;
VpDayview1.Show;
VpMonthView1.Show;
Splitter2.Top := 0;
LeftPanel.Show;
Splitter3.Show;
Splitter3.Left := Width;
VpWeekView1.Show;
DaySelectorPanel.Hide;
VpDayView1.NumDays := 1;
TitleLbl.Caption := RSEventsOverview;
ImageList1.GetBitmap(0, Img.Picture.Bitmap);
end;
procedure TMainform.ShowEventsPerMonth;
begin
PageControl1.ActivePage := TabEvents;
LeftPanel.Hide;
Splitter3.Hide;
VpWeekView1.Hide;
VpMonthView1.Parent := TabEvents;
VpMonthView1.Align := alClient;
VpMonthView1.Show;
DaySelectorPanel.Hide;
TitleLbl.Caption := RSEventsPerMonth;
ImageList1.GetBitmap(5, Img.Picture.Bitmap);
end;
procedure TMainForm.ShowEventsPerWeek;
begin
PageControl1.ActivePage := TabEvents;
LeftPanel.Hide;
Splitter3.Hide;
VpMonthView1.Hide;
VpDayView1.Hide;
VpWeekView1.Show;
DaySelectorPanel.Hide;
TitleLbl.Caption := RSEventsPerWeek;
ImageList1.GetBitmap(4, Img.Picture.Bitmap);
end;
procedure TMainform.ShowEventsPerDay;
begin
PageControl1.ActivePage := TabEvents;
LeftPanel.Hide;
Splitter3.Hide;
VpWeekView1.Hide;
VpDayView1.Parent := TabEvents;
VpDayView1.Align := alClient;
VpDayView1.Show;
DaySelectorPanel.Parent := TabEvents;
DaySelectorPanel.Show;
VpDayView1.NumDays := DaysTrackBar.Position;
TitleLbl.Caption := RSEventsPerDay;
ImageList1.GetBitmap(3, Img.Picture.Bitmap);
end;
procedure TMainForm.ShowTasks;
begin
Pagecontrol1.ActivePage := TabTasks;
titleLbl.Caption := RSTasks;
ImageList1.GetBitmap(1, Img.Picture.Bitmap);
end;
procedure TMainForm.ShowContacts;
begin
PageControl1.ActivePage := TabContacts;
TitleLbl.Caption := RSContacts;
ImageList1.GetBitmap(2, Img.Picture.Bitmap);
end;
procedure TMainForm.ShowResources;
begin
PageControl1.Activepage := TabResources;
TitleLbl.Caption := RSResources;
ImageList1.GetBitmap(7, Img.Picture.Bitmap);
end;
procedure TMainForm.ShowSettings;
begin
PageControl1.ActivePage := TabSettings;
TitleLbl.Caption := RSSettings;
ImageList1.GetBitmap(8, Img.Picture.Bitmap);
end;
procedure TMainForm.DaysTrackBarChange(Sender: TObject);
begin
VpDayView1.NumDays := DaysTrackBar.Position;
end;
procedure TMainForm.VpNavBar1ItemClick(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; Index: Integer);
procedure ShowAllEvents;
begin
PageControl1.ActivePage := TabEvents;
VpDayView1.Parent := Panel2;
VpMonthView1.Parent := Panel2;
VpMonthView1.Align := alBottom;
VpDayview1.Show;
VpMonthView1.Show;
Splitter2.Top := 0;
Panel2.Show;
Splitter3.Show;
Splitter3.Left := Width;
VpWeekView1.Show;
DaySelectorPanel.Hide;
VpDayView1.NumDays := 1;
end;
procedure ShowEventsPerMonth;
begin
PageControl1.ActivePage := TabEvents;
Panel2.Hide;
Splitter3.Hide;
VpWeekView1.Hide;
VpMonthView1.Parent := TabEvents;
VpMonthView1.Align := alClient;
VpMonthView1.Show;
DaySelectorPanel.Hide;
end;
procedure ShowEventsPerWeek;
begin
PageControl1.ActivePage := TabEvents;
Panel2.Hide;
Splitter3.Hide;
VpMonthView1.Hide;
VpDayView1.Hide;
VpWeekView1.Show;
DaySelectorPanel.Hide;
end;
procedure ShowEventsPerDay;
begin
PageControl1.ActivePage := TabEvents;
Panel2.Hide;
Splitter3.Hide;
VpWeekView1.Hide;
VpDayView1.Parent := TabEvents;
VpDayView1.Align := alClient;
VpDayView1.Show;
DaySelectorPanel.Parent := TabEvents;
DaySelectorPanel.Show;
VpDayView1.NumDays := Trackbar1.Position;
end;
procedure ShowTasks;
begin
Pagecontrol1.ActivePage := TabTasks;
end;
procedure ShowContacts;
begin
PageControl1.ActivePage := TabContacts;
end;
begin
case VpNavBar1.ActiveFolder of
0: case Index of // All planner items
SetActiveView(VpNavBar1.ActiveFolder * 1000 + Index);
end;
procedure TMainForm.SetActiveView(AValue: Integer);
var
folderIndex, itemIndex: Integer;
begin
FActiveView := AValue;
folderIndex := AValue div 1000;
itemIndex := AValue mod 1000;
case folderIndex of
0: case itemIndex of // All planner items
0: ShowAllEvents; // show all
1: ShowEventsPerMonth; // Month view only
2: ShowEventsPerWeek; // Week view only
@ -449,14 +714,10 @@ begin
4: ShowTasks; // Tasks
5: ShowContacts; // Contacts
end;
1: case Index of // Events only
0: ShowAllEvents; // show all
1: ShowEventsPerMonth; // Month view only
2: ShowEventsPerWeek; // Week view only
3: ShowEventsPerDay; // Day view only
1: case itemIndex of
0: ShowResources;
1: ShowSettings;
end;
2: ShowTasks;
3: ShowContacts;
end;
end;