tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

Dialog.cpp (6276B)


      1 // Windows/Control/Dialog.cpp
      2 
      3 #include "StdAfx.h"
      4 
      5 #ifndef _UNICODE
      6 #include "../../Common/StringConvert.h"
      7 #endif
      8 
      9 #include "Dialog.h"
     10 
     11 extern HINSTANCE g_hInstance;
     12 #ifndef _UNICODE
     13 extern bool g_IsNT;
     14 #endif
     15 
     16 namespace NWindows {
     17 namespace NControl {
     18 
     19 static INT_PTR APIENTRY DialogProcedure(HWND dialogHWND, UINT message, WPARAM wParam, LPARAM lParam)
     20 {
     21  CWindow tempDialog(dialogHWND);
     22  if (message == WM_INITDIALOG)
     23    tempDialog.SetUserDataLongPtr(lParam);
     24  CDialog *dialog = (CDialog *)(tempDialog.GetUserDataLongPtr());
     25  if (dialog == NULL)
     26    return FALSE;
     27  if (message == WM_INITDIALOG)
     28    dialog->Attach(dialogHWND);
     29  try { return BoolToBOOL(dialog->OnMessage(message, wParam, lParam)); }
     30  catch(...) { return TRUE; }
     31 }
     32 
     33 bool CDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
     34 {
     35  switch (message)
     36  {
     37    case WM_INITDIALOG: return OnInit();
     38    case WM_COMMAND: return OnCommand(wParam, lParam);
     39    case WM_NOTIFY: return OnNotify((UINT)wParam, (LPNMHDR) lParam);
     40    case WM_TIMER: return OnTimer(wParam, lParam);
     41    case WM_SIZE: return OnSize(wParam, LOWORD(lParam), HIWORD(lParam));
     42    case WM_HELP: OnHelp(); return true;
     43    /*
     44        OnHelp(
     45          #ifdef UNDER_CE
     46          (void *)
     47          #else
     48          (LPHELPINFO)
     49          #endif
     50          lParam);
     51        return true;
     52    */
     53    default: return false;
     54  }
     55 }
     56 
     57 bool CDialog::OnCommand(WPARAM wParam, LPARAM lParam)
     58 {
     59  return OnCommand(HIWORD(wParam), LOWORD(wParam), lParam);
     60 }
     61 
     62 bool CDialog::OnCommand(int code, int itemID, LPARAM lParam)
     63 {
     64  if (code == BN_CLICKED)
     65    return OnButtonClicked(itemID, (HWND)lParam);
     66  return false;
     67 }
     68 
     69 bool CDialog::OnButtonClicked(int buttonID, HWND /* buttonHWND */)
     70 {
     71  switch (buttonID)
     72  {
     73    case IDOK: OnOK(); break;
     74    case IDCANCEL: OnCancel(); break;
     75    case IDCLOSE: OnClose(); break;
     76    case IDHELP: OnHelp(); break;
     77    default: return false;
     78  }
     79  return true;
     80 }
     81 
     82 static bool GetWorkAreaRect(RECT *rect)
     83 {
     84  // use another function for multi-monitor.
     85  return BOOLToBool(::SystemParametersInfo(SPI_GETWORKAREA, 0, rect, 0));
     86 }
     87 
     88 bool IsDialogSizeOK(int xSize, int ySize)
     89 {
     90  // it returns for system font. Real font uses another values
     91  LONG v = GetDialogBaseUnits();
     92  int x = LOWORD(v);
     93  int y = HIWORD(v);
     94 
     95  RECT rect;
     96  GetWorkAreaRect(&rect);
     97  int wx = RECT_SIZE_X(rect);
     98  int wy = RECT_SIZE_Y(rect);
     99  return
    100    xSize / 4 * x <= wx &&
    101    ySize / 8 * y <= wy;
    102 }
    103 
    104 bool CDialog::GetMargins(int margin, int &x, int &y)
    105 {
    106  x = margin;
    107  y = margin;
    108  RECT rect;
    109  rect.left = 0;
    110  rect.top = 0;
    111  rect.right = margin;
    112  rect.bottom = margin;
    113  if (!MapRect(&rect))
    114    return false;
    115  x = rect.right - rect.left;
    116  y = rect.bottom - rect.top;
    117  return true;
    118 }
    119 
    120 int CDialog::Units_To_Pixels_X(int units)
    121 {
    122  RECT rect;
    123  rect.left = 0;
    124  rect.top = 0;
    125  rect.right = units;
    126  rect.bottom = units;
    127  if (!MapRect(&rect))
    128    return units * 3 / 2;
    129  return rect.right - rect.left;
    130 }
    131 
    132 bool CDialog::GetItemSizes(int id, int &x, int &y)
    133 {
    134  RECT rect;
    135  if (!::GetWindowRect(GetItem(id), &rect))
    136    return false;
    137  x = RECT_SIZE_X(rect);
    138  y = RECT_SIZE_Y(rect);
    139  return true;
    140 }
    141 
    142 void CDialog::GetClientRectOfItem(int id, RECT &rect)
    143 {
    144  ::GetWindowRect(GetItem(id), &rect);
    145  ScreenToClient(&rect);
    146 }
    147 
    148 bool CDialog::MoveItem(int id, int x, int y, int width, int height, bool repaint)
    149 {
    150  return BOOLToBool(::MoveWindow(GetItem(id), x, y, width, height, BoolToBOOL(repaint)));
    151 }
    152 
    153 void CDialog::NormalizeSize(bool fullNormalize)
    154 {
    155  RECT workRect;
    156  GetWorkAreaRect(&workRect);
    157  int xSize = RECT_SIZE_X(workRect);
    158  int ySize = RECT_SIZE_Y(workRect);
    159  RECT rect;
    160  GetWindowRect(&rect);
    161  int xSize2 = RECT_SIZE_X(rect);
    162  int ySize2 = RECT_SIZE_Y(rect);
    163  bool needMove = (xSize2 > xSize || ySize2 > ySize);
    164  if (xSize2 > xSize || (needMove && fullNormalize))
    165  {
    166    rect.left = workRect.left;
    167    rect.right = workRect.right;
    168    xSize2 = xSize;
    169  }
    170  if (ySize2 > ySize || (needMove && fullNormalize))
    171  {
    172    rect.top = workRect.top;
    173    rect.bottom = workRect.bottom;
    174    ySize2 = ySize;
    175  }
    176  if (needMove)
    177  {
    178    if (fullNormalize)
    179      Show(SW_SHOWMAXIMIZED);
    180    else
    181      Move(rect.left, rect.top, xSize2, ySize2, true);
    182  }
    183 }
    184 
    185 void CDialog::NormalizePosition()
    186 {
    187  RECT workRect, rect;
    188  GetWorkAreaRect(&workRect);
    189  GetWindowRect(&rect);
    190  if (rect.bottom > workRect.bottom && rect.top > workRect.top)
    191    Move(rect.left, workRect.top, RECT_SIZE_X(rect), RECT_SIZE_Y(rect), true);
    192 }
    193 
    194 bool CModelessDialog::Create(LPCTSTR templateName, HWND parentWindow)
    195 {
    196  HWND aHWND = CreateDialogParam(g_hInstance, templateName, parentWindow, DialogProcedure, (LPARAM)this);
    197  if (aHWND == 0)
    198    return false;
    199  Attach(aHWND);
    200  return true;
    201 }
    202 
    203 INT_PTR CModalDialog::Create(LPCTSTR templateName, HWND parentWindow)
    204 {
    205  return DialogBoxParam(g_hInstance, templateName, parentWindow, DialogProcedure, (LPARAM)this);
    206 }
    207 
    208 #ifndef _UNICODE
    209 
    210 bool CModelessDialog::Create(LPCWSTR templateName, HWND parentWindow)
    211 {
    212  HWND aHWND;
    213  if (g_IsNT)
    214    aHWND = CreateDialogParamW(g_hInstance, templateName, parentWindow, DialogProcedure, (LPARAM)this);
    215  else
    216  {
    217    AString name;
    218    LPCSTR templateNameA;
    219    if (IS_INTRESOURCE(templateName))
    220      templateNameA = (LPCSTR)templateName;
    221    else
    222    {
    223      name = GetSystemString(templateName);
    224      templateNameA = name;
    225    }
    226    aHWND = CreateDialogParamA(g_hInstance, templateNameA, parentWindow, DialogProcedure, (LPARAM)this);
    227  }
    228  if (aHWND == 0)
    229    return false;
    230  Attach(aHWND);
    231  return true;
    232 }
    233 
    234 INT_PTR CModalDialog::Create(LPCWSTR templateName, HWND parentWindow)
    235 {
    236  if (g_IsNT)
    237    return DialogBoxParamW(g_hInstance, templateName, parentWindow, DialogProcedure, (LPARAM)this);
    238  AString name;
    239  LPCSTR templateNameA;
    240  if (IS_INTRESOURCE(templateName))
    241    templateNameA = (LPCSTR)templateName;
    242  else
    243  {
    244    name = GetSystemString(templateName);
    245    templateNameA = name;
    246  }
    247  return DialogBoxParamA(g_hInstance, templateNameA, parentWindow, DialogProcedure, (LPARAM)this);
    248 }
    249 #endif
    250 
    251 }}