#ifndef _DESKTOP2_H
#define _DESKTOP2_H

#include "uxtheme.h"
#include "tmschema.h"

#define WC_USERPANE     TEXT("Desktop User Pane")
#define WC_LOGOFF       TEXT("DesktopLogoffPane")
#define WC_SFTBARHOST   TEXT("DesktopSFTBarHost")
#define WC_MOREPROGRAMS TEXT("Desktop More Programs Pane")

/*
 
   This is the new Start Panel layout model.  
   Each pane in the following diagram will contain a 9Grid and a control offset w/in 9grid.

   STARTPANELMETRICS structure should be able to be initialized from a static.
   in the non-theme case, that static is what we'll use, otherwise we'll over-ride it with theme settings

 *************************
 *                       *
 *    User               *
 *************************
 *           *           *
 *           *           *
 *   MFU     *    Places *
 *           *           *
 *           *           *
 *           *           *
 *************           *
 * MoreProg  *           *
 *************************
 *                       *
 *      Logoff           *
 *************************

*/

#define SMPANETYPE_USER     0
#define SMPANETYPE_MFU      1
#define SMPANETYPE_MOREPROG 2
#define SMPANETYPE_PLACES   3
#define SMPANETYPE_LOGOFF   4
#define SMPANE_MAX SMPANETYPE_LOGOFF+1

// Common data which every pane will specify
typedef struct {
    LPCTSTR pszClassName;           // (const) window class name
    DWORD   dwStyle;                // (const) window style
    int     iPartId;                // (const) theme part id
    SIZE    size;                   // (default) initial size of this pane
    HTHEME  hTheme;                 // (runtime) theme to pass to the control
    HWND    hwnd;                   // (runtime) filled in at runtime
} SMPANEDATA;

typedef struct {
    SIZE sizPanel;    // Initial size of panel
    SMPANEDATA  panes[SMPANE_MAX];
} STARTPANELMETRICS;



//
//  For communication between the New Start Menu and the controls it hosts.
//  Note that these are positive numbers (app-specific).
//
//  Some of these notifications go from child to parent; others from parent
//  to child.  They will be indicated (c2p) or (p2c) accordingly.

#define SMN_FIRST           200         // 200 - 299
#define SMN_INITIALUPDATE   (SMN_FIRST+0) // p2c - Start Menu is being built
#define SMN_APPLYREGION     (SMN_FIRST+1) // p2c - make the window regional again
#define SMN_HAVENEWITEMS    (SMN_FIRST+2) // c2p - new items are here
                                          //       lParam -> SMNMBOOL (fNewInstall)
#define SMN_MODIFYSMINFO    (SMN_FIRST+3) // p2c - allow flags to be set (psminfo->dwFlags)
#define SMN_COMMANDINVOKED  (SMN_FIRST+4) // c2p - user executed a command
#define SMN_FILTEROPTIONS   (SMN_FIRST+5) // c2p - turn off options not supported
#define SMN_GETMINSIZE      (SMN_FIRST+6) // p2c - allow client to specify minimum size
#define SMN_SEENNEWITEMS    (SMN_FIRST+7) // p2c - user has seen new items; don't need balloon tip
#define SMN_POSTPOPUP       (SMN_FIRST+8) // p2c - Start Menu is has just popped up
#define SMN_NEEDREPAINT     (SMN_FIRST+9) // c2p - There was a change in a list, we need to repaint 
                                          //         This used to keep the cached bitmap up to date

//
//  SMN_FINDITEM - find/select an item (used in dialog navigation)
//
//      SMNDIALOGMESSAGE.flags member describes what type of search
//      is requested.  If SMNDM_SELECT is set, then the found item is
//      also selected.
//
//      If a match was found, set SMNDIALOGMESSAGE.itemID to a
//      value that uniquely identifies the item within the control,
//      and return TRUE.
//
//      If no match was found, set pt = coordinates of current selection,
//      set one of the orientation flags SMNDM_VERTICAL/SMNDM_HORIZONTAL,
//      and return FALSE.
//
#define SMN_FINDITEM        (SMN_FIRST+7) // p2c - find/select an item
#define SMN_TRACKSHELLMENU  (SMN_FIRST+8) // c2p - display a popup menu
#define SMN_SHOWNEWAPPSTIP  (SMN_FIRST+9) // p2c - show the "More Programs" tip
                                          //       lParam -> SMNMBOOL (fShow)
#define SMN_DISMISS         (SMN_FIRST+10)// p2c - Start Menu is being dismissed
#define SMN_CANCELSHELLMENU (SMN_FIRST+11)// c2p - cancel the popup menu
#define SMN_BLOCKMENUMODE   (SMN_FIRST+12)// c2p - lParam -> SMNMBOOL (fBlock)

#define SMN_REFRESHLOGOFF   (SMN_FIRST+13)// p2c - indicates a WM_DEVICECHANGE or a session change
#define SMN_SHELLMENUDISMISSED (SMN_FIRST+14)// p2c - notification that the menu has dismissed

// Formerly used by SMN_LINKCOMMAND to specify which command we want
#define SMNLC_LOGOFF        0
#define SMNLC_TURNOFF       1
#define SMNLC_DISCONNECT    2
// REUSE ME                 3
#define SMNLC_EJECT         4
#define SMNLC_MAX           5

typedef struct SMNMMODIFYSMINFO {
    NMHDR hdr;
    struct tagSMDATA *psmd; // IN
    struct tagSMINFO *psminfo; // IN OUT
} SMNMMODIFYSMINFO, *PSMNMMODIFYSMINFO;

typedef struct SMNMBOOL {
    NMHDR hdr;
    BOOL  f;
} SMNMBOOL, *PSMNMBOOL;

typedef struct SMNMAPPLYREGION {
    NMHDR hdr;
    HRGN hrgn;
} SMNMAPPLYREGION, *PSMNMAPPLYREGION;

typedef struct SMNHAVENEWITEMS {
    NMHDR hdr;
    FILETIME ftNewestApp;
} SMNMHAVENEWITEMS, *PSMNMHAVENEWITEMS;

typedef struct SMNMCOMMANDINVOKED {
    NMHDR hdr;
    RECT rcItem;
} SMNMCOMMANDINVOKED, *PSMNMCOMMANDINVOKED;

//
//  Options for SMN_FILTEROPTIONS.
//
#define SMNOP_LOGOFF        (1 << SMNLC_LOGOFF)       // 0x01
#define SMNOP_TURNOFF       (1 << SMNLC_TURNOFF)      // 0x02
#define SMNOP_DISCONNECT    (1 << SMNLC_DISCONNECT)   // 0x04
// REUSE ME                 (1 << SMNLC_????????????) // 0x08
#define SMNOP_EJECT         (1 << SMNLC_EJECT)        // 0x10

typedef struct SMNFILTEROPTIONS {
    NMHDR hdr;
    UINT  smnop;                // IN OUT
} SMNFILTEROPTIONS, *PSMNFILTEROPTIONS;

typedef struct SMNGETMINSIZE {
    NMHDR hdr;
    SIZE  siz;                  // IN OUT
} SMNGETMINSIZE, *PSMNGETMINSIZE;

typedef struct SMNDIALOGMESSAGE {
    NMHDR hdr;
    MSG *pmsg;                  // IN
    LPARAM itemID;              // IN OUT
    POINT pt;                   // IN OUT
    UINT flags;                 // IN
} SMNDIALOGMESSAGE, *PSMNDIALOGMESSAGE;

// Values for "flags" in SMNDIALOGMESSAGE

#define SMNDM_FINDFIRSTMATCH    0x0000  // Find first matching item (char)
#define SMNDM_FINDNEXTMATCH     0x0001  // Find next matching item (char)
#define SMNDM_FINDNEAREST       0x0002  // Find item nearest point
#define SMNDM_FINDFIRST         0x0003  // Find the first item
#define SMNDM_FINDLAST          0x0004  // Find the last item
#define SMNDM_FINDNEXTARROW     0x0005  // Find next in direction of arrow
#define SMNDM_INVOKECURRENTITEM 0x0006  // Invoke the current item
#define SMNDM_HITTEST           0x0007  // Find item under point
#define SMNDM_OPENCASCADE       0x0008  // Invoke current item if it cascade
#define SMNDM_FINDITEMID        0x0009  // Find the specied item (itemID)
#define SMNDM_FINDMASK          0x000F  // What type of search?

#define SMNDM_SELECT            0x0100  // Select found item?
#define SMNDM_TRYCASCADE        0x0200  // Attempt to open cascading menu before navigatin
#define SMNDM_KEYBOARD          0x0400  // Initiated from keyboard

// Output flags
#define SMNDM_VERTICAL          0x4000  // Client is vertically-oriented
#define SMNDM_HORIZONTAL        0x8000  // Client is horizontally-oriented

typedef struct SMNTRACKSHELLMENU {
    NMHDR hdr;
    struct IShellMenu *psm;
    RECT rcExclude;
    LPARAM itemID;                  // Which item is being tracked?
    DWORD dwFlags;                  // MPPF_* values
} SMNTRACKSHELLMENU, *PSMNTRACKSHELLMENU;

#define REGSTR_PATH_STARTPANE \
        TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartPage")

#define REGSTR_PATH_STARTPANE_SETTINGS \
        TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced")

#define REGSTR_VAL_DV2_SHOWMC      TEXT("Start_ShowMyComputer")
#define REGSTR_VAL_DV2_SHOWNETPL   TEXT("Start_ShowNetPlaces")
#define REGSTR_VAL_DV2_SHOWNETCONN TEXT("Start_ShowNetConn")
#define REGSTR_VAL_DV2_SHOWRUN     TEXT("Start_ShowRun")
#define REGSTR_VAL_DV2_SHOWRECDOCS TEXT("Start_ShowRecentDocs")
#define REGSTR_VAL_DV2_SHOWMYDOCS  TEXT("Start_ShowMyDocs")
#define REGSTR_VAL_DV2_SHOWMYPICS  TEXT("Start_ShowMyPics")
#define REGSTR_VAL_DV2_SHOWMYMUSIC TEXT("Start_ShowMyMusic")
#define REGSTR_VAL_DV2_SHOWCPL     TEXT("Start_ShowControlPanel")
#define REGSTR_VAL_DV2_SHOWPRINTERS TEXT("Start_ShowPrinters")
#define REGSTR_VAL_DV2_SHOWHELP    TEXT("Start_ShowHelp")
#define REGSTR_VAL_DV2_SHOWSEARCH  TEXT("Start_ShowSearch")
#define REGSTR_VAL_DV2_FAVORITES   TEXT("StartMenuFavorites")   // shared with classic SM
#define REGSTR_VAL_DV2_LARGEICONS  TEXT("Start_LargeMFUIcons")
#define REGSTR_VAL_DV2_MINMFU      TEXT("Start_MinMFU")
#define REGSTR_VAL_DV2_SHOWOEM     TEXT("Start_ShowOEMLink")
#define REGSTR_VAL_DV2_AUTOCASCADE TEXT("Start_AutoCascade")
#define REGSTR_VAL_DV2_NOTIFYNEW   TEXT("Start_NotifyNewApps")
#define REGSTR_VAL_DV2_ADMINTOOLSROOT TEXT("Start_AdminToolsRoot")
#define REGSTR_VAL_DV2_MINMFU_DEFAULT   6

#define DV2_REGPATH TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartPage")
#define DV2_SYSTEM_START_TIME    TEXT("StartMenu_Start_Time")
#define DV2_NEWAPP_BALLOON_TIME  TEXT("StartMenu_Balloon_Time")

#define STARTPANELTHEME            L"StartPanel"
#define PROP_DV2_BALLOONTIP        L"StartMenuBalloonTip"

#define DV2_BALLOONTIP_MOREPROG     LongToHandle(1)
#define DV2_BALLOONTIP_CLIP         LongToHandle(2)
#define DV2_BALLOONTIP_STARTBUTTON  LongToHandle(3)

// protypes of functions which live in specfldr.cpp but trayprop needs access too
BOOL ShouldShowNetPlaces();
BOOL ShouldShowConnectTo();


#endif // _DESKTOP2_H