unit SettingsDlg;

interface

uses
  Windows, Messages, SysUtils, Classes, CommCtrl, ComObj, ActiveX, Widgets,
  GdipApi, WinInet, InetThrd, GdipObj, Contnrs, WIniFiles, MMSystem, InetUtil,
  WStrings, ShellApi, ShlObj;

{ SettingsDlgProc }
function SettingsDlgProc(hDlg: HWND; uMsg: UINT; wParam: LongInt; lParam: LongInt): LRESULT; stdcall;

implementation

uses
  WidgetMain, Variants, DialogRes;

const
  IDS_CAPTION = 3000;
  IDS_GROUPBOX = 3001;
  IDS_LANGUAGE = 3002;
  IDS_ENABLE_TRACKER = 3003;
  IDS_TRACKER_ID = 3004;
  IDS_TRACKER_TITLE = 3005;
  IDS_REFRESH = 3006;
  IDS_ALWAYS_TOP = 3007;
  IDS_IGNORE_MOUSE = 3008;
  IDS_PREVENT_DRAGGING = 3009;
  IDS_TRANSPARENCY = 3010;
  IDS_COLOR = 3011;

  IDC_LANGUAGE = 1000;
  IDC_ENABLE_TRACKER = 1001;
  IDE_TRACKER_ID = 1002;
  IDE_TRACKER_TITLE = 1003;
  IDE_REFRESH = 1004;
  IDC_ALWAYSTOP = 1005;
  IDC_IGNORE_MOUSE = 1006;
  IDC_PREVENT_DRAGGING = 1007;
  IDC_TRANSPARENCY = 1008;
  IDC_COLOR = 1009;
  
{ OnChangeLang }
function OnChangeLang(hDlg: HWND; uMsg: UINT; wParam: LongInt; lParam: LongInt): LRESULT;
begin
  Result := LRESULT(True);
  SetWindowTextW(hDlg, PWideChar(WLang[IDS_CAPTION]));
  SetWindowTextW(GetDlgItem(hDlg, IDS_GROUPBOX), PWideChar(WLang[IDS_GROUPBOX]));
  SetWindowTextW(GetDlgItem(hDlg, IDS_LANGUAGE), PWideChar(WLang[IDS_LANGUAGE]));
  SetWindowTextW(GetDlgItem(hDlg, IDS_ENABLE_TRACKER), PWideChar(WLang[IDS_ENABLE_TRACKER]));
  SetWindowTextW(GetDlgItem(hDlg, IDS_TRACKER_ID), PWideChar(WLang[IDS_TRACKER_ID]));
  SetWindowTextW(GetDlgItem(hDlg, IDS_TRACKER_TITLE), PWideChar(WLang[IDS_TRACKER_TITLE]));
  SetWindowTextW(GetDlgItem(hDlg, IDS_REFRESH), PWideChar(WLang[IDS_REFRESH]));
  SetWindowTextW(GetDlgItem(hDlg, IDS_ALWAYS_TOP), PWideChar(WLang[IDS_ALWAYS_TOP]));
  SetWindowTextW(GetDlgItem(hDlg, IDS_IGNORE_MOUSE), PWideChar(WLang[IDS_IGNORE_MOUSE]));
  SetWindowTextW(GetDlgItem(hDlg, IDS_PREVENT_DRAGGING), PWideChar(WLang[IDS_PREVENT_DRAGGING]));
  SetWindowTextW(GetDlgItem(hDlg, IDS_TRANSPARENCY), PWideChar(WLang[IDS_TRANSPARENCY]));
  SetWindowTextW(GetDlgItem(hDlg, IDOK), PWideChar(WLang[ID_OK]));
  SetWindowTextW(GetDlgItem(hDlg, IDCANCEL), PWideChar(WLang[IDCANCEL]));
end;

{ OnInit }
function OnInit(hDlg: HWND; uMsg: UINT; wParam: LongInt; lParam: LongInt): LRESULT;
var
  WidgetForm: TWidgetMainForm;
  {
  HexColor: WideString;
  TextColor: Cardinal;
  }
begin
  Result := LRESULT(True);
  CenterDesktop(hDlg);

  SetPropW(hDlg, MakeIntAtomW(DialogAtom), lParam);
  WidgetForm := TWidgetMainForm(GetPropW(hDlg, MakeIntAtomW(DialogAtom)));
  WidgetForm.DialogHandle := hDlg;

  OnChangeLang(hDlg, uMsg, wParam, lParam);

  SetWindowTextW(GetDlgItem(hDlg, IDE_TRACKER_ID), PWideChar(WidgetForm.AmungusID));
  SetWindowTextW(GetDlgItem(hDlg, IDE_TRACKER_TITLE), PWideChar(WidgetForm.Title));
  SetWindowTextW(GetDlgItem(hDlg, IDE_REFRESH),
    PWideChar(WideFormat('%d', [WidgetForm.Interval div 1000])));

  CheckDlgButton(hDlg, IDC_ENABLE_TRACKER, CBtnChecks[WidgetForm.EnableTracker]);
  CheckDlgButton(hDlg, IDC_ALWAYSTOP, CBtnChecks[WidgetForm.AlwaysTop]);
  CheckDlgButton(hDlg, IDC_IGNORE_MOUSE, CBtnChecks[WidgetForm.IgnoreMouse]);
  CheckDlgButton(hDlg, IDC_PREVENT_DRAGGING, CBtnChecks[WidgetForm.PreventDragging]);

  SendDlgItemMessage(hDlg, IDC_TRANSPARENCY, TBM_SETRANGE, Integer(True), MakeLong(20, $FF));
  SendDlgItemMessage(hDlg, IDC_TRANSPARENCY, TBM_SETPOS, Integer(True),
    $FF - WidgetForm.OpacityMax + 20);
  {
  TextColor := $FFFFFF - WidgetForm.BackColor;
  HexColor := WideFormat('#%6x', [TextColor]);
  SetWindowTextW(GetDlgItem(hDlg, IDC_COLOR), PWideChar(HexColor));
  }
  {
  Index := 0;
  for I := 0 to WLang.FNames.Count - 1 do
  begin
    Language := WLang.FNames.Values[WLang.FNames.Names[I]];
    if WidgetForm.Language = Language then Index := I;
    SendMessageW(GetDlgItem(hDlg, IDC_LANGUAGE), CB_ADDSTRING, 0, Integer(PWideChar(WLang.FNames.Names[I])));
  end;

  SendMessageW(GetDlgItem(hDlg, IDC_LANGUAGE), CB_SETCURSEL, Index, 0);
  }
  SetForegroundWindow(hDlg);
  SetActiveWindow(hDlg);
end;

{ OnDestroy }
function OnDestroy(hDlg: HWND; uMsg: UINT; wParam: LongInt; lParam: LongInt): LRESULT;
var
  WidgetForm: TWidgetMainForm;
begin
  Result := LRESULT(True);
  WidgetForm := TWidgetMainForm(GetPropW(hDlg, MakeIntAtomW(DialogAtom)));
  WidgetForm.DialogHandle := 0;
  RemovePropW(hDlg, MakeIntAtomW(DialogAtom));
end;

{ OnNotify }
function OnNotify(hDlg: HWND; uMsg: UINT; wParam: LongInt; lParam: LongInt): LRESULT;
begin
  Result := LRESULT(True);
end;

{ OnClicked }
function OnClicked(hDlg: HWND; uMsg: UINT; wParam: LongInt; lParam: LongInt): LRESULT;
begin
  Result := LRESULT(True);
end;

{ OnOK }
function OnOK(hDlg: HWND; uMsg: UINT; wParam: LongInt; lParam: LongInt): LRESULT;
var
  AAmungusID: WideString;
  Changed: Boolean;
  WidgetForm: TWidgetMainForm;
begin

  Result := LRESULT(True);
  
  AAmungusID := GetText(GetDlgItem(hDlg, IDE_TRACKER_ID));
  if Length(AAmungusID) = 0 then
  begin
    MessageBoxW(hDlg, PWideChar(WLang[IDS_TEXT_1009]),
      PWideChar(WLang[IDS_TEXT_1004]), MB_ICONHAND);
    SetFocus(GetDlgItem(hDlg, IDE_TRACKER_ID));
    Exit;
  end;

  WidgetForm := TWidgetMainForm(GetPropW(hDlg, MakeIntAtomW(DialogAtom)));

  WidgetForm.OpacityMax := $FF - SendDlgItemMessage(hDlg, IDC_TRANSPARENCY, TBM_GETPOS, 0, 0) + 20;
  WidgetForm.EnableTracker := IsDlgButtonChecked(hDlg, IDC_ENABLE_TRACKER) = BST_CHECKED;
  WidgetForm.AlwaysTop := IsDlgButtonChecked(hDlg, IDC_ALWAYSTOP) = BST_CHECKED;
  WidgetForm.ChangeAlwaysTop(WidgetForm.AlwaysTop);
  WidgetForm.IgnoreMouse := IsDlgButtonChecked(hDlg, IDC_IGNORE_MOUSE) = BST_CHECKED;
  WidgetForm.ChangeIgnoreMouse(WidgetForm.IgnoreMouse);
  WidgetForm.PreventDragging := IsDlgButtonChecked(hDlg, IDC_PREVENT_DRAGGING) = BST_CHECKED;
  WidgetForm.ChangePreventDragging(WidgetForm.PreventDragging);

  Changed := (AAmungusID <> WidgetForm.AmungusID) and WidgetForm.EnableTracker;
  WidgetForm.AmungusID := AAmungusID;
  WidgetForm.Title := GetText(GetDlgItem(hDlg, IDE_TRACKER_TITLE));
  WidgetForm.TitleLabel.Caption := WidgetForm.Title;
  WidgetForm.Interval := StrToIntDef(GetText(GetDlgItem(hDlg, IDE_REFRESH)), 20);
  if WidgetForm.Interval <= 0 then WidgetForm.Interval := 20;
  WidgetForm.Interval := WidgetForm.Interval * 1000;
  WidgetForm.Update;
  if Changed then WidgetForm.RefreshTimerExecute(WidgetForm);
  //WidgetForm.FirstTime := False;
  EndDialog(hDlg, IDOK);
end;

{ OnCancel }
function OnCancel(hDlg: HWND; uMsg: UINT; wParam: LongInt; lParam: LongInt): LRESULT;
var
  WidgetForm: TWidgetMainForm;
begin
  Result := LRESULT(True);
  WidgetForm := TWidgetMainForm(GetPropW(hDlg, MakeIntAtomW(DialogAtom)));
  //WidgetForm.FirstTime := False;
  WidgetForm.Opacity := WidgetForm.OpacityMax;
  WidgetForm.Update;
  EndDialog(hDlg, IDCANCEL);
end;

{ OnSelChange }
function OnSelChange(hDlg: HWND; uMsg: UINT; wParam: LongInt; lParam: LongInt): LRESULT;
begin
  Result := LRESULT(False);
end;

{ OnCommand }
function OnCommand(hDlg: HWND; uMsg: UINT; wParam: LongInt; lParam: LongInt): LRESULT;
begin
  Result := LRESULT(True);
  case HIWORD(wParam) of
    //BN_CLICKED: OnClicked(hDlg, uMsg, wParam, lParam);
    CBN_SELCHANGE: OnSelChange(hDlg, uMsg, wParam, lParam);
  end;
  case LOWORD(wParam) of
    IDOK: Result := OnOK(hDlg, uMsg, wParam, lParam);
    IDCANCEL: Result := OnCancel(hDlg, uMsg, wParam, lParam);
  end;
end;

var
  Brush: HBRUSH= 0;

{ OnCtlColorStatic }
function OnCtlColorStatic(hDlg: HWND; uMsg: UINT; wParam: LongInt; lParam: LongInt): LRESULT;
var
  WidgetForm: TWidgetMainForm;

begin
  Result := LRESULT(False);
  if GetDlgItem(hDlg, IDC_COLOR) = Cardinal(lParam) then
  begin
    WidgetForm := TWidgetMainForm(GetPropW(hDlg, MakeIntAtomW(DialogAtom)));
    if Brush <> 0 then DeleteObject(Brush);
    Brush := CreateSolidBrush(WidgetForm.BackColor);
    Windows.SetBkColor(wParam, WidgetForm.BackColor);
    Windows.SetTextColor(wParam, $FFFFFF - WidgetForm.BackColor);
    Result := Brush;
    SetWindowLong(hDlg, DWL_MSGRESULT, Integer(True));
  end;
end;

{ OnHorzScroll }
function OnHorzScroll(hDlg: HWND; uMsg: UINT; wParam: LongInt; lParam: LongInt): LRESULT;
var
  iPos: Integer;
  WidgetForm: TWidgetMainForm;
begin
  Result := LRESULT(True);
  if GetDlgItem(hDlg, IDC_TRANSPARENCY) = Cardinal(lParam) then
  begin
    iPos := SendDlgItemMessage(hDlg, IDC_TRANSPARENCY, TBM_GETPOS, 0, 0);
    if iPos in [$00..$FF] then
    begin
      WidgetForm := TWidgetMainForm(GetPropW(hDlg, MakeIntAtomW(DialogAtom)));
      WidgetForm.Opacity := $FF - iPos + 20;
      WidgetForm.UpdateForm;
    end;
  end;
end;

{ OnVertScroll }
function OnVertScroll(hDlg: HWND; uMsg: UINT; wParam: LongInt; lParam: LongInt): LRESULT;
var
  iPos: Integer;
  WidgetForm: TWidgetMainForm;
begin
  Result := LRESULT(True);
  if GetDlgItem(hDlg, IDC_TRANSPARENCY) = Cardinal(lParam) then
  begin
    iPos := SendDlgItemMessage(hDlg, IDC_TRANSPARENCY, TBM_GETPOS, 0, 0);
    if iPos in [$00..$FF] then
    begin
      WidgetForm := TWidgetMainForm(GetPropW(hDlg, MakeIntAtomW(DialogAtom)));
      WidgetForm.Opacity := $FF - iPos + 20;
      WidgetForm.UpdateForm;
    end;
  end;
end;

{ OnCancelMode }
function OnCancelMode(hDlg: HWND; uMsg: UINT; wParam: LongInt; lParam: LongInt): LRESULT;
begin
  Result := LRESULT(True);
end;

{ SettingsDlgProc }
function SettingsDlgProc(hDlg: HWND; uMsg: UINT; wParam: LongInt; lParam: LongInt): LRESULT; stdcall;
begin
  Result := LRESULT(False);
  case uMsg of
    WM_INITDIALOG     : Result := OnInit(hDlg, uMsg, wParam, lParam);
    WM_DESTROY        : Result := OnDestroy(hDlg, uMsg, wParam, lParam);
    WM_NOTIFY         : Result := OnNotify(hDlg, uMsg, wParam, lParam);
    WM_COMMAND        : Result := OnCommand(hDlg, uMsg, wParam, lParam);
    WM_CTLCOLORSTATIC : Result := OnCtlColorStatic(hDlg, uMsg, wParam, lParam);
    WM_HSCROLL        : Result := OnHorzScroll(hDlg, uMsg, wParam, lParam);
    WM_VSCROLL        : Result := OnVertScroll(hDlg, uMsg, wParam, lParam);
    WM_CANCELMODE     : Result := OnCancelMode(hDlg, uMsg, wParam, lParam);
    WM_CHANGELANG     : Result := OnChangeLang(hDlg, uMsg, wParam, lParam);
  end;
end;

{ InitDialogAtom }
procedure InitDialogAtom;
begin
  DialogAtom := GlobalAddAtom('Dialog.WindowAtom.3.1');
end;

{ DoneDialogtAtom }
procedure DoneDialogAtom;
begin
  GlobalDeleteAtom(DialogAtom);
end;

initialization
  InitDialogAtom;

finalization
  DoneDialogAtom;

end.
