You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
RnQ/RnQ/prefDlg.pas

635 lines
18 KiB
Plaintext

{
This file is part of R&Q.
Under same license
}
unit prefDlg;
{$I RnQConfig.inc}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Forms,
Controls, ExtCtrls,
RnQPrefsLib, RnQButtons, RnQDialogs, RnQPics, VirtualTrees, StdCtrls;
{$I NoRTTI.inc}
type
TprefFrm = class(TForm)
framePnl: TPanel;
PrefList: TVirtualDrawTree;
resetBtn: TRnQButton;
okBtn: TRnQButton;
closeBtn: TRnQButton;
applyBtn: TRnQButton;
procedure PrefListDrawNode(Sender: TBaseVirtualTree; const PaintInfo: TVTPaintInfo);
procedure PrefListChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
// procedure PrefListGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
// Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure closeBtnClick(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormShow(Sender: TObject);
procedure resetBtnClick(Sender: TObject);
procedure applyBtnClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure okBtnClick(Sender: TObject);
procedure pagesBoxClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure PrefListGetNodeWidth(Sender: TBaseVirtualTree; HintCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
var NodeWidth: Integer);
procedure PrefListFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
procedure HideAllPages(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
public
arrPages: array of TPrefPage;
procedure reset;
procedure apply;
// procedure updateVisible;
// procedure setPics();
// public procedure destroyHandle;
procedure SetViewMode(pages: array of TPrefPage);
procedure SetBtnEnable(Value: Boolean);
procedure SetActivePage(i: Integer); Overload;
procedure SetActivePage(const pn: String); Overload;
procedure onTimer;
// procedure SetViewMode(const Mode: TfrmViewMode);
private
procedure sortPrefPages;
end;
var
prefFrm: TprefFrm = NIL;
blinkExCount: Word;
implementation
{$R *.DFM}
uses
Themes, Dwmapi,
// RnQPrefsLib,
RQUtil, RDGlobal, RQThemes, RnQLangs, LangLib,
RnQSysUtils, RnQGlobal,
iniLib, globalLib, utilLib, mainDlg,
connection_fr,
antispam_fr,
design_fr,
chat_frOld,
tips_fr,
autoaway_fr,
start_fr,
hotkeys_fr,
security_fr,
events_fr,
plugins_fr,
update_fr,
themedit_fr,
other_fr,
Protocols_all;
// ThemesLib, mainDlg;
// procedure warnOnlineOption;
// begin msgDlg(getTranslation('This option will be applied as soon as you go online'),mtWarning) end;
procedure TprefFrm.HideAllPages(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
begin
// node.
// if (sender is PrefList) then
with TPrefPage(PPrefPage(Sender.getnodedata(Node))^).frame do
begin
Visible := False;
// BringToFront;
// Invalidate;
end;
Invalidate;
end;
procedure TprefFrm.onTimer;
var
pp: TPrefPage;
begin
{ for i := Low(prefFrm.arrPages) to High(prefFrm.arrPages) do
if prefFrm.arrPages[i].frameClass = TdesignFr then
if Assigned(prefFrm.arrPages[i].frame) then
begin
blinkExCount:=succ(blinkExCount) mod TdesignFr(prefFrm.arrPages[i].frame).blinkSlider.position;
if blinkExCount = 0 then
TdesignFr(prefFrm.arrPages[i].frame).BlinkPBox.Visible :=
not TdesignFr(prefFrm.arrPages[i].frame).BlinkPBox.Visible;
break;
end; }
for pp in prefFrm.arrPages do
if pp.frameClass = TdesignFr then
if Assigned(pp.frame) then
with TdesignFr(pp.frame) do
begin
blinkExCount := succ(blinkExCount) mod blinkSlider.position;
if blinkExCount = 0 then
BlinkPBox.Visible := not BlinkPBox.Visible;
break;
end;
end;
procedure TprefFrm.reset;
var
pp: TPrefPage;
begin
SetBtnEnable(False);
try
for pp in arrPages do
if Assigned(pp.frame) then
try
pp.frame.resetPage;
pp.frame.updateVisPage;
Application.ProcessMessages;
except
msgDlg(getTranslation('Error on reset page') + ' "' +
getTranslation(pp.Caption) + '"!', False, mtError);
end;
finally
SetBtnEnable(True);
end;
end; // reset
procedure TprefFrm.apply;
var
pp: TPrefPage;
begin
SetBtnEnable(False);
try
for pp in arrPages do
if Assigned(pp) then
if Assigned(pp.frame) then
try
pp.frame.applyPage;
Application.ProcessMessages;
except
msgDlg(getTranslation('Error on apply page') + ' "' +
getTranslation(pp.Caption) + '"!', False, mtError);
end;
// repaintAllWindows;
if Assigned(RnQmain) then
// saveCFG;
saveCfgDelayed := True;
saveCommonCFG;
finally
SetBtnEnable(True);
end;
end; // apply
procedure TprefFrm.FormShow(Sender: TObject);
begin
// prefFrm.height:=prefHeight;
applyTaskButton(self);
Caption := getTranslation('Preferences for %s', [RnQUser]);
{ if (ICQ <> NIL) AND (ICQ.myInfo <> NIL) then
caption:=getTranslation('Preferences for %s',[ICQ.myinfo.displayed])
else
caption:=getTranslation('Preferences for %s', [RnQUser]); }
theme.pic2ico(RQteFormIcon, PIC_RNQ, Icon);
end;
procedure TprefFrm.resetBtnClick(Sender: TObject);
begin
reset
end;
procedure TprefFrm.applyBtnClick(Sender: TObject);
begin
apply;
reset; // to update screen
end;
procedure TprefFrm.FormClose(Sender: TObject; var Action: TCloseAction);
var
i: byte;
// p: TPrefPage;
begin
updateSWhotkeys;
hotkeysEnabled := True;
Action := caFree;
prefFrm := NIL;
for i := Low(arrPages) to High(arrPages) do
if Assigned(arrPages[i]) then
begin
try
if arrPages[i].frame <> NIL then
begin
arrPages[i].frame.unInitPage;
Application.ProcessMessages;
FreeAndNil(arrPages[i].frame);
end;
except
on e: Exception do
begin
// arrPages[i].frame := NIL;
msgDlg(getTranslation('Error on uninit page') + ' "' + getTranslation(arrPages[i].Caption) + '"!' + CRLF + e.Message,
False, mtError);
end;
end;
arrPages[i].frame := NIL;
// SetLength(arrPages[i].Name, 0);
// SetLength(arrPages[i].Caption, 0);
// arrPages[i].frameClass := NIL;
FreeAndNil(arrPages[i]);
end;
SetLength(arrPages, 0);
end;
procedure TprefFrm.FormCreate(Sender: TObject);
begin
PrefList.NodeDataSize := SizeOf(TPrefPage);
end;
procedure TprefFrm.okBtnClick(Sender: TObject);
begin
hide;
apply;
close;
end;
procedure TprefFrm.pagesBoxClick(Sender: TObject);
// var
// i:integer;
begin
if PrefList.FocusedNode = NIL then
exit;
PrefList.IterateSubtree(nil, HideAllPages, NIL);
with TPrefPage(PPrefPage(PrefList.getnodedata(PrefList.FocusedNode))^).frame do
begin
Visible := True;
BringToFront;
Invalidate;
end;
{ i:=pagesBox.itemIndex;
if i<0 then exit;
updateSWhotkeys;
Tframe(pagesBox.items.objects[i]).BringToFront;
Tframe(pagesBox.items.objects[i]).Invalidate; }
end;
procedure TprefFrm.PrefListChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
begin
pagesBoxClick(nil);
end;
procedure TprefFrm.PrefListDrawNode(Sender: TBaseVirtualTree; const PaintInfo: TVTPaintInfo);
var
s: String;
x: Integer;
begin
if not Assigned(TPrefPage(PPrefPage(PrefList.getnodedata(PaintInfo.Node))^)) then
exit;
s := TPrefPage(PPrefPage(PrefList.getnodedata(PaintInfo.Node))^).Caption;
{ if vsSelected in PaintInfo.Node.States then
begin
if Sender.Focused then
PaintInfo.Canvas.Font.Color := clHighlightText
else
PaintInfo.Canvas.Font.Color := clWindowText;
end
else }
PaintInfo.Canvas.Font.Color := clWindowText;
x := PaintInfo.ContentRect.Left;
// inc(x, theme.drawPic(PaintInfo.Canvas, PaintInfo.ContentRect.Left +3, 0,
// TlogItem(PLogItem(LogList.getnodedata(PaintInfo.Node)^)^).Img).cx+6);
SetBkMode(PaintInfo.Canvas.Handle, TRANSPARENT);
PaintInfo.Canvas.textout(x + 2, 2, s);
if (vsSelected in PaintInfo.Node.States) then
begin
PaintInfo.Canvas.Brush.Color := clSilver;
PaintInfo.Canvas.FrameRect(PaintInfo.Canvas.ClipRect);
end;
end;
procedure TprefFrm.PrefListFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
begin
TPrefPage(PPrefPage(PrefList.getnodedata(Node))^).Free;
end;
procedure TprefFrm.PrefListGetNodeWidth(Sender: TBaseVirtualTree; HintCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
var NodeWidth: Integer);
var
k: Integer;
s: string;
r: TRect;
res: Tsize;
begin
k := DT_CALCRECT;
s := TPrefPage(PPrefPage(PrefList.getnodedata(Node))^).Caption;
r := HintCanvas.ClipRect;
drawText(HintCanvas.Handle, PChar(s), -1, r, k or DT_SINGLELINE or DT_VCENTER or DT_CENTER);
GetTextExtentPoint32(HintCanvas.Handle, PChar(s), Length(s), res);
NodeWidth := res.cx + 10;
end;
{ procedure TprefFrm.PrefListGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
begin
CellText := TPrefPage(PPrefPage(PrefList.getnodedata(Node))^).Caption;
end;
}
procedure TprefFrm.FormDestroy(Sender: TObject);
var
i: Integer;
begin
if Length(arrPages) > 0 then
begin
for i := 0 to Length(arrPages) - 1 do
// arrPages[i].free;
FreeAndNil(arrPages[i]);
SetLength(arrPages, 0);
end;
FreeAndNil(prefFrm);
end;
procedure TprefFrm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = VK_ESCAPE then
closeBtn.Click;
// closeBtnClick(nil);
end;
procedure TprefFrm.sortPrefPages;
var
i: Integer;
pp: TPrefPage;
bool: Boolean;
begin
for i := Low(arrPages) to High(arrPages) do
begin
if arrPages[i].idx = 0 then
arrPages[i].idx := 100;
// SetLength(arrPages[i].Caption, 0);
arrPages[i].Caption := getTranslation(arrPages[i].Caption);
end;
repeat
bool := True;
for i := 0 to High(arrPages) - 1 do
if arrPages[i].idx > arrPages[i + 1].idx then
begin
pp := arrPages[i];
arrPages[i] := arrPages[i + 1];
arrPages[i + 1] := pp;
bool := False
end;
until bool;
end;
procedure TprefFrm.closeBtnClick(Sender: TObject);
begin
close;
end;
procedure TprefFrm.FormPaint(Sender: TObject);
begin
// wallpaperize(canvas);
end;
procedure TprefFrm.SetViewMode(pages: array of TPrefPage);
var
i, j, k: Integer;
// var
pg: PPrefPage;
protoPages: TPrefPagesArr;
// FrameClass: TClass;
begin
if Length(pages) = 0 then
begin
{ SetLength(arrPages, Length(prefPages));
j := 0;
for i := 0 to Length(prefPages)-1 do
begin
if PrefIsVisiblePage(prefPages[i].Name) then
begin
arrPages[j] := prefPages[i].Clone;
inc(j);
end;
end; }
j := Length(prefPages);
SetLength(arrPages, j);
for i := 0 to j - 1 do
arrPages[i] := prefPages[i].Clone;
protoPages := getProtosPref;
k := Length(protoPages);
if k > 0 then
begin
SetLength(arrPages, j + k);
for i := 0 to k - 1 do
begin
arrPages[j + i] := protoPages[i];
protoPages[i] := NIL;
end;
SetLength(protoPages, 0);
end;
clientWidth := GAP_SIZE + PrefList.Width + GAP_SIZE + FRM_WIDTH + GAP_SIZE;
clientHeight := GAP_SIZE + FRM_HEIGHT + GAP_SIZE + okBtn.Height + GAP_SIZE ;
PrefList.Visible := True;
resetBtn.Visible := True;
resetBtn.top := clientHeight - resetBtn.Height - GAP_SIZE;
resetBtn.Left := GAP_SIZE - 1;
applyBtn.top := resetBtn.top;
applyBtn.Left := clientWidth - applyBtn.Width - GAP_SIZE;
closeBtn.top := resetBtn.top;
closeBtn.Left := applyBtn.Left - closeBtn.Width - GAP_SIZE;
okBtn.top := resetBtn.top;
okBtn.Left := closeBtn.Left - okBtn.Width - GAP_SIZE;
PrefList.Height := resetBtn.top - GAP_SIZE - GAP_SIZE;
PrefList.top := GAP_SIZE;
PrefList.Left := GAP_SIZE;
framePnl.Height := resetBtn.top;
framePnl.top := 0;
framePnl.Left := PrefList.Left + PrefList.Width + GAP_SIZE;
framePnl.Width := clientWidth - framePnl.Left;
end
else
begin
SetLength(arrPages, Length(pages));
for i := 0 to Length(pages) - 1 do
begin
arrPages[i] := pages[i].Clone;
end;
clientWidth := GAP_SIZE + FRM_WIDTH + GAP_SIZE;
clientHeight := GAP_SIZE + FRM_HEIGHT + GAP_SIZE + okBtn.Height + GAP_SIZE;
PrefList.Visible := False;
resetBtn.Visible := False;
applyBtn.top := clientHeight - resetBtn.Height - GAP_SIZE;
applyBtn.Left := GAP_SIZE;
closeBtn.top := applyBtn.top;
closeBtn.Left := clientWidth - closeBtn.Width - GAP_SIZE;
okBtn.top := applyBtn.top;
okBtn.Left := closeBtn.Left - okBtn.Width - GAP_SIZE;
framePnl.top := GAP_SIZE;
framePnl.Left := GAP_SIZE;
framePnl.Height := FRM_HEIGHT;
framePnl.Width := clientWidth - framePnl.Left - GAP_SIZE;
end;
sortPrefPages;
try
for i := 0 to Length(arrPages) - 1 do
begin
try
// pagesBox.items.Add(arrPages[i].Cptn);
// FrameClass := GetClass(FrameClassName);
// MainFrame := TFrameClass(FrameClass).Create(self);
arrPages[i].frame := arrPages[i].frameClass.Create(self);
// pagesBox.items.objects[i] := arrPages[i].frame;
with arrPages[i].frame do
begin
align := alClient;
Parent := framePnl;
end;
PrefList.BeginUpdate;
pg := PrefList.getnodedata(PrefList.AddChild(nil));
pg^ := TPrefPage.Create;
pg.idx := arrPages[i].idx;
pg.frame := arrPages[i].frame;
pg.frameClass := arrPages[i].frameClass;
pg.Name := arrPages[i].Name;
pg.Caption := arrPages[i].Caption;
PrefList.EndUpdate;
// pg := nil;
Application.ProcessMessages;
arrPages[i].frame.initPage;
Application.ProcessMessages;
applyCommonsettings(arrPages[i].frame);
translateComponent(arrPages[i].frame, self);
except
on e: Exception do
begin
arrPages[i].frame := NIL;
msgDlg(getTranslation('Error on create page') + ' "' + getTranslation(arrPages[i].Caption) + '"!' + CRLF + e.Message,
False, mtError);
end;
end;
end;
SetActivePage(0);
// PrefList.FocusedNode := PrefList.GetFirst;
// PrefList.Selected[PrefList.FocusedNode] := True;
// pagesBoxClick(NIL);
except
prefFrm := nil;
end;
reset;
end;
procedure TprefFrm.SetBtnEnable(Value: Boolean);
begin
if not Assigned(self) then
exit;
resetBtn.Enabled := Value;
okBtn.Enabled := Value;
closeBtn.Enabled := Value;
applyBtn.Enabled := Value;
end;
procedure TprefFrm.SetActivePage(i: Integer);
var
k: Integer;
n: PVirtualNode;
// r : Tresults;
begin
// prefFrm.pagesBox.ItemIndex:=i;
// prefFrm.PrefList.FocusedNode := prefFrm.PrefList.get
n := PrefList.GetFirst;
k := 1;
if n <> nil then
begin
repeat
// if TPrefPage(PPrefPage(PrefList.getnodedata(n))^) [2] = wp.uin then
// exit;
n := PrefList.GetNext(n);
inc(k);
until (n = nil) or (k > i);
end;
if (n = NIL) or (i = 0) then
prefFrm.PrefList.FocusedNode := prefFrm.PrefList.GetFirst
else
prefFrm.PrefList.FocusedNode := n;
// prefFrm.PrefList.SelectedCount := 0;
if prefFrm.PrefList.FocusedNode <> NIL then
prefFrm.PrefList.Selected[prefFrm.PrefList.FocusedNode] := True;
pagesBoxClick(NIL);
end;
procedure TprefFrm.SetActivePage(const pn: String);
var
// k : Integer;
n: PVirtualNode;
// r : Tresults;
begin
// prefFrm.pagesBox.ItemIndex:=i;
// prefFrm.PrefList.FocusedNode := prefFrm.PrefList.get
n := PrefList.GetFirst;
// k := 1;
if (n <> nil) and (pn <> '') then
begin
repeat
// if TPrefPage(PPrefPage(PrefList.getnodedata(n))^) [2] = wp.uin then
// exit;
n := PrefList.GetNext(n);
if n <> NIL then
if pn = TPrefPage(PPrefPage(PrefList.getnodedata(n))^).Name then
break;
// inc(k);
until (n = nil);
end;
if (n = NIL) or (pn = '') then
prefFrm.PrefList.FocusedNode := prefFrm.PrefList.GetFirst
else
prefFrm.PrefList.FocusedNode := n;
// prefFrm.PrefList.SelectedCount := 0;
if prefFrm.PrefList.FocusedNode <> NIL then
prefFrm.PrefList.Selected[prefFrm.PrefList.FocusedNode] := True;
pagesBoxClick(NIL);
end;
INITIALIZATION
AddPrefPage1(1, TconnectionFr, 'Connection');
AddPrefPage1(3, TantispamFr, 'Anti-spam');
AddPrefPage1(4, TautoawayFr, 'Auto-away');
AddPrefPage1(5, TdesignFr, 'Design');
AddPrefPage1(6, TchatFr, 'Chat');
AddPrefPage1(7, TTipsFr, 'Tips');
AddPrefPage1(10, TstartFr, 'Start');
AddPrefPage1(15, TsecurityFr, 'Privacy & Security');
AddPrefPage1(16, ThotkeysFr, 'Hotkeys');
AddPrefPage1(20, TeventsFr, 'Events');
// AddPrefPage1(21, TlogFr, 'Log packets & events');
AddPrefPage1(30, TpluginsFr, 'Plugins');
AddPrefPage1(95, TupdateFr, 'Auto-update');
AddPrefPage1(96, TthemeditFr, 'Theme editor');
AddPrefPage1(99, TotherFr, 'Other');
end.