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/selectcontactsDlg.pas

206 lines
5.7 KiB
Plaintext

{
This file is part of R&Q.
Under same license
}
{$I RnQConfig.inc}
unit selectcontactsDlg;
interface
uses
Windows, SysUtils, Controls, Variants,
Sciter, SciterApi, SciterLib, RnQDialogs, ICQCommon, ICQContacts;
{$I PubRTTI.inc}
type
TUINListItem = record
kind, groupId: Integer;
key, name, status, UID: String;
expanded: Boolean;
items: TArray;
end;
{$I NoRTTI.inc}
TUINListItems = TArray;
PUINListItems = ^TUINListItems;
procedure GetContacts(tag: Pointer; argc: UINT; argv: PSciterValue; retval: PSciterValue); cdecl;
procedure GetUINLists(tag: Pointer; argc: UINT; argv: PSciterValue; retval: PSciterValue); cdecl;
procedure GetUINList(tag: Pointer; argc: UINT; argv: PSciterValue; retval: PSciterValue); cdecl;
procedure SaveUINList(tag: Pointer; argc: UINT; argv: PSciterValue; retval: PSciterValue); cdecl;
procedure DeleteUINList(tag: Pointer; argc: UINT; argv: PSciterValue; retval: PSciterValue); cdecl;
implementation
uses
RnQLangs, RQUtil, RDGlobal, uinlistLib, globalLib, utilLib, ICQConsts;
procedure GetContacts(tag: Pointer; argc: UINT; argv: PSciterValue; retval: PSciterValue); cdecl;
function FindGroup(var UINList: TUINListItems; Id: Integer): PUINListItems;
var
I, C: Integer;
begin
if Id = 0 then
Exit(@UINList);
for I := 0 to Length(UINList) - 1 do
if (UINList[I].kind = 0) and (UINList[I].groupId = Id) then
Exit(@UINList[I].Items);
SetLength(UINList, Length(UINList) + 1);
C := Length(UINList) - 1;
UINList[C].kind := 0;
UINList[C].key := 'Group:' + IntToStr(Id);
UINList[C].groupId := Id;
UINList[C].name := groups.ID2Name(Id);
UINList[C].UID := '';
UINList[C].expanded := True;
Result := @UINList[C].Items;
end;
var
List: TRnQCList;
ListRecord: TUINListItems;
ListVar: TParams;
ParentListRecord: PUINListItems;
OptionsInt, I, C: Integer;
OptionsVar: Variant;
Options: TSCOptions;
Contact: TICQContact;
begin
OptionsInt := 0;
S2V(argv, OptionsVar);
for I := VarArrayLowBound(OptionsVar, 1) to VarArrayHighBound(OptionsVar, 1) do
if OptionsVar[I] = 'sco_multi' then OptionsInt := OptionsInt + 1
else if OptionsVar[I] = 'sco_groups' then OptionsInt := OptionsInt + 2
else if OptionsVar[I] = 'sco_predefined' then OptionsInt := OptionsInt + 4;
Options := TSCOptions(Byte(OptionsInt));
List := Account.AccProto.ReadList(LT_ROSTER).Clone.Add(NotInList);
if sco_groups in Options then
SortCLbyGroups(List)
else
SortCL(List);
List.ResetEnumeration;
while List.HasMore do
begin
Contact := List.GetNext;
if Contact.UID = '' then
Continue;
if sco_groups in Options then
ParentListRecord := FindGroup(ListRecord, Contact.Group)
else
ParentListRecord := @ListRecord;
SetLength(ParentListRecord^, Length(ParentListRecord^) + 1);
C := Length(ParentListRecord^) - 1;
ParentListRecord^[C].kind := 1;
ParentListRecord^[C].key := 'UIN:' + Contact.UID;
ParentListRecord^[C].groupId := Contact.Group;
ParentListRecord^[C].name := Contact.Displayed;
ParentListRecord^[C].UID := Contact.UID;
ParentListRecord^[C].status := RosterImgNameFor(Contact);
end;
SetLength(ListVar, Length(ListRecord));
for I := 0 to Length(ListRecord) - 1 do
ListVar[I] := UI.RecordToVar(ListRecord[I]);
V2S(ListVar, retval);
List.Free;
end;
procedure GetUINLists(tag: Pointer; argc: UINT; argv: PSciterValue; retval: PSciterValue); cdecl;
var
Names: TParams;
I: Integer;
begin
SetLength(Names, uinlists.Count);
for I := 0 to uinlists.Count - 1 do
Names[I] := uinlists.getAt(i)^.name;
V2S(Names, retval);
end;
procedure GetUINList(tag: Pointer; argc: UINT; argv: PSciterValue; retval: PSciterValue); cdecl;
var
ListName: String;
RnQUINs: TRnQCList;
UINs: TParams;
I: Integer;
begin
ListName := SciterVarToString(argv);
if not uinlists.exists(ListName) then
Exit;
RnQUINs := uinlists.get(ListName).cl;
SetLength(UINs, RnQUINs.Count);
for I := 0 to RnQUINs.Count - 1 do
UINs[I] := RnQUINs.getAt(I).UID;
V2S(UINs, retval);
end;
procedure SaveUINList(tag: Pointer; argc: UINT; argv: PSciterValue; retval: PSciterValue); cdecl;
var
ListName: String;
UINs: Variant;
RnQUINs: TRnQCList;
I: Integer;
begin
ListName := SciterVarToString(argv);
if ListName = '' then
Exit;
if not uinlists.exists(ListName) or
(MessageDlg(getTranslation('This uin-list already exists.\nDo you want to overwrite it?'), mtConfirmation, [mbYes, mbNo]) = mrYes) then
begin
Inc(argv);
S2V(argv, UINs);
RnQUINs := uinlists.put(ListName).cl;
for I := Low(TParams(UINs)) to High(TParams(UINs)) do
RnQUINs.Add(Account.AccProto.GetContact(TUID(TParams(UINs)[I])));
RnQUINs.ResetEnumeration;
MsgDlg('Done', True, mtInformation);
ActionManager.Execute(AK_SAVEUINLISTS, SaveDelay);
V2S(True, retval);
end;
end;
procedure DeleteUINList(tag: Pointer; argc: UINT; argv: PSciterValue; retval: PSciterValue); cdecl;
var
ListName: String;
List: PUINList;
begin
ListName := SciterVarToString(argv);
List := uinlists.get(ListName);
if not Assigned(List) then
Exit;
if MessageDlg(GetTranslation('Are you sure you want to delete?'), mtConfirmation, [mbYes, mbNo]) <> mrYes then
Exit;
if uinlists.remove(List) then
begin
//MsgDlg('Done', True, mtInformation);
V2S(True, retval);
ActionManager.Execute(AK_SAVEUINLISTS, SaveDelay);
end
else
begin
MsgDlg('Failed', True, mtError);
V2S(False, retval);
end;
end;
end.