Subversion Repositories factorylink.sapi

Rev

Blame | Last modification | View Log | Download

#include <windows.h>
#ifdef WIN32
#include <commctrl.h>
#endif
#include <stdio.h>
#include <stdarg.h>
#include "sw.h"

void SetDlgItemTextF(HWND hDlg, int idc, char *fmt, ...)
{
  char szbuf[128];
  va_list argptr;

  va_start(argptr, fmt);
  vsprintf(szbuf, fmt, argptr);
  va_end(argptr);
  SetDlgItemText(hDlg, idc, szbuf);
}

int GetDlgItemTextF(HWND hDlg, int idc, char *fmt, ...)
{
#ifdef  _MSC_VER
  // Visual C doesn't support vsscanf()
  return 0;
#else
  char szbuf[128];
  va_list argptr;
  int retval;

  GetDlgItemText(hDlg, idc, szbuf, sizeof(szbuf));
  va_start(argptr, fmt);
  retval = vsscanf(szbuf, fmt, argptr);
  va_end(argptr);
  return retval;
#endif
}
int MessageBoxF(HWND hwndparent, char *sztitle, char *fmt, ...)
{
  char szbuf[128];
  va_list argptr;

  va_start(argptr, fmt);
  vsprintf(szbuf, fmt, argptr);
  va_end(argptr);
  return MessageBox(hwndparent, szbuf, sztitle, MB_ICONINFORMATION);
}

#ifdef WIN32
static char *szreg = "Software\\Company\\Application";
#else
static char *szinifile = "WizApp.ini", *szsection = "Options";
#endif

#ifdef WIN32
BOOL SetRegistryRoot(LPSTR lpRegRoot)
{
  szreg = lpRegRoot;
  return TRUE;
}
#else
BOOL SetInifile(char *_szinifile, char *_szsection)
{
  szinifile = _szinifile;
  szsection = _szsection;
  return TRUE;
}
#endif

int GetAppProfileString(LPSTR lpKeyName, LPSTR lpDefault, 
            LPSTR  lpReturnedString, DWORD  nSize)
{
#ifdef WIN32
  HKEY hKey=NULL;
  DWORD dwBytes=nSize;
  
  *lpReturnedString = '\0';
  RegOpenKeyEx(HKEY_CURRENT_USER, szreg,
    NULL, KEY_ALL_ACCESS, &hKey);
  RegQueryValueEx(hKey, lpKeyName, 0, NULL, (LPBYTE)lpReturnedString, &dwBytes);
  RegCloseKey(hKey);
  if(*lpReturnedString == '\0') {
    lstrcpy(lpReturnedString, lpDefault);
    return 0;
  }
  return 1;

#else
  return GetPrivateProfileString(szsection, lpKeyName, lpDefault, 
    lpReturnedString, nSize, szinifile);
#endif
}

int WriteAppProfileString(LPSTR lpKeyName, LPSTR  lpString)
{
#ifdef WIN32
  HKEY hKey;
  DWORD dwDisposition;
  int ret;

  RegCreateKeyEx(HKEY_CURRENT_USER, szreg,
    NULL, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
  ret = RegSetValueEx(hKey, lpKeyName, NULL, REG_SZ, (CONST BYTE *)lpString, lstrlen(lpString)) == ERROR_SUCCESS;
  RegCloseKey(hKey);
  return ret;

#else
  return WritePrivateProfileString(szsection, lpKeyName, lpString, 
    szinifile);
#endif
}


#define limitval(v, min, max) (v) = v < min ? min : (v > max ? max : v)

static char szentry[80];

void ReadProfileWinsize(HWND hwnd, LPSTR szdefault)
{
  int i, val[4], v;
  char *p;

  GetAppProfileString("Window", szdefault, szentry, sizeof(szentry));
  for(p=szentry, i=0; i < 4; i++) {
    while(*p == ' ')
      p++;
    if(*p == '-')
      p++;
    for(v=0; *p >= '0' && *p <= '9'; p++)
      v = 10 * v + *p - '0';
    val[i] = v;
    if(i < 3 && *p)
      p++;
  }
  limitval(val[0], 0, 800);
  limitval(val[1], 0, 600);
  limitval(val[2], 100, 800);
  limitval(val[3], 100, 800);
  MoveWindow(hwnd, val[0], val[1], val[2], val[3], FALSE);
}

void WriteProfileWinsize(HWND hwnd)
{
  if(!IsIconic(hwnd) && !IsZoomed(hwnd)) {
    RECT r;
    GetWindowRect(hwnd, &r);
    wsprintf(szentry,"%d,%d,%d,%d",
      r.left, r.top, r.right  - r.left, r.bottom - r.top);
    WriteAppProfileString("Window", szentry);
  }
}

#ifdef WIN32

////////////////////////
// Tabbed dialog support
////////////////////////
HWND TabPageSet(HWND hwtab)
{
  HWND hwpage;
  RECT rParent, rTab, rPage;
  int iPage;
  int xoff, yoff;
  TABCTLINFO *ptci;

  ptci  = (TABCTLINFO *)GetWindowLong(hwtab, GWL_USERDATA);
  iPage = TabCtrl_GetCurSel(hwtab); 
  // Destroy the current child dialog box, if any. 
  if(ptci->hwndDisplay != NULL) 
    DestroyWindow(ptci->hwndDisplay); 

  // Create the new child dialog box. 
  hwpage = CreateDialogParam(GetWindowInstance(hwtab), 
    MAKEINTRESOURCE(ptci->ptpages[iPage].resid), 
    GetWindowParent(hwtab), 
    ptci->ptpages[iPage].lpDialogFunc, ptci->lParam);
  ptci->hwndDisplay = hwpage;

  GetWindowRect(GetWindowParent(hwtab), &rParent);
  GetWindowRect(hwtab, &rTab);
  GetWindowRect(hwpage, &rPage);
  
  rTab.top += GetSystemMetrics(SM_CYCAPTION);
  xoff = rTab.left - rParent.left;
  yoff = rTab.top  - rParent.top - GetSystemMetrics(SM_CYCAPTION);

  SetWindowPos(hwpage, NULL, 
    ((rTab.right  - rTab.left) - (rPage.right - rPage.left)) / 2 + xoff,
    ((rTab.bottom - rTab.top)  - (rPage.bottom - rPage.top)) / 2 + yoff,
    0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW);
  
  return hwpage;
}

BOOL TabPageClose(HWND hwtab)
{
  TABCTLINFO *ptci;
  BOOL bRet;

  ptci  = (TABCTLINFO *)GetWindowLong(hwtab, GWL_USERDATA);
  if(ptci == NULL)
    return FALSE;
  if(ptci->hwndDisplay)
    bRet = SendMessage(ptci->hwndDisplay, WM_CLOSE, 0, 0);
  else
    bRet = FALSE;
  return bRet;
}

////////////////////////
// List view support
////////////////////////
int LVInsertColumn(HWND hwlist, int icol, int iwidth, char *szText, int fmt)
{
  LV_COLUMN lvC;

  lvC.mask    = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
  lvC.fmt     = fmt;       // left-align the column
  lvC.cx      = iwidth; // width of column, in pixels
  lvC.pszText = szText;

  lvC.iSubItem = icol;
  return ListView_InsertColumn(hwlist, icol, &lvC) != -1;
}

int LVInsertItem(HWND hwlist, int index, LPSTR sztext, int iicon, LPARAM lParam)
{
  LV_ITEM lvi;

  lvi.iItem = index;
  lvi.iSubItem = 0;
  lvi.mask  = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
  lvi.state = 0;
  lvi.stateMask = 0;
  lvi.pszText = sztext;
  lvi.iImage  = iicon;
  lvi.lParam  = lParam;
  if(iicon >= 0) {
    lvi.mask |= LVIF_IMAGE;
    lvi.iImage = iicon;
  }
  return ListView_InsertItem(hwlist, &lvi);
}

void LVSetView(HWND hwndLV, DWORD dwView)
{
  // Get the current window style.
  DWORD dwStyle = GetWindowLong(hwndLV, GWL_STYLE);

  // Only set the window style if the view bits have changed.
  if ((dwStyle & LVS_TYPEMASK) != dwView)
    SetWindowLong(hwndLV, GWL_STYLE,
      (dwStyle & ~LVS_TYPEMASK) | dwView);
}

#endif