Changeset 953 for trunk/dll/notebook.c


Ignore:
Timestamp:
Feb 16, 2008, 3:15:16 AM (18 years ago)
Author:
Steven Levine
Message:

Rework code and resources to support settings menu conditional cascade
Optimize last settings menu save/restore

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/dll/notebook.c

    r940 r953  
    2626  13 Jan 08 GKY Get Subjectwidth/Subjectleft working in the collector.
    2727  xx Jan 08 JBS Ticket 150: fix/improve save and restore of dir cnr state at FM/2 close/reopen
     28  15 Feb 08 SHL Rework to support settings menu conditional cascade.  Make more generic
    2829
    2930***********************************************************************/
     
    4243#include "errutil.h"                    // Dos_Error...
    4344#include "strutil.h"                    // GetPString
     45#include "notebook.h"
    4446#include "fm3dll.h"
    4547
     
    4951
    5052static HWND hwndNotebook;
     53
     54static VOID SaveLastPageIndex(HWND hwnd);
    5155
    5256MRESULT EXPENTRY CfgADlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
     
    656660      // they contain args.
    657661      CHAR szCLBuf[MAXCOMLINESTRG], szPathBuf[CCHMAXPATH];
    658       PSZ  pszWorkBuf;
     662      PSZ pszWorkBuf;
    659663
    660664      pszWorkBuf = xmalloc(MAXCOMLINESTRG, pszSrcFile, __LINE__);
     
    21252129      dcd.fSubjectInLeftPane = WinQueryButtonCheckstate(hwnd, CFG5_SUBJECTINLEFTPANE);
    21262130      PrfWriteProfileData(fmprof, appname, "Collector.SubjectInLeftPane",
    2127                           &dcd.fSubjectInLeftPane, sizeof(BOOL));
     2131                          &dcd.fSubjectInLeftPane, sizeof(BOOL));
    21282132      dcd.fSubjectLengthMax = WinQueryButtonCheckstate(hwnd, CFG5_SUBJECTLENGTHMAX);
    21292133      PrfWriteProfileData(fmprof, appname, "Collector.SubjectLengthMax",
     
    29612965} np[] = {
    29622966  { IDM_DIRCNRSETTINGS, CFGD_FRAME, IDS_NOTEDIRCNRS1TEXT, CfgDDlgProc, 0, 0, 0 },
    2963   { 0, CFG5_FRAME, IDS_NOTEDIRVIEW1TEXT, Cfg5DlgProc, 0, 0, 0},
    2964   { 0, CFG6_FRAME, IDS_NOTEDIRSORT1TEXT, Cfg6DlgProc, 0, 0, 0 },
    2965   { IDM_COLLECTORSETTINGS, CFG5_FRAME, IDS_NOTECOLVIEW1TEXT, Cfg7DlgProc, 0, 0, 0 },
    2966   { 0, CFG6_FRAME, IDS_NOTECOLSORT1TEXT, Cfg8DlgProc, 0, 0, 0 },
     2967  { IDM_DIRVIEWSETTINGS, CFG5_FRAME, IDS_NOTEDIRVIEW1TEXT, Cfg5DlgProc, 0, 0, 0},
     2968  { IDM_DIRSORTSETTINGS, CFG6_FRAME, IDS_NOTEDIRSORT1TEXT, Cfg6DlgProc, 0, 0, 0 },
     2969  { IDM_COLLECTORVIEWSETTINGS, CFG5_FRAME, IDS_NOTECOLVIEW1TEXT, Cfg7DlgProc, 0, 0, 0 },
     2970  { IDM_COLLECTORSORTSETTINGS, CFG6_FRAME, IDS_NOTECOLSORT1TEXT, Cfg8DlgProc, 0, 0, 0 },
    29672971  { IDM_ARCHIVERSETTINGS, CFGA_FRAME, IDS_NOTEARCHIVER1TEXT, CfgADlgProc, 0, 0, 0 },
    2968   { 0, CFGT_FRAME, IDS_NOTETREE1TEXT, CfgTDlgProc, 0, 0, 0 },
    2969   { 0, CFGTS_FRAME, IDS_NOTETREESORT1TEXT, CfgTSDlgProc, 0, 0, 0 },
    2970   { 0, CFGV_FRAME, IDS_NOTEVIEWERS1TEXT, CfgVDlgProc, 0, 0, 0 },
    2971   { IDM_VIEWERSETTINGS, CFGH_FRAME, IDS_NOTEVIEWERS3TEXT, CfgHDlgProc, 0, 0, 0 },
     2972  { IDM_TREECNRVIEWSETTINGS, CFGT_FRAME, IDS_NOTETREE1TEXT, CfgTDlgProc, 0, 0, 0 },
     2973  { IDM_TREECNRSORTSETTINGS, CFGTS_FRAME, IDS_NOTETREESORT1TEXT, CfgTSDlgProc, 0, 0, 0 },
     2974  { IDM_VIEWERSETTINGS, CFGV_FRAME, IDS_NOTEVIEWERS1TEXT, CfgVDlgProc, 0, 0, 0 },
     2975  { IDM_VIEWERSETTINGS2, CFGH_FRAME, IDS_NOTEVIEWERS3TEXT, CfgHDlgProc, 0, 0, 0 },
    29722976  { IDM_COMPARESETTINGS, CFGC_FRAME, IDS_NOTECOMPARE1TEXT, CfgCDlgProc, 0, 0, 0 },
    2973   { 0, CFGM_FRAME, IDS_NOTEMONOLITHIC1TEXT, CfgMDlgProc, 0, 0, 0 },
    2974   { 0, CFGG_FRAME, IDS_NOTEGENERAL1TEXT, CfgGDlgProc, 0, 0, 0 },
    2975   { 0, CFGS_FRAME, IDS_NOTESCANNING1TEXT, CfgSDlgProc, 0, 0, 0 },
    2976   { 0, CFGB_FRAME, IDS_NOTEBUBBLE1TEXT, CfgBDlgProc, 0, 0, 0 },
     2977  { IDM_MONOLITHICSETTINGS, CFGM_FRAME, IDS_NOTEMONOLITHIC1TEXT, CfgMDlgProc, 0, 0, 0 },
     2978  { IDM_GENERALSETTINGS, CFGG_FRAME, IDS_NOTEGENERAL1TEXT, CfgGDlgProc, 0, 0, 0 },
     2979  { IDM_SCANSETTINGS, CFGS_FRAME, IDS_NOTESCANNING1TEXT, CfgSDlgProc, 0, 0, 0 },
     2980  { IDM_BUBBLESSETTINGS, CFGB_FRAME, IDS_NOTEBUBBLE1TEXT, CfgBDlgProc, 0, 0, 0 },
    29772981  { IDM_QUICKSETTINGS, CFG9_FRAME, IDS_NOTEQUICK1TEXT, Cfg9DlgProc, 0, 0, 0 },
    29782982  { 0, 0, 0, NULL, 0, 0, 0 }    // usFrameId 0 is end marker
    29792983};
     2984
     2985static PSZ pszIK_LastSettingsPage = "LastSettingsPage";
    29802986
    29812987MRESULT EXPENTRY CfgDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
     
    29852991  INT x;
    29862992  ULONG ulPageId;
    2987   ULONG ulSize;
    2988 
    2989   static PSZ pszIK_LastSettingsPage = "LastSettingsPage";
    2990   static BOOL fInitDone;
    2991 
    2992   static UINT uLastPageIndex;
     2993  UINT uPageIndex;
    29932994
    29942995  switch (msg) {
    29952996  case WM_INITDLG:
    29962997    hwndNotebook = hwnd;
    2997     if (!fInitDone) {
    2998       ulSize = sizeof(uLastPageIndex);
    2999       PrfQueryProfileData(fmprof, appname, pszIK_LastSettingsPage, &uLastPageIndex, &ulSize);
    3000       fInitDone = TRUE;
    3001     }
    3002     if (mp2) {
    3003       // If fm/2 lite drop quick setting page
    3004       if (mp2 == MPFROMLONG(IDM_LITESETTINGS)) {
    3005         x = 0;
    3006         while (np[x].usFrameId && np[x].usFrameId != CFG9_FRAME)
    3007           x++;
    3008         np[x].usFrameId = 0;
    3009         mp2 = 0;
    3010       }
    3011     }
     2998    uPageIndex = 0;
     2999
     3000    // If generic call, try to find conditional cascade default
     3001    // 15 Feb 08 SHL fixme to be gone when/if IDM_NOTEBOOK gone?
     3002    if (mp2 == MPFROMLONG(IDM_NOTEBOOK)) {
     3003      DbgMsg(pszSrcFile, __LINE__, "Trying to translate IDM_NOTEBOOK");
     3004      hwndTemp = WinQueryWindow(hwnd, QW_OWNER);
     3005      if (hwndTemp != HWND_DESKTOP) {
     3006        HWND hwndMenu;
     3007        // Owner is frame if not applet
     3008        hwndMenu = WinWindowFromID(hwndTemp, FID_MENU);
     3009        if (hwndMenu == NULLHANDLE)
     3010          Runtime_Error(pszSrcFile, __LINE__, "FID_MENU");
     3011        else {
     3012          MENUITEM mi;
     3013          BOOL ok;
     3014          memset(&mi, 0, sizeof(mi));
     3015          ok = (BOOL)WinSendMsg(hwndMenu,
     3016                                MM_QUERYITEM,
     3017                                MPFROM2SHORT(IDM_NOTEBOOKSUBMENU, TRUE),
     3018                                MPFROMP(&mi));
     3019          if (!ok)
     3020            Runtime_Error(pszSrcFile, __LINE__, "IDM_NOTEBOOKSUBMENU");
     3021          else {
     3022            mp2 = WinSendMsg(mi.hwndSubMenu, MM_QUERYDEFAULTITEMID, MPVOID, MPVOID);
     3023            if (!mp2)
     3024              Runtime_Error(pszSrcFile, __LINE__, "MM_QUERYDEFAULTITEMID");
     3025          }
     3026        }
     3027      }
     3028    }
     3029
    30123030    PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
    30133031    WinSendDlgItemMsg(hwnd,
     
    30233041                      BKM_SETDIMENSIONS,
    30243042                      MPFROM2SHORT(0, 0), MPFROMLONG(BKA_MINORTAB));
     3043
     3044    // Build and insert notebook pages
    30253045    for (x = 0; np[x].usFrameId; x++) {
    30263046      hwndTemp = WinLoadDlg(HWND_DESKTOP,
     
    30563076                          MPFROMLONG(np[x].ulPageId),
    30573077                          MPFROMP(GetPString(np[x].ulTitle + 1)));
    3058         if (LONGFROMMP(mp2) == np[x].usMenuId) {
    3059           uLastPageIndex = x;
    3060         }
    3061       }
    3062     } // for
     3078        if (LONGFROMMP(mp2) == np[x].usMenuId)
     3079          uPageIndex = x;               // Remember selected page
     3080      }
     3081    } // for pages
     3082
    30633083    // If quick settings page requested, assume request is for first time init
    30643084    // Turn to cfg page and show help
    30653085    // Page will not be available if running fm/2 lite or if load error
     3086    // 15 Feb 08 SHL fixme to do just once?
    30663087    if (mp2 == MPFROMLONG(IDM_QUICKSETTINGS) &&
    3067         x-- > 0 && np[x].hwnd && np[x].usFrameId == CFG9_FRAME) {
     3088        x-- > 0 &&
     3089        np[x].hwnd &&
     3090        np[x].usFrameId == CFG9_FRAME)
     3091    {
    30683092      // 10 Jan 08 SHL fixme to document what UM_SETDIR 1 means
    30693093      PostMsg(MainObjectHwnd, UM_SETDIR, MPFROMLONG(1), MPVOID);
     
    30733097      PostMsg(np[x].hwnd, WM_COMMAND, MPFROM2SHORT(IDM_HELP, 0), MPVOID);
    30743098    }
    3075     else {
    3076       if (uLastPageIndex >= x) {
    3077         Runtime_Error(pszSrcFile, __LINE__, "uLastPageIndex corrupted (%u)",
    3078                       uLastPageIndex);
    3079         uLastPageIndex = 0;
    3080       }
    3081       PostMsg(WinWindowFromID(hwnd, CFG_NOTEBOOK),
    3082               BKM_TURNTOPAGE, MPFROMLONG(np[uLastPageIndex].ulPageId), MPVOID);
    3083     }
     3099    else if (uPageIndex >= x) {
     3100      Runtime_Error(pszSrcFile, __LINE__, "uPageIndex corrupted (%u)",
     3101                    uPageIndex);
     3102      uPageIndex = 0;
     3103    }
     3104    PostMsg(WinWindowFromID(hwnd, CFG_NOTEBOOK),
     3105            BKM_TURNTOPAGE, MPFROMLONG(np[uPageIndex].ulPageId), MPVOID);
     3106    // 15 Feb 08 SHL fixme to put focus on first field of page
    30843107
    30853108  break;
     
    30893112      WinSetActiveWindow(HWND_DESKTOP, (HWND) mp1);
    30903113    break;
    3091 
    3092   case WM_CONTROL:
    3093     switch (SHORT1FROMMP(mp1)) {
    3094     case CFG_NOTEBOOK:
    3095       switch (SHORT2FROMMP(mp1)) {
    3096       case BKN_PAGESELECTED:
    3097         if (mp2) {
    3098           PAGESELECTNOTIFY *psn = mp2;
    3099           ULONG id = psn->ulPageIdNew;
    3100           UINT x;
    3101           for (x = 0; np[x].usFrameId; x++) {
    3102             if (np[x].ulPageId == id) {
    3103               uLastPageIndex = x;       // Found it
    3104               break;
    3105             }
    3106           }
    3107         }
    3108       } // switch BKN
    3109       break;
    3110     } // switch page
    3111     return 0;
    31123114
    31133115  case UM_SETUP:
     
    31243126    case DID_CANCEL:
    31253127      // Tell current page to undo itself in case changed and still alive
     3128      SaveLastPageIndex(hwnd);
    31263129      ulPageId = (ULONG) WinSendDlgItemMsg(hwnd,
    31273130                                         CFG_NOTEBOOK,
     
    31333136                                          BKM_QUERYPAGEWINDOWHWND,
    31343137                                          MPFROMLONG(ulPageId), MPVOID);
    3135       PrfWriteProfileData(fmprof, FM3Str, pszIK_LastSettingsPage,
    3136                           (PVOID)&uLastPageIndex, sizeof(uLastPageIndex));
    31373138      if (hwndTemp)
    31383139        WinSendMsg(hwndTemp, UM_UNDO, MPVOID, MPVOID);
     
    31803181    break;
    31813182  case WM_CLOSE:
    3182     PrfWriteProfileData(fmprof, FM3Str, pszIK_LastSettingsPage,
    3183                         (PVOID)&uLastPageIndex, sizeof(uLastPageIndex));
     3183    SaveLastPageIndex(hwnd);
    31843184    break;
    31853185  }
    31863186  return WinDefDlgProc(hwnd, msg, mp1, mp2);
     3187}
     3188/**
     3189 * Initialize config submenu
     3190 * @param hwndMenu is window handle
     3191 * @param fIsLite is true if called for fm/2 lite
     3192 */
     3193
     3194VOID CfgMenuInit(HWND hwndMenu, BOOL fIsLite)
     3195{
     3196  UINT uPageIndex;
     3197  ULONG ulSize = sizeof(uPageIndex);
     3198  UINT x;
     3199  PrfQueryProfileData(fmprof, appname, pszIK_LastSettingsPage, &uPageIndex, &ulSize);
     3200  for (x = 0; x < uPageIndex && np[x].usFrameId; x++)
     3201    ;                                   // Search
     3202  if (np[x].usMenuId)
     3203    SetConditionalCascade(hwndMenu, IDM_NOTEBOOKSUBMENU, np[uPageIndex].usMenuId);
     3204  // If lite, delete excess items from menus and tables
     3205  if (fIsLite) {
     3206    WinSendMsg(hwndMenu,
     3207               MM_DELETEITEM,
     3208               MPFROM2SHORT(IDM_QUICKSETTINGS, FALSE), MPVOID);
     3209    // If fm/2 lite drop quick setting page
     3210    for (x = 0; np[x].usFrameId && np[x].usFrameId != CFG9_FRAME; x++)
     3211      ; // Scan
     3212    np[x].usFrameId = 0;
     3213  }
     3214}
     3215
     3216static VOID SaveLastPageIndex(HWND hwnd)
     3217{
     3218  HWND hwndOwner;
     3219  HWND hwndMenu;
     3220  UINT x;
     3221  ULONG ulPageId;
     3222
     3223  // Owner is frame if not applet
     3224  hwndOwner = WinQueryWindow(hwnd, QW_OWNER);
     3225  if (hwndOwner != HWND_DESKTOP) {
     3226    ulPageId = (ULONG)WinSendDlgItemMsg(hwnd,
     3227                                       CFG_NOTEBOOK,
     3228                                       BKM_QUERYPAGEID,
     3229                                       MPFROMLONG(0),
     3230                                       MPFROM2SHORT(BKA_TOP, 0));
     3231    if (!ulPageId)
     3232      Runtime_Error(pszSrcFile, __LINE__, "BKM_QUERYPAGEID");
     3233    else {
     3234      for (x = 0; np[x].usMenuId && np[x].ulPageId != ulPageId; x++)
     3235        ; // Scan
     3236      if (!np[x].usMenuId)
     3237        Runtime_Error(pszSrcFile, __LINE__, "bad menu id %lu", ulPageId);
     3238      else {
     3239        PrfWriteProfileData(fmprof, FM3Str, pszIK_LastSettingsPage,
     3240                            (PVOID)&x, sizeof(x));
     3241        hwndMenu = WinWindowFromID(hwndOwner, FID_MENU);
     3242        SetConditionalCascade(hwndMenu, IDM_NOTEBOOKSUBMENU, np[x].usMenuId);
     3243      }
     3244    }
     3245  }
    31873246}
    31883247
     
    31923251#pragma alloc_text(NOTEBOOK4,Cfg7DlgProc,Cfg8DlgProc,CfgCDlgProc)
    31933252#pragma alloc_text(NOTEBOOK5,CfgGDlgProc,CfgDlgProc,CfgBDlgProc)
    3194 
     3253#pragma alloc_text(NOTEBOOK5,CfgMenuInit,SaveLastPageIndex)
Note: See TracChangeset for help on using the changeset viewer.