Ignore:
Timestamp:
Dec 18, 1999, 9:57:01 PM (26 years ago)
Author:
achimha
Message:

WINE 991212 updates - treeview missing

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/comctl32/propsheet.c

    r1861 r2126  
    1 /* $Id: propsheet.c,v 1.16 1999-11-27 18:14:37 achimha Exp $ */
     1/* $Id: propsheet.c,v 1.17 1999-12-18 20:56:59 achimha Exp $ */
    22/*
    33 * Property Sheets
     
    1313 */
    1414
    15 /* WINE 991114 level */
     15/* WINE 991212 level */
    1616
    1717/* CB: Odin problems:
     
    2323#include "commctrl.h"
    2424#include "prsht.h"
     25#include "dialog.h"
     26#include "win.h"
    2527#include "winnls.h"
    2628#include "comctl32.h"
    27 
     29#include "heap.h"
    2830
    2931/******************************************************************************
     
    4143typedef struct tagPropPageInfo
    4244{
    43   int index; /* corresponds to the index in ppshheader->ppsp */
    4445  HPROPSHEETPAGE hpage; /* to keep track of pages not passed to PropertySheet */
    4546  HWND hwndPage;
     
    4849  BOOL hasHelp;
    4950  BOOL useCallback;
     51  BOOL hasIcon;
    5052} PropPageInfo;
    5153
     
    5557  int nPages;
    5658  int active_page;
    57   LPCPROPSHEETHEADERA ppshheader;
     59  LPPROPSHEETHEADERA ppshheader;
    5860  BOOL isModeless;
    5961  BOOL hasHelp;
     
    6264  BOOL restartWindows;
    6365  BOOL rebootSystem;
     66  BOOL activeValid;
    6467  PropPageInfo* proppage;
    6568  int x;
     
    8487#define MAX_CAPTION_LENGTH 255
    8588#define MAX_TABTEXT_LENGTH 255
    86 
     89#define MAX_BUTTONTEXT_LENGTH 64
    8790
    8891/******************************************************************************
     
    102105static int PROPSHEET_CreatePage(HWND hwndParent, int index,
    103106                                const PropSheetInfo * psInfo,
    104                                 LPCPROPSHEETPAGEA ppshpage,
    105                                 BOOL showPage);
     107                                LPPROPSHEETPAGEA ppshpage);
    106108static BOOL PROPSHEET_ShowPage(HWND hwndDlg, int index, PropSheetInfo * psInfo);
    107109static PADDING_INFO PROPSHEET_GetPaddingInfo(HWND hwndDlg);
     
    109111static BOOL PROPSHEET_Next(HWND hwndDlg);
    110112static BOOL PROPSHEET_Finish(HWND hwndDlg);
    111 static BOOL PROPSHEET_Apply(HWND hwndDlg);
    112 static void PROPSHEET_Cancel(HWND hwndDlg);
     113static BOOL PROPSHEET_Apply(HWND hwndDlg, LPARAM lParam);
     114static void PROPSHEET_Cancel(HWND hwndDlg, LPARAM lParam);
    113115static void PROPSHEET_Help(HWND hwndDlg);
    114116static void PROPSHEET_Changed(HWND hwndDlg, HWND hwndDirtyPage);
     
    123125static LRESULT PROPSHEET_QuerySiblings(HWND hwndDlg,
    124126                                       WPARAM wParam, LPARAM lParam);
    125 static LPCPROPSHEETPAGEA PROPSHEET_GetPSPPage(const PropSheetInfo * psInfo,
    126                                               int index);
    127127static BOOL PROPSHEET_AddPage(HWND hwndDlg,
    128128                              HPROPSHEETPAGE hpage);
     
    135135static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags);
    136136static PADDING_INFO PROPSHEET_GetPaddingInfoWizard(HWND hwndDlg);
     137static BOOL PROPSHEET_IsDialogMessage(HWND hwnd, LPMSG lpMsg);
     138static INT PROPSHEET_DoDialogBox( HWND hwnd, HWND owner);
    137139
    138140BOOL WINAPI
     
    155157  psInfo->isModeless = dwFlags & PSH_MODELESS;
    156158  psInfo->ppshheader = lppsh;
     159  psInfo->ppshheader = COMCTL32_Alloc(sizeof(PROPSHEETHEADERA));
     160  *psInfo->ppshheader = *lppsh;
     161
     162  if (HIWORD(lppsh->pszCaption))
     163     psInfo->ppshheader->pszCaption = HEAP_strdupA( GetProcessHeap(),
     164                                               0, lppsh->pszCaption );
     165
    157166  psInfo->nPages = lppsh->nPages;
    158167
     
    164173  else
    165174    psInfo->active_page = lppsh->u2.nStartPage;
     175
     176  if (psInfo->active_page < 0 || psInfo->active_page >= psInfo->nPages)
     177     psInfo->active_page = 0;
    166178
    167179  psInfo->restartWindows = FALSE;
    168180  psInfo->rebootSystem = FALSE;
    169181  psInfo->hImageList = 0;
     182  psInfo->activeValid = FALSE;
    170183
    171184  return TRUE;
     
    187200  int width, height;
    188201
    189   if (psInfo->ppshheader->dwFlags & PSH_PROPSHEETPAGE)
    190     psInfo->proppage[index].hpage = 0;
     202  psInfo->proppage[index].hpage = (HPROPSHEETPAGE)lppsp;
    191203  psInfo->proppage[index].hwndPage = 0;
    192204  psInfo->proppage[index].isDirty = FALSE;
     
    198210  psInfo->proppage[index].useCallback = dwFlags & PSP_USECALLBACK;
    199211  psInfo->proppage[index].hasHelp = dwFlags & PSP_HASHELP;
     212  psInfo->proppage[index].hasIcon = dwFlags & (PSP_USEHICON | PSP_USEICONID);
    200213
    201214  /* as soon as we have a page with the help flag, set the sheet flag on */
     
    320333      hIcon = lppsp->u2.hIcon;
    321334
    322     if (psInfo->hImageList == 0)
    323       psInfo->hImageList = ImageList_Create(icon_cx, icon_cy, ILC_COLOR, 1, 1);
    324 
    325     ImageList_AddIcon(psInfo->hImageList, hIcon);
     335  if ( hIcon )
     336    {
     337      if (psInfo->hImageList == 0 )
     338        psInfo->hImageList = ImageList_Create(icon_cx, icon_cy, ILC_COLOR, 1, 1);
     339
     340      ImageList_AddIcon(psInfo->hImageList, hIcon);
     341    }
     342
    326343  }
    327344
    328345  return TRUE;
     346}
     347
     348/******************************************************************************
     349 *            PROPSHEET_DoDialogBox
     350 *
     351 * Copied from windows/dialog.c:DIALOG_DoDialogBox
     352 */
     353static INT PROPSHEET_DoDialogBox( HWND hwnd, HWND owner)
     354{
     355   WND * wndPtr;
     356   DIALOGINFO * dlgInfo;
     357   MSG msg;
     358   INT retval;
     359
     360//AH: that WINE internal - design violation!!1
     361#if 0
     362     /* Owner must be a top-level window */
     363   owner = WIN_GetTopParent( owner );
     364   if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return -1;
     365   dlgInfo = (DIALOGINFO *)wndPtr->wExtra;
     366
     367   if (!dlgInfo->flags & DF_END) /* was EndDialog called in WM_INITDIALOG ? */
     368   {
     369       EnableWindow( owner, FALSE );
     370       ShowWindow( hwnd, SW_SHOW );
     371       while (GetMessageA(&msg, 0, 0, 0))
     372       {
     373           if (!PROPSHEET_IsDialogMessage( hwnd, &msg))
     374           {
     375               TranslateMessage( &msg );
     376               DispatchMessageA( &msg );
     377           }
     378           if (dlgInfo->flags & DF_END) break;
     379       }
     380       EnableWindow( owner, TRUE );
     381   }
     382   retval = dlgInfo->idResult;
     383
     384   WIN_ReleaseWndPtr(wndPtr);
     385#endif
     386   DestroyWindow( hwnd );
     387   return retval;
    329388}
    330389
     
    335394 */
    336395
    337 //AH: WINE 990923 not merged due to changes from CB
     396//AH: WINE 9912123 not merged due to design violation (internal WINE structures used)
    338397
    339398BOOL PROPSHEET_CreateDialog(PropSheetInfo* psInfo)
    340399{
     400#if 0
    341401  LRESULT ret;
    342402  LPCVOID template;
     403  LPVOID temp = 0;
    343404  HRSRC hRes;
    344 
    345   if (psInfo->useCallback)
    346     (*(psInfo->ppshheader->pfnCallback))(0, PSCB_PRECREATE, (LPARAM)template);
    347 
    348   if (!(hRes = FindResourceA(COMCTL32_hModule,
    349                             MAKEINTRESOURCEA(IDD_PROPSHEET),
     405  DWORD resSize;
     406  WORD resID = IDD_PROPSHEET;
     407
     408  if (psInfo->ppshheader->dwFlags & PSH_WIZARD)
     409    resID = IDD_WIZARD;
     410
     411  if(!(hRes = FindResourceA(COMCTL32_hModule,
     412                            MAKEINTRESOURCEA(resID),
    350413                            RT_DIALOGA)))
    351414    return FALSE;
    352415
    353   if (!(template = (LPVOID)LoadResource(COMCTL32_hModule, hRes)))
     416  if(!(template = (LPVOID)LoadResource(COMCTL32_hModule, hRes)))
    354417    return FALSE;
    355418
     419  /*
     420   * Make a copy of the dialog template.
     421   */
     422  resSize = SizeofResource(COMCTL32_hModule, hRes);
     423
     424  temp = COMCTL32_Alloc(resSize);
     425
     426  if (!temp)
     427    return FALSE;
     428
     429  memcpy(temp, template, resSize);
     430
    356431  if (psInfo->useCallback)
    357     (*(psInfo->ppshheader->pfnCallback))(0, PSCB_PRECREATE, (LPARAM)template);
     432    (*(psInfo->ppshheader->pfnCallback))(0, PSCB_PRECREATE, (LPARAM)temp);
     433
     434  ret = CreateDialogIndirectParamA(psInfo->ppshheader->hInstance,
     435                                     (LPDLGTEMPLATEA) temp,
     436                                     psInfo->ppshheader->hwndParent,
     437                                     (DLGPROC) PROPSHEET_DialogProc,
     438                                     (LPARAM)psInfo);
     439
     440  if (!(psInfo->ppshheader->dwFlags & PSH_MODELESS))
     441     ret = PROPSHEET_DoDialogBox((HWND)ret, psInfo->ppshheader->hwndParent);
     442 
     443  COMCTL32_Free(temp);
     444
     445  return ret;
     446#endif
     447  LRESULT ret;
     448  LPCVOID template;
     449  LPVOID temp = 0;
     450  HRSRC hRes;
     451  DWORD resSize;
     452  WORD resID = IDD_PROPSHEET;
     453
     454  if (psInfo->ppshheader->dwFlags & PSH_WIZARD)
     455    resID = IDD_WIZARD;
     456
     457  if(!(hRes = FindResourceA(COMCTL32_hModule,
     458                            MAKEINTRESOURCEA(resID),
     459                            RT_DIALOGA)))
     460    return FALSE;
     461
     462  if(!(template = (LPVOID)LoadResource(COMCTL32_hModule, hRes)))
     463    return FALSE;
     464
     465  /*
     466   * Make a copy of the dialog template.
     467   */
     468  resSize = SizeofResource(COMCTL32_hModule, hRes);
     469
     470  temp = COMCTL32_Alloc(resSize);
     471
     472  if (!temp)
     473    return FALSE;
     474
     475  memcpy(temp, template, resSize);
     476
     477  if (psInfo->useCallback)
     478    (*(psInfo->ppshheader->pfnCallback))(0, PSCB_PRECREATE, (LPARAM)temp);
    358479
    359480  if (psInfo->ppshheader->dwFlags & PSH_MODELESS)
    360481    ret = CreateDialogIndirectParamA(psInfo->ppshheader->hInstance,
    361                                      (LPDLGTEMPLATEA) template,
     482                                     (LPDLGTEMPLATEA) temp,
    362483                                     psInfo->ppshheader->hwndParent,
    363484                                     (DLGPROC) PROPSHEET_DialogProc,
     
    365486  else
    366487    ret = DialogBoxIndirectParamA(psInfo->ppshheader->hInstance,
    367                                   (LPDLGTEMPLATEA) template,
     488                                  (LPDLGTEMPLATEA) temp,
    368489                                  psInfo->ppshheader->hwndParent,
    369490                                  (DLGPROC) PROPSHEET_DialogProc,
    370491                                  (LPARAM)psInfo);
     492
     493  COMCTL32_Free(temp);
    371494
    372495  return ret;
     
    840963  TCITEMA item;
    841964  int i, nTabs;
     965  int iImage = 0;
    842966  char tabtext[MAX_TABTEXT_LENGTH] = "Tab text";
    843967
     
    853977  if (psInfo->hImageList)
    854978  {
    855     item.mask |= TCIF_IMAGE;
    856979    SendMessageA(hwndTabCtrl, TCM_SETIMAGELIST, 0, (LPARAM)psInfo->hImageList);
    857980  }
     
    859982  for (i = 0; i < nTabs; i++)
    860983  {
    861     item.iImage = i;
     984    if ( psInfo->proppage[i].hasIcon )
     985    {
     986      item.mask |= TCIF_IMAGE;
     987      item.iImage = iImage++;
     988    }
     989    else
     990    {
     991      item.mask &= ~TCIF_IMAGE;
     992    }
    862993
    863994    WideCharToMultiByte(CP_ACP, 0,
     
    8791010                                int index,
    8801011                                const PropSheetInfo * psInfo,
    881                                 LPCPROPSHEETPAGEA ppshpage,
    882                                 BOOL showPage)
     1012                                LPPROPSHEETPAGEA ppshpage)
    8831013{
    8841014  DLGTEMPLATE* pTemplate;
     
    9151045  }
    9161046
    917   if (((MyDLGTEMPLATEEX*)pTemplate)->signature == 0xFFFF)
    918   {
    919     ((MyDLGTEMPLATEEX*)pTemplate)->style |= WS_CHILD;
     1047 if (((MyDLGTEMPLATEEX*)pTemplate)->signature == 0xFFFF)
     1048  {
     1049    ((MyDLGTEMPLATEEX*)pTemplate)->style |= WS_CHILD | DS_CONTROL;
    9201050    ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~DS_MODALFRAME;
    9211051    ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_CAPTION;
     
    9231053    ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_POPUP;
    9241054    ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_DISABLED;
     1055    ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_VISIBLE;
    9251056  }
    9261057  else
    9271058  {
    928     pTemplate->style |= WS_CHILD;
     1059    pTemplate->style |= WS_CHILD | DS_CONTROL;
    9291060    pTemplate->style &= ~DS_MODALFRAME;
    9301061    pTemplate->style &= ~WS_CAPTION;
     
    9321063    pTemplate->style &= ~WS_POPUP;
    9331064    pTemplate->style &= ~WS_DISABLED;
     1065    pTemplate->style &= ~WS_VISIBLE;
    9341066  }
    9351067
     
    9721104               0, 0, SWP_NOSIZE);
    9731105
    974   if (showPage)
    975   {
    976     NMHDR hdr;
    977 
    978     hdr.hwndFrom = hwndParent;
    979     hdr.idFrom = GetWindowLongA(hwndParent,GWL_ID);
    980     hdr.code = PSN_SETACTIVE;
    981 
    982     /*
    983      * Send the notification before showing the page.
    984      */
    985     SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr);
    986 
    987     ShowWindow(hwndPage, SW_SHOW);
    988   }
    989   else
    990     ShowWindow(hwndPage, SW_HIDE);
    991 
    9921106  return TRUE;
    9931107}
     
    10011115{
    10021116  if (index == psInfo->active_page)
     1117    {
     1118      if (GetTopWindow(hwndDlg) != psInfo->proppage[index].hwndPage)
     1119          SetWindowPos(psInfo->proppage[index].hwndPage, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    10031120    return TRUE;
    1004 
    1005   ShowWindow(psInfo->proppage[psInfo->active_page].hwndPage, SW_HIDE);
    1006 
    1007   if (psInfo->proppage[index].hwndPage != 0)
    1008     ShowWindow(psInfo->proppage[index].hwndPage, SW_SHOW);
    1009   else
    1010   {
    1011     LPCPROPSHEETPAGEA ppshpage = PROPSHEET_GetPSPPage(psInfo, index);
    1012     PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage, TRUE);
     1121    }
     1122
     1123  if (psInfo->active_page != -1)
     1124     ShowWindow(psInfo->proppage[psInfo->active_page].hwndPage, SW_HIDE);
     1125
     1126  if (psInfo->proppage[index].hwndPage == 0)
     1127  {
     1128     LPCPROPSHEETPAGEA ppshpage;
     1129     PSHNOTIFY psn;
     1130
     1131     ppshpage = (LPCPROPSHEETPAGEA)psInfo->proppage[index].hpage;
     1132     PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage);
     1133
     1134     psn.hdr.hwndFrom = hwndDlg;
     1135     psn.hdr.code     = PSN_SETACTIVE;
     1136     psn.hdr.idFrom   = 0;
     1137     psn.lParam       = 0;
     1138
     1139     /* Send the notification before showing the page. */
     1140     SendMessageA(psInfo->proppage[index].hwndPage,
     1141                  WM_NOTIFY, 0, (LPARAM) &psn);
     1142
     1143     /*
     1144      * TODO: check return value.
     1145      */
     1146  }
     1147
     1148  ShowWindow(psInfo->proppage[index].hwndPage, SW_SHOW);
     1149
     1150  if (!(psInfo->ppshheader->dwFlags & PSH_WIZARD))
     1151  {
     1152     HWND hwndTabCtrl;
     1153
     1154     /* Synchronize current selection with tab control */
     1155     hwndTabCtrl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
     1156     SendMessageA(hwndTabCtrl, TCM_SETCURSEL, index, 0);
    10131157  }
    10141158
    10151159  psInfo->active_page = index;
     1160  psInfo->activeValid = TRUE;
    10161161
    10171162  return TRUE;
     
    10241169{
    10251170  BOOL res;
    1026   NMHDR hdr;
     1171  PSHNOTIFY psn;
    10271172  HWND hwndPage;
    1028   HWND hwndBack = GetDlgItem(hwndDlg, IDC_BACK_BUTTON);
    10291173  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
    10301174                                                    PropSheetInfoStr);
    10311175
    1032   if (psInfo->active_page <= 0)
     1176  if (psInfo->active_page < 0)
    10331177     return FALSE;
    10341178
    1035   hdr.hwndFrom = hwndDlg;
    1036   hdr.idFrom = GetWindowLongA(hwndDlg,GWL_ID);
    1037   hdr.code = PSN_WIZBACK;
    1038 
     1179  psn.hdr.code     = PSN_WIZBACK;
     1180  psn.hdr.hwndFrom = hwndDlg;
     1181  psn.hdr.idFrom   = 0;
     1182  psn.lParam       = 0;
     1183 
    10391184  hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
    10401185
    1041   if (SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr) == -1)
     1186  if (SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn) == -1)
    10421187    return FALSE;
    10431188
    1044   res = PROPSHEET_CanSetCurSel(hwndDlg);
    1045   if(res != FALSE)
    1046   {
    1047     res = PROPSHEET_SetCurSel(hwndDlg, psInfo->active_page - 1, 0);
    1048   }
    1049 
    1050   /* if we went to page 0, disable Back button */
    1051   if (res && (psInfo->active_page == 0))
    1052     EnableWindow(hwndBack, FALSE);
     1189  if (psInfo->active_page > 0)
     1190  {
     1191     res = PROPSHEET_CanSetCurSel(hwndDlg);
     1192     if(res != FALSE)
     1193     {
     1194       res = PROPSHEET_SetCurSel(hwndDlg, psInfo->active_page - 1, 0);
     1195     }
     1196  }
    10531197
    10541198  return TRUE;
     
    10601204static BOOL PROPSHEET_Next(HWND hwndDlg)
    10611205{
    1062   NMHDR hdr;
     1206  PSHNOTIFY psn;
    10631207  HWND hwndPage;
    10641208  LRESULT msgResult = 0;
     
    10661210                                                    PropSheetInfoStr);
    10671211
    1068   if (psInfo->active_page < 0 || psInfo->active_page == psInfo->nPages - 1)
     1212  if (psInfo->active_page < 0)
    10691213     return FALSE;
    10701214
    1071   hdr.hwndFrom = hwndDlg;
    1072   hdr.idFrom = GetWindowLongA(hwndDlg,GWL_ID);
    1073   hdr.code = PSN_WIZNEXT;
    1074 
     1215  psn.hdr.code     = PSN_WIZNEXT;
     1216  psn.hdr.hwndFrom = hwndDlg;
     1217  psn.hdr.idFrom   = 0;
     1218  psn.lParam       = 0;
     1219 
    10751220  hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
    10761221
    1077   msgResult = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr);
    1078 
    1079 //  TRACE("msg result %ld\n", msgResult);
     1222  msgResult = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
     1223
     1224  TRACE("msg result %ld\n", msgResult);
    10801225
    10811226  if (msgResult == -1)
     
    10951240static BOOL PROPSHEET_Finish(HWND hwndDlg)
    10961241{
    1097   NMHDR hdr;
     1242  PSHNOTIFY psn;
    10981243  HWND hwndPage;
    10991244  LRESULT msgResult = 0;
     
    11041249     return FALSE;
    11051250
    1106   hdr.hwndFrom = hwndDlg;
    1107   hdr.idFrom = GetWindowLongA(hwndDlg,GWL_ID);
    1108   hdr.code = PSN_WIZFINISH;
    1109 
     1251  psn.hdr.code     = PSN_WIZFINISH;
     1252  psn.hdr.hwndFrom = hwndDlg;
     1253  psn.hdr.idFrom   = 0;
     1254  psn.lParam       = 0;
     1255 
    11101256  hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
    11111257
    1112   msgResult = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr);
    1113 
    1114 //  TRACE("msg result %ld\n", msgResult);
     1258  msgResult = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
     1259
     1260  TRACE("msg result %ld\n", msgResult);
    11151261
    11161262  if (msgResult != 0)
     
    11181264
    11191265  if (psInfo->isModeless)
    1120     psInfo->active_page = -1;
     1266    psInfo->activeValid = FALSE;
    11211267  else
    11221268    EndDialog(hwndDlg, TRUE);
     
    11281274 *            PROPSHEET_Apply
    11291275 */
    1130 static BOOL PROPSHEET_Apply(HWND hwndDlg)
     1276static BOOL PROPSHEET_Apply(HWND hwndDlg, LPARAM lParam)
    11311277{
    11321278  int i;
    1133   NMHDR hdr;
    11341279  HWND hwndPage;
     1280  PSHNOTIFY psn;
    11351281  LRESULT msgResult;
    11361282  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
     
    11401286     return FALSE;
    11411287
    1142   hdr.hwndFrom = hwndDlg;
    1143   hdr.idFrom = GetWindowLongA(hwndDlg,GWL_ID);
     1288  psn.hdr.hwndFrom = hwndDlg;
     1289  psn.hdr.idFrom   = 0;
     1290  psn.lParam       = 0;
     1291 
    11441292
    11451293  /*
    11461294   * Send PSN_KILLACTIVE to the current page.
    11471295   */
    1148   hdr.code = PSN_KILLACTIVE;
     1296  psn.hdr.code = PSN_KILLACTIVE;
    11491297
    11501298  hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
    11511299
    1152   if (SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr) != FALSE)
     1300  if (SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn) != FALSE)
    11531301    return FALSE;
    11541302
     
    11561304   * Send PSN_APPLY to all pages.
    11571305   */
    1158   hdr.code = PSN_APPLY;
    1159 
     1306  psn.hdr.code = PSN_APPLY;
     1307  psn.lParam   = lParam;
     1308 
    11601309  for (i = 0; i < psInfo->nPages; i++)
    11611310  {
    11621311    hwndPage = psInfo->proppage[i].hwndPage;
    1163     msgResult = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr);
    1164 
    1165     if (msgResult == PSNRET_INVALID_NOCHANGEPAGE)
    1166       return FALSE;
     1312    if (hwndPage)
     1313    {
     1314       msgResult = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
     1315       if (msgResult == PSNRET_INVALID_NOCHANGEPAGE)
     1316          return FALSE;
     1317    }
     1318  }
     1319
     1320  if(lParam)
     1321  {
     1322     psInfo->activeValid = FALSE;
     1323  }
     1324  else if(psInfo->active_page >= 0)
     1325  {
     1326     psn.hdr.code = PSN_SETACTIVE;
     1327     psn.lParam   = 0;
     1328     hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
     1329     SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
    11671330  }
    11681331
     
    11731336 *            PROPSHEET_Cancel
    11741337 */
    1175 static void PROPSHEET_Cancel(HWND hwndDlg)
     1338static void PROPSHEET_Cancel(HWND hwndDlg, LPARAM lParam)
    11761339{
    11771340  PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwndDlg,
    11781341                                                    PropSheetInfoStr);
    11791342  HWND hwndPage;
    1180   NMHDR hdr;
     1343  PSHNOTIFY psn;
     1344  int i;
    11811345
    11821346  if (psInfo->active_page < 0)
     
    11841348
    11851349  hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
    1186   hdr.hwndFrom = hwndDlg;
    1187   hdr.idFrom = GetWindowLongA(hwndDlg,GWL_ID);
    1188   hdr.code = PSN_QUERYCANCEL;
    1189 
    1190   if (SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr))
     1350  psn.hdr.code     = PSN_QUERYCANCEL;
     1351  psn.hdr.hwndFrom = hwndDlg;
     1352  psn.hdr.idFrom   = 0;
     1353  psn.lParam       = 0;
     1354 
     1355  if (SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn))
    11911356    return;
    11921357
    1193   hdr.code = PSN_RESET;
    1194 
    1195   SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr);
     1358  psn.hdr.code = PSN_RESET;
     1359  psn.lParam   = lParam;
     1360 
     1361  for (i = 0; i < psInfo->nPages; i++)
     1362  {
     1363    hwndPage = psInfo->proppage[i].hwndPage;
     1364
     1365    if (hwndPage)
     1366       SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
     1367  }
    11961368
    11971369  if (psInfo->isModeless)
    1198     psInfo->active_page = -1; /* makes PSM_GETCURRENTPAGEHWND return NULL */
     1370  {
     1371     /* makes PSM_GETCURRENTPAGEHWND return NULL */
     1372     psInfo->activeValid = FALSE;
     1373  }
    11991374  else
    12001375    EndDialog(hwndDlg, FALSE);
     
    12091384                                                    PropSheetInfoStr);
    12101385  HWND hwndPage;
    1211   NMHDR hdr;
     1386  PSHNOTIFY psn;
    12121387
    12131388  if (psInfo->active_page < 0)
     
    12151390
    12161391  hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
    1217   hdr.hwndFrom = hwndDlg;
    1218   hdr.idFrom = GetWindowLongA(hwndDlg,GWL_ID);
    1219   hdr.code = PSN_HELP;
    1220 
    1221   SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr);
     1392  psn.hdr.code     = PSN_HELP;
     1393  psn.hdr.hwndFrom = hwndDlg;
     1394  psn.hdr.idFrom   = 0;
     1395  psn.lParam       = 0;
     1396 
     1397  SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
    12221398}
    12231399
     
    13321508                                                    PropSheetInfoStr);
    13331509  HWND hwndPage;
    1334   NMHDR hdr;
    1335 
    1336   if (!psInfo || psInfo->active_page < 0)
     1510  PSHNOTIFY psn;
     1511
     1512  if (!psInfo)
    13371513     return FALSE;
     1514
     1515  if (psInfo->active_page < 0)
     1516     return TRUE;
     1517
    13381518  /*
    13391519   * Notify the current page.
    13401520   */
    13411521  hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
    1342 
    1343   hdr.hwndFrom = hwndDlg;
    1344   hdr.idFrom = GetWindowLongA(hwndDlg,GWL_ID);
    1345   hdr.code = PSN_KILLACTIVE;
    1346 
    1347   return !SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr);
     1522  psn.hdr.code     = PSN_KILLACTIVE;
     1523  psn.hdr.hwndFrom = hwndDlg;
     1524  psn.hdr.idFrom   = 0;
     1525  psn.lParam       = 0;
     1526
     1527  return !SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
    13481528}
    13491529
     
    13591539  HWND hwndPage;
    13601540  HWND hwndHelp  = GetDlgItem(hwndDlg, IDHELP);
    1361   NMHDR hdr;
    1362 
    1363   if (psInfo->active_page < 0)
    1364      return FALSE;
    1365 
    1366   hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
    1367 
    1368   hdr.hwndFrom = hwndDlg;
    1369   hdr.idFrom = GetWindowLongA(hwndDlg,GWL_ID);
    1370   /*
    1371    * hpage takes precedence over index.
    1372    */
     1541
     1542  /* hpage takes precedence over index */
    13731543  if (hpage != NULL)
    13741544    index = PROPSHEET_GetPageIndex(hpage, psInfo);
     
    13891559  {
    13901560    int result;
    1391     hdr.code = PSN_SETACTIVE;
    1392 
    1393     result = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &hdr);
     1561    PSHNOTIFY psn;
     1562
     1563    psn.hdr.code     = PSN_SETACTIVE;
     1564    psn.hdr.hwndFrom = hwndDlg;
     1565    psn.hdr.idFrom   = 0;
     1566    psn.lParam       = 0;
     1567
     1568    result = SendMessageA(hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
     1569
    13941570    /*
    1395      * TODO: check return value.
     1571     * TODO: check return value. 
    13961572     */
    13971573  }
     
    14871663}
    14881664
    1489 /******************************************************************************
    1490  *            PROPSHEET_GetPSPPage
    1491  */
    1492 static LPCPROPSHEETPAGEA PROPSHEET_GetPSPPage(const PropSheetInfo * psInfo,
    1493                                               int index)
    1494 {
    1495   BOOL usePSP = psInfo->ppshheader->dwFlags & PSH_PROPSHEETPAGE;
    1496   LPCPROPSHEETPAGEA lppsp;
    1497   int realIndex = psInfo->proppage[index].index;
    1498 
    1499   if (usePSP)
    1500   {
    1501     BYTE* pByte;
    1502 
    1503     lppsp = psInfo->ppshheader->u3.ppsp;
    1504 
    1505     pByte = (BYTE*) lppsp;
    1506 
    1507     pByte += (lppsp->dwSize * realIndex);
    1508     lppsp = (LPCPROPSHEETPAGEA)pByte;
    1509   }
    1510   else
    1511     lppsp = (LPCPROPSHEETPAGEA) psInfo->ppshheader->u3.phpage[realIndex];
    1512 
    1513   return lppsp;
    1514 }
    15151665
    15161666/******************************************************************************
     
    15351685
    15361686  PROPSHEET_CollectPageInfo(ppsp, psInfo, psInfo->nPages);
    1537   psInfo->proppage[psInfo->nPages].index = -1;
    15381687  psInfo->proppage[psInfo->nPages].hpage = hpage;
    15391688
    1540   /*
    1541    * Create the page but don't show it.
    1542    */
    1543   PROPSHEET_CreatePage(hwndDlg, psInfo->nPages, psInfo, ppsp, FALSE);
     1689  if (ppsp->dwFlags & PSP_PREMATURE)
     1690  {
     1691     /* Create the page but don't show it */
     1692     PROPSHEET_CreatePage(hwndDlg, psInfo->nPages, psInfo, ppsp);
     1693  }
    15441694
    15451695  /*
     
    15581708
    15591709  psInfo->nPages++;
     1710
     1711  /* If it is the only page - show it */
     1712  if(psInfo->nPages == 1)
     1713     PROPSHEET_ShowPage(hwndDlg, 0, psInfo);
    15601714
    15611715  return TRUE;
     
    15751729
    15761730  if (!psInfo) {
    1577 //    FIXME("No psInfo for propertysheet at windows 0x%04x, returning FALSE...\n", hwndDlg);
    15781731    return FALSE;
    15791732  }
     
    15891742  /* Make shure that index is within range */
    15901743  if (index < 0 || index >= psInfo->nPages)
    1591     {
    1592 //      TRACE("Could not find page to remove!\n");
     1744  {
     1745      TRACE("Could not find page to remove!\n");
    15931746      return FALSE;
    1594     }
    1595 
    1596 //  TRACE("total pages %d removing page %d active page %d\n",
    1597 //        psInfo->nPages, index, psInfo->active_page);
     1747  }
     1748
     1749  TRACE("total pages %d removing page %d active page %d\n",
     1750        psInfo->nPages, index, psInfo->active_page);
    15981751  /*
    15991752   * Check if we're removing the active page.
     
    16161769    else
    16171770    {
    1618 //      TRACE("Removing the only page, close the dialog!\n");
    1619 
    1620       if (psInfo->isModeless)
    1621         psInfo->active_page = -1;
    1622       else
    1623         EndDialog(hwndDlg, FALSE);
    1624 
    1625       return TRUE;
     1771      psInfo->active_page = -1;
     1772      if (!psInfo->isModeless)
     1773      {
     1774         EndDialog(hwndDlg, FALSE);
     1775         return TRUE;
     1776      }
    16261777    }
    16271778  }
    1628 
    1629   if (index < psInfo->active_page)
     1779  else if (index < psInfo->active_page)
    16301780    psInfo->active_page--;
    16311781
    1632   /* Destroy page dialog window.
    1633    * If it's last page in modal dialog, it has been destroyed by EndDialog
    1634    */
    1635   if (psInfo->isModeless || psInfo->nPages > 1)
    1636      DestroyWindow(psInfo->proppage[index].hwndPage);
    1637 
     1782  /* Destroy page dialog window */
     1783  DestroyWindow(psInfo->proppage[index].hwndPage);
     1784
     1785  /* Free page resources */
     1786  if(psInfo->proppage[index].hpage)
     1787  {
     1788     PROPSHEETPAGEA* psp = (PROPSHEETPAGEA*)psInfo->proppage[index].hpage;
     1789
     1790     if ((psp->dwFlags & PSP_USETITLE) && psInfo->proppage[index].pszText)
     1791        HeapFree(GetProcessHeap(), 0, (LPVOID)psInfo->proppage[index].pszText);
     1792
     1793     DestroyPropertySheetPage(psInfo->proppage[index].hpage);
     1794  }
     1795 
    16381796  /* Remove the tab */
    16391797  SendMessageA(hwndTabControl, TCM_DELETEITEM, index, 0);
     
    16421800  psInfo->proppage = COMCTL32_Alloc(sizeof(PropPageInfo) * psInfo->nPages);
    16431801
    1644   if (index > 0)
     1802  if (index > 0) 
    16451803    memcpy(&psInfo->proppage[0], &oldPages[0], index * sizeof(PropPageInfo));
    16461804
     
    16641822static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags)
    16651823{
    1666   HWND hwndButton;
    1667 
    1668 //  TRACE("%ld\n", dwFlags);
     1824  HWND hwndBack   = GetDlgItem(hwndDlg, IDC_BACK_BUTTON);
     1825  HWND hwndNext   = GetDlgItem(hwndDlg, IDC_NEXT_BUTTON);
     1826  HWND hwndFinish = GetDlgItem(hwndDlg, IDC_FINISH_BUTTON);
     1827
     1828  TRACE("%ld\n", dwFlags);
     1829
     1830  EnableWindow(hwndBack, FALSE);
     1831  EnableWindow(hwndNext, FALSE);
     1832  EnableWindow(hwndFinish, FALSE);
    16691833
    16701834  if (dwFlags & PSWIZB_BACK)
    1671   {
    1672     hwndButton = GetDlgItem(hwndDlg, IDC_BACK_BUTTON);
    1673     EnableWindow(hwndButton, TRUE);
    1674   }
     1835    EnableWindow(hwndBack, TRUE);
    16751836
    16761837  if (dwFlags & PSWIZB_NEXT)
    16771838  {
    16781839    /* Hide the Finish button */
    1679     hwndButton = GetDlgItem(hwndDlg, IDC_FINISH_BUTTON);
    1680     ShowWindow(hwndButton, SW_HIDE);
     1840    ShowWindow(hwndFinish, SW_HIDE);
    16811841
    16821842    /* Show and enable the Next button */
    1683     hwndButton = GetDlgItem(hwndDlg, IDC_NEXT_BUTTON);
    1684 
    1685     ShowWindow(hwndButton, SW_SHOW);
    1686     EnableWindow(hwndButton, TRUE);
     1843    ShowWindow(hwndNext, SW_SHOW);
     1844    EnableWindow(hwndNext, TRUE);
    16871845
    16881846    /* Set the Next button as the default pushbutton  */
     
    16931851  {
    16941852    /* Hide the Next button */
    1695     hwndButton = GetDlgItem(hwndDlg, IDC_NEXT_BUTTON);
    1696     ShowWindow(hwndButton, SW_HIDE);
     1853    ShowWindow(hwndNext, SW_HIDE);
    16971854
    16981855    /* Show the Finish button */
    1699     hwndButton = GetDlgItem(hwndDlg, IDC_FINISH_BUTTON);
    1700     ShowWindow(hwndButton, SW_SHOW);
     1856    ShowWindow(hwndFinish, SW_SHOW);
    17011857
    17021858    if (dwFlags & PSWIZB_FINISH)
    1703       EnableWindow(hwndButton, TRUE);
    1704     else
    1705       EnableWindow(hwndButton, FALSE);
     1859      EnableWindow(hwndFinish, TRUE);
    17061860
    17071861    /* Set the Finish button as the default pushbutton  */
     
    17401894static void PROPSHEET_CleanUp(HWND hwndDlg)
    17411895{
     1896  int i;
    17421897  PropSheetInfo* psInfo = (PropSheetInfo*) RemovePropA(hwndDlg,
    17431898                                                       PropSheetInfoStr);
     1899
     1900  TRACE("\n");
     1901  if (HIWORD(psInfo->ppshheader->pszCaption))
     1902      HeapFree(GetProcessHeap(), 0, (LPVOID)psInfo->ppshheader->pszCaption);
     1903
     1904  COMCTL32_Free((LPVOID)psInfo->ppshheader);
     1905
     1906  for (i = 0; i < psInfo->nPages; i++)
     1907  {
     1908     PROPSHEETPAGEA* psp = (PROPSHEETPAGEA*)psInfo->proppage[i].hpage;
     1909
     1910     if(psInfo->proppage[i].hwndPage)
     1911        DestroyWindow(psInfo->proppage[i].hwndPage);
     1912
     1913     if(psp)
     1914     {
     1915        if ((psp->dwFlags & PSP_USETITLE) && psInfo->proppage[i].pszText)
     1916           HeapFree(GetProcessHeap(), 0, (LPVOID)psInfo->proppage[i].pszText);
     1917
     1918        DestroyPropertySheetPage(psInfo->proppage[i].hpage);
     1919     }
     1920  }
     1921
    17441922  COMCTL32_Free(psInfo->proppage);
    17451923  COMCTL32_Free(psInfo->strPropertiesFor);
     
    17571935  PropSheetInfo* psInfo = (PropSheetInfo*) GlobalAlloc(GPTR,
    17581936                                                       sizeof(PropSheetInfo));
    1759   LPCPROPSHEETPAGEA lppsp;
    17601937  int i;
     1938  BYTE* pByte;
    17611939
    17621940  PROPSHEET_CollectSheetInfo(lppsh, psInfo);
     
    17641942  psInfo->proppage = (PropPageInfo*) COMCTL32_Alloc(sizeof(PropPageInfo) *
    17651943                                                    lppsh->nPages);
     1944  pByte = (BYTE*) psInfo->ppshheader->u3.ppsp;
    17661945
    17671946  for (i = 0; i < lppsh->nPages; i++)
    17681947  {
    1769     psInfo->proppage[i].index = i;
    17701948    if (!(lppsh->dwFlags & PSH_PROPSHEETPAGE))
    17711949      psInfo->proppage[i].hpage = psInfo->ppshheader->u3.phpage[i];
    1772     lppsp = PROPSHEET_GetPSPPage(psInfo, i);
    1773     PROPSHEET_CollectPageInfo(lppsp, psInfo, i);
     1950    else
     1951    {
     1952       psInfo->proppage[i].hpage = CreatePropertySheetPageA((LPCPROPSHEETPAGEA)pByte);
     1953       pByte += ((LPPROPSHEETPAGEA)pByte)->dwSize;
     1954    }
     1955
     1956    PROPSHEET_CollectPageInfo((LPCPROPSHEETPAGEA)psInfo->proppage[i].hpage,
     1957                               psInfo, i);
    17741958  }
    17751959
     
    17991983  *ppsp = *lpPropSheetPage;
    18001984
     1985  if ( !(ppsp->dwFlags & PSP_DLGINDIRECT) && HIWORD( ppsp->u1.pszTemplate ) )
     1986    ppsp->u1.pszTemplate = HEAP_strdupA( GetProcessHeap(), 0, lpPropSheetPage->u1.pszTemplate );
     1987
     1988  if ( (ppsp->dwFlags & PSP_USEICONID) && HIWORD( ppsp->u2.pszIcon ) )
     1989      ppsp->u2.pszIcon = HEAP_strdupA( GetProcessHeap(), 0, lpPropSheetPage->u2.pszIcon );
     1990       
     1991
     1992  if ((ppsp->dwFlags & PSP_USETITLE) && HIWORD( ppsp->pszTitle ))
     1993      ppsp->pszTitle = HEAP_strdupA( GetProcessHeap(), 0, lpPropSheetPage->pszTitle );
     1994  else if ( !(ppsp->dwFlags & PSP_USETITLE) )
     1995      ppsp->pszTitle = NULL;
     1996
    18011997  return (HPROPSHEETPAGE)ppsp;
    18021998}
     
    18172013BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage)
    18182014{
     2015  PROPSHEETPAGEA *psp = (PROPSHEETPAGEA *)hPropPage;
     2016
     2017  if (!psp)
     2018     return FALSE;
     2019
     2020  if ( !(psp->dwFlags & PSP_DLGINDIRECT) && HIWORD( psp->u1.pszTemplate ) )
     2021     HeapFree(GetProcessHeap(), 0, (LPVOID)psp->u1.pszTemplate);
     2022
     2023  if ( (psp->dwFlags & PSP_USEICONID) && HIWORD( psp->u2.pszIcon ) )
     2024     HeapFree(GetProcessHeap(), 0, (LPVOID)psp->u2.pszIcon);
     2025
     2026  if ((psp->dwFlags & PSP_USETITLE) && HIWORD( psp->pszTitle ))
     2027      HeapFree(GetProcessHeap(), 0, (LPVOID)psp->pszTitle);
     2028
    18192029  COMCTL32_Free(hPropPage);
    18202030
    18212031  return TRUE;
     2032}
     2033
     2034/******************************************************************************
     2035 *            PROPSHEET_IsDialogMessage
     2036 */
     2037static BOOL PROPSHEET_IsDialogMessage(HWND hwnd, LPMSG lpMsg)
     2038{
     2039   PropSheetInfo* psInfo = (PropSheetInfo*) GetPropA(hwnd, PropSheetInfoStr);
     2040
     2041   if (!psInfo || (hwnd != lpMsg->hwnd && !IsChild(hwnd, lpMsg->hwnd)))
     2042      return FALSE;
     2043
     2044   if (lpMsg->message == WM_KEYDOWN && (GetKeyState(VK_CONTROL) & 0x8000))
     2045   {
     2046      int new_page = 0;
     2047      INT dlgCode = SendMessageA(lpMsg->hwnd, WM_GETDLGCODE, 0, (LPARAM)lpMsg);
     2048
     2049      if (!(dlgCode & DLGC_WANTMESSAGE))
     2050      {
     2051         switch (lpMsg->wParam)
     2052         {
     2053            case VK_TAB:
     2054               if (GetKeyState(VK_SHIFT) & 0x8000)
     2055                   new_page = -1;
     2056                else
     2057                   new_page = 1;
     2058               break;
     2059
     2060            case VK_NEXT:   new_page = 1;  break;
     2061            case VK_PRIOR:  new_page = -1; break;
     2062         }
     2063      }
     2064
     2065      if (new_page)
     2066      {
     2067         if (PROPSHEET_CanSetCurSel(hwnd) != FALSE)
     2068         {
     2069            new_page += psInfo->active_page;
     2070
     2071            if (new_page < 0)
     2072               new_page = psInfo->nPages - 1;
     2073            else if (new_page >= psInfo->nPages)
     2074               new_page = 0;
     2075
     2076            PROPSHEET_SetCurSel(hwnd, new_page, 0);
     2077         }
     2078
     2079         return TRUE;
     2080      }
     2081   }
     2082
     2083   return IsDialogMessageA(hwnd, lpMsg);
    18222084}
    18232085
     
    18362098      HWND hwndTabCtrl = GetDlgItem(hwnd, IDC_TABCONTROL);
    18372099      LPCPROPSHEETPAGEA ppshpage;
     2100      int idx;
    18382101
    18392102      SetPropA(hwnd, PropSheetInfoStr, (HANDLE)psInfo);
     
    18722135      if (psInfo->ppshheader->dwFlags & PSH_WIZARD)
    18732136      {
    1874         HWND hwndBack = GetDlgItem(hwnd, IDC_BACK_BUTTON);
    1875 
    18762137        if (PROPSHEET_IsTooSmallWizard(hwnd, psInfo))
    18772138        {
     
    18792140          PROPSHEET_AdjustButtonsWizard(hwnd, psInfo);
    18802141        }
    1881 
    1882         /* Disable Back button if we start at page 0 */
    1883         if (psInfo->active_page == 0)
    1884           EnableWindow(hwndBack, FALSE);
    18852142      }
    18862143      else
     
    18972154                                              PSCB_INITIALIZED, (LPARAM)0);
    18982155
    1899       ppshpage = PROPSHEET_GetPSPPage(psInfo, psInfo->active_page);
    1900       PROPSHEET_CreatePage(hwnd, psInfo->active_page, psInfo, ppshpage, TRUE);
     2156      idx = psInfo->active_page;
     2157      ppshpage = (LPCPROPSHEETPAGEA)psInfo->proppage[idx].hpage;
     2158      psInfo->active_page = -1;
     2159 
     2160      PROPSHEET_SetCurSel(hwnd, idx, psInfo->proppage[idx].hpage);
    19012161
    19022162      if (!(psInfo->ppshheader->dwFlags & PSH_WIZARD))
     
    19262186
    19272187    case WM_CLOSE:
    1928       PROPSHEET_Cancel(hwnd);
     2188      PROPSHEET_Cancel(hwnd, 1);
    19292189      return TRUE;
    19302190
     
    19402200          HWND hwndApplyBtn = GetDlgItem(hwnd, IDC_APPLY_BUTTON);
    19412201
    1942           if (PROPSHEET_Apply(hwnd) == FALSE)
     2202          if (PROPSHEET_Apply(hwnd, wID == IDOK ? 1: 0) == FALSE)
    19432203            break;
    1944 
    1945           EnableWindow(hwndApplyBtn, FALSE);
    19462204
    19472205          if (wID == IDOK)
     
    19592217
    19602218            if (psInfo->isModeless)
    1961               psInfo->active_page = -1;
     2219              psInfo->activeValid = FALSE;
    19622220            else
    19632221              EndDialog(hwnd, result);
    19642222          }
     2223          else
     2224             EnableWindow(hwndApplyBtn, FALSE);
    19652225
    19662226          break;
     
    19802240
    19812241        case IDCANCEL:
    1982           PROPSHEET_Cancel(hwnd);
     2242          PROPSHEET_Cancel(hwnd, 0);
    19832243          break;
    19842244
     
    20182278      HWND hwndPage = 0;
    20192279
    2020       if (psInfo->active_page != -1)
     2280      if (psInfo->activeValid && psInfo->active_page != -1)
    20212281        hwndPage = psInfo->proppage[psInfo->active_page].hwndPage;
    20222282
     
    20622322    case PSM_CANCELTOCLOSE:
    20632323    {
     2324      char buf[MAX_BUTTONTEXT_LENGTH];
    20642325      HWND hwndOK = GetDlgItem(hwnd, IDOK);
    20652326      HWND hwndCancel = GetDlgItem(hwnd, IDCANCEL);
    20662327
    20672328      EnableWindow(hwndCancel, FALSE);
    2068       SetWindowTextA(hwndOK, "Close"); /* FIXME: hardcoded string */
    2069 
    2070       return TRUE;
     2329      if (LoadStringA(COMCTL32_hModule, IDS_CLOSE, buf, sizeof(buf)))
     2330         SetWindowTextA(hwndOK, buf);
     2331 
     2332      return FALSE;
    20712333    }
    20722334
     
    20952357    case PSM_APPLY:
    20962358    {
    2097       BOOL msgResult = PROPSHEET_Apply(hwnd);
     2359      BOOL msgResult = PROPSHEET_Apply(hwnd, 0);
    20982360
    20992361      SetWindowLongA(hwnd, DWL_MSGRESULT, msgResult);
     
    21342396    case PSM_ISDIALOGMESSAGE:
    21352397    {
    2136       FIXME("Unimplemented msg PSM_ISDIALOGMESSAGE\n");
    2137       return 0;
     2398       BOOL msgResult = PROPSHEET_IsDialogMessage(hwnd, (LPMSG)lParam);
     2399       SetWindowLongA(hwnd, DWL_MSGRESULT, msgResult);
     2400       return TRUE;
    21382401    }
    21392402
Note: See TracChangeset for help on using the changeset viewer.