mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1547 lines
43 KiB
1547 lines
43 KiB
/*
|
|
* contmenu.c - Context menu implementations for MSMosaic.
|
|
*/
|
|
|
|
|
|
/* Headers
|
|
**********/
|
|
|
|
#include "all.h"
|
|
#pragma hdrstop
|
|
|
|
#include <regstr.h>
|
|
#include <shellp.h>
|
|
|
|
#include "contmenu.h"
|
|
#include "olestock.h"
|
|
#include "dataobjm.h"
|
|
#include "history.h"
|
|
#include "htmlutil.h"
|
|
#include "w32cmd.h"
|
|
#include "wc_html.h"
|
|
#include "winview.h"
|
|
#include "blob.h"
|
|
#include "mci.h"
|
|
|
|
/* Types
|
|
********/
|
|
|
|
/* User menu flags */
|
|
|
|
typedef enum _menuflags
|
|
{
|
|
/* flag combinations */
|
|
|
|
ALL_MENU_FLAGS = (MF_INSERT |
|
|
MF_CHANGE |
|
|
MF_APPEND |
|
|
MF_DELETE |
|
|
MF_REMOVE |
|
|
MF_BYCOMMAND |
|
|
MF_BYPOSITION |
|
|
MF_SEPARATOR |
|
|
MF_ENABLED |
|
|
MF_GRAYED |
|
|
MF_DISABLED |
|
|
MF_UNCHECKED |
|
|
MF_CHECKED |
|
|
MF_USECHECKBITMAPS |
|
|
MF_STRING |
|
|
MF_BITMAP |
|
|
MF_OWNERDRAW |
|
|
MF_POPUP |
|
|
MF_MENUBARBREAK |
|
|
MF_MENUBREAK |
|
|
MF_UNHILITE |
|
|
MF_HILITE |
|
|
MF_DEFAULT |
|
|
MF_SYSMENU |
|
|
MF_HELP |
|
|
MF_RIGHTJUSTIFY |
|
|
MF_MOUSESELECT)
|
|
}
|
|
MENUFLAGS;
|
|
|
|
/*
|
|
* Command flags indicate the modes in which a context menu command should be
|
|
* enabled.
|
|
*/
|
|
typedef enum _cmdflags
|
|
{
|
|
/* Command should be present for all elements. */
|
|
|
|
CM_CMD_FL_ALL = 0x0001,
|
|
|
|
/* Command should only be present for links. */
|
|
|
|
CM_CMD_FL_LINK_ONLY = 0x0002,
|
|
|
|
/* Command should only be present for non-links. */
|
|
|
|
CM_CMD_FL_NOT_LINK = 0x0004,
|
|
|
|
/* Command should only be present if page has background image. */
|
|
|
|
CM_CMD_FL_BACKGROUND_IMAGE = 0x0008,
|
|
|
|
/* Command should only be present if page has HTML source. */
|
|
|
|
CM_CMD_FL_HAS_HTML_SOURCE = 0x0010,
|
|
|
|
// The AVI is no longer playing, ie it is stoped
|
|
|
|
CM_CMD_FL_AVI_STOPPED_ONLY = 0x0020,
|
|
|
|
// The AVI ( inpage video ) is playing
|
|
|
|
CM_CMD_FL_AVI_PLAYING_ONLY = 0x0040,
|
|
|
|
// Is Set when there are no AVIs loaded
|
|
|
|
CM_CMD_FL_NO_AVIS = 0x0080,
|
|
|
|
#ifdef FEATURE_CONT_FORBACK
|
|
// Is Set when there are past pages visited
|
|
|
|
CM_CMD_FL_BACK = 0x0100,
|
|
|
|
// Is Set when there are forward pages visited
|
|
|
|
CM_CMD_FL_FWD = 0x0200,
|
|
#endif
|
|
|
|
/* flag combinations */
|
|
|
|
ALL_CM_CMD_FLAGS = (CM_CMD_FL_ALL |
|
|
CM_CMD_FL_LINK_ONLY |
|
|
CM_CMD_FL_NOT_LINK |
|
|
CM_CMD_FL_BACKGROUND_IMAGE |
|
|
CM_CMD_FL_HAS_HTML_SOURCE |
|
|
CM_CMD_FL_AVI_STOPPED_ONLY |
|
|
CM_CMD_FL_AVI_PLAYING_ONLY |
|
|
CM_CMD_FL_NO_AVIS
|
|
#ifdef FEATURE_CONT_FORBACK
|
|
| CM_CMD_FL_BACK | CM_CMD_FL_FWD
|
|
#endif
|
|
)
|
|
}
|
|
CMDFLAGS;
|
|
|
|
/* invoke command callback called by ContextMenu() */
|
|
|
|
typedef void (*INVOKECOMMANDPROC)(PVOID pv);
|
|
|
|
/* context menu item */
|
|
|
|
typedef struct _menuitem
|
|
{
|
|
/* menu command ID */
|
|
|
|
int nCmdID;
|
|
|
|
/* command string resource ID */
|
|
|
|
UINT uCmdStringID;
|
|
|
|
/* enabled state menu flags */
|
|
|
|
UINT uMenuFlags;
|
|
|
|
/* command flags */
|
|
|
|
DWORD dwCmdFlags;
|
|
|
|
/* invoke command callback, may be NULL */
|
|
|
|
INVOKECOMMANDPROC icp;
|
|
}
|
|
MENUITEM;
|
|
DECLARE_STANDARD_TYPES(MENUITEM);
|
|
|
|
/* context menu */
|
|
|
|
typedef struct _contextmenu
|
|
{
|
|
/* number of menu items in rgcmi array */
|
|
|
|
UINT ucMenuItems;
|
|
|
|
/* ordered array of menu items */
|
|
|
|
CMENUITEM rgcmi[];
|
|
}
|
|
CONTEXTMENU;
|
|
DECLARE_STANDARD_TYPES(CONTEXTMENU);
|
|
|
|
/* context menu for an element */
|
|
|
|
typedef struct elemtypecontextmenu
|
|
{
|
|
/* element type */
|
|
|
|
UCHAR uchElemType;
|
|
|
|
/* context menu for element type */
|
|
|
|
PCCONTEXTMENU pccm;
|
|
}
|
|
ELEMTYPECONTEXTMENU;
|
|
DECLARE_STANDARD_TYPES(ELEMTYPECONTEXTMENU);
|
|
|
|
/* desktop wallpaper layout styles */
|
|
|
|
typedef enum wallpaper_look
|
|
{
|
|
/* Don't change current desktop wallpaper layout style. */
|
|
|
|
WPLK_AS_IS,
|
|
|
|
/* Center desktop wallpaper. */
|
|
|
|
WPLK_CENTERED,
|
|
|
|
/* Tile desktop wallpaper. */
|
|
|
|
WPLK_TILED
|
|
}
|
|
WALLPAPER_LOOK;
|
|
|
|
|
|
/* Module Prototypes
|
|
********************/
|
|
|
|
#ifdef FEATURE_CONT_FORBACK
|
|
PRIVATE_CODE void Page_GoBack(PVOID pvmwin);
|
|
PRIVATE_CODE void Page_GoForward(PVOID pvmwin);
|
|
PRIVATE_CODE BOOL HasFwdPages(PCMWIN pcmwin);
|
|
PRIVATE_CODE BOOL HasBackPages(PCMWIN pcmwin);
|
|
#endif
|
|
PRIVATE_CODE void Page_SaveBackgroundAs(PVOID pvmwin);
|
|
PRIVATE_CODE void Page_CopyBackground(PVOID pvmwin);
|
|
PRIVATE_CODE void Page_SelectAll(PVOID pvmwin);
|
|
PRIVATE_CODE void Page_ViewSource(PVOID pvmwin);
|
|
PRIVATE_CODE void Page_SetBackgroundWallpaper(PVOID pvmwin);
|
|
PRIVATE_CODE void Page_CreateShortcut(PVOID pvmwin);
|
|
PRIVATE_CODE void Page_AddToFavorites(PVOID pvmwin);
|
|
PRIVATE_CODE void Link_Open(PVOID pcveleminfo);
|
|
PRIVATE_CODE void Link_OpenNewWindow(PVOID pcveleminfo);
|
|
PRIVATE_CODE void Link_Copy(PVOID pcveleminfo);
|
|
PRIVATE_CODE void Link_AddToFavorites(PVOID pcveleminfo);
|
|
PRIVATE_CODE void Link_SaveAs(PVOID pcveleminfo);
|
|
PRIVATE_CODE void ImagePlaceholder_Show(PVOID pcveleminfo);
|
|
PRIVATE_CODE void Image_Copy(PVOID pcveleminfo);
|
|
PRIVATE_CODE void Image_SaveAs(PVOID pcveleminfo);
|
|
PRIVATE_CODE void Image_SetWallpaper(PVOID pcveleminfo);
|
|
PRIVATE_CODE void Selection_Copy(PVOID pvmwin);
|
|
PRIVATE_CODE void Page_Properties(PVOID pvmwin);
|
|
PRIVATE_CODE void Link_Properties(PVOID pvmwin);
|
|
PRIVATE_CODE void Image_Properties(PVOID pvmwin);
|
|
PRIVATE_CODE void Avi_Play(PVOID pcveleminfo);
|
|
PRIVATE_CODE void Avi_Stop(PVOID pcveleminfo);
|
|
|
|
|
|
/* Module Constants
|
|
*******************/
|
|
|
|
#pragma data_seg(DATA_SEG_READ_ONLY)
|
|
|
|
/* maximum context menu command string */
|
|
|
|
#define MAX_CONTEXT_MENU_CMD_LEN MAX_PATH_LEN
|
|
|
|
/* desktop wallpaper strings */
|
|
|
|
PRIVATE_DATA CCHAR s_cszDesktopSubkey[] = REGSTR_PATH_DESKTOP;
|
|
PRIVATE_DATA CCHAR s_cszTileWallpaper[] = "TileWallpaper";
|
|
PRIVATE_DATA CCHAR s_cszZero[] = "0";
|
|
PRIVATE_DATA CCHAR s_cszOne[] = "1";
|
|
|
|
/* context menus */
|
|
|
|
/* Each CONTEXTMENU command is assumed to be initialized as enabled. */
|
|
|
|
#ifdef FEATURE_CONT_FORBACK
|
|
#define CONT_PAGEMENU_COUNT 15
|
|
#define CONT_LINKMENU_COUNT 12
|
|
#define CONT_PHMENU_COUNT 13
|
|
#define CONT_IMAGMENU_COUNT 15
|
|
#else
|
|
#define CONT_PAGEMENU_COUNT 12
|
|
#define CONT_LINKMENU_COUNT 9
|
|
#define CONT_PHMENU_COUNT 10
|
|
#define CONT_IMAGMENU_COUNT 12
|
|
#endif
|
|
|
|
PRIVATE_DATA CCONTEXTMENU s_ccmPage =
|
|
{
|
|
CONT_PAGEMENU_COUNT,
|
|
{
|
|
#ifdef FEATURE_CONT_FORBACK
|
|
{ RES_CM_ITEM_PAGE_GOBACK, RES_STRING_TT4, (MF_STRING | MF_ENABLED), CM_CMD_FL_BACK, &Page_GoBack },
|
|
{ RES_CM_ITEM_PAGE_GOFORWARD, RES_STRING_TT5, (MF_STRING | MF_ENABLED), CM_CMD_FL_FWD, &Page_GoForward },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
#endif
|
|
{ RES_CM_ITEM_PAGE_BACKGROUND_SAVE_AS, RES_STRING_PAGE_BACKGROUND_SAVE_AS, (MF_STRING | MF_ENABLED), CM_CMD_FL_BACKGROUND_IMAGE, &Page_SaveBackgroundAs },
|
|
{ RES_CM_ITEM_PAGE_SET_BG_WALLPAPER, RES_STRING_PAGE_SET_BG_WALLPAPER, (MF_STRING | MF_ENABLED), CM_CMD_FL_BACKGROUND_IMAGE, &Page_SetBackgroundWallpaper },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_PAGE_COPY_BACKGROUND, RES_STRING_PAGE_COPY_BACKGROUND, (MF_STRING | MF_ENABLED), CM_CMD_FL_BACKGROUND_IMAGE, &Page_CopyBackground },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_PAGE_SELECT_ALL, RES_STRING_PAGE_SELECT_ALL, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &Page_SelectAll },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_PAGE_CREATE_SHORTCUT, RES_STRING_PAGE_CREATE_SHORTCUT, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &Page_CreateShortcut },
|
|
{ RES_CM_ITEM_PAGE_ADD_TO_FAVORITES, RES_STRING_PAGE_ADD_TO_FAVORITES, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &Page_AddToFavorites },
|
|
{ RES_CM_ITEM_PAGE_VIEW_SOURCE, RES_STRING_PAGE_VIEW_SOURCE, (MF_STRING | MF_ENABLED), CM_CMD_FL_HAS_HTML_SOURCE, &Page_ViewSource },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_PROPERTIES, RES_STRING_PROPERTIES, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &Page_Properties },
|
|
}
|
|
};
|
|
|
|
PRIVATE_DATA CCONTEXTMENU s_ccmSelection =
|
|
{
|
|
2,
|
|
{
|
|
{ RES_CM_ITEM_SELECTION_COPY, RES_STRING_SELECTION_COPY, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &Selection_Copy },
|
|
{ RES_CM_ITEM_SELECTION_SELECT_ALL, RES_STRING_SELECTION_SELECT_ALL, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &Page_SelectAll },
|
|
}
|
|
};
|
|
|
|
PRIVATE_DATA CCONTEXTMENU s_ccmLink =
|
|
{
|
|
CONT_LINKMENU_COUNT,
|
|
{
|
|
#ifdef FEATURE_CONT_FORBACK
|
|
{ RES_CM_ITEM_PAGE_GOBACK, RES_STRING_TT4, (MF_STRING | MF_ENABLED), CM_CMD_FL_BACK, &Page_GoBack },
|
|
{ RES_CM_ITEM_PAGE_GOFORWARD, RES_STRING_TT5, (MF_STRING | MF_ENABLED), CM_CMD_FL_FWD, &Page_GoForward },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
#endif
|
|
{ RES_CM_ITEM_LINK_OPEN, RES_STRING_LINK_OPEN, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_Open },
|
|
{ RES_CM_ITEM_LINK_OPEN_NEW_WINDOW, RES_STRING_LINK_OPEN_NEW_WINDOW, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_OpenNewWindow },
|
|
{ RES_CM_ITEM_LINK_SAVE_AS, RES_STRING_LINK_SAVE_AS, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_SaveAs },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_LINK_COPY, RES_STRING_LINK_COPY, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_Copy },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_LINK_ADD_TO_FAVORITES, RES_STRING_LINK_ADD_TO_FAVORITES, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_AddToFavorites },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_PROPERTIES, RES_STRING_PROPERTIES, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &Link_Properties },
|
|
}
|
|
};
|
|
|
|
|
|
PRIVATE_DATA CCONTEXTMENU s_ccmImagePlaceholder =
|
|
{
|
|
CONT_PHMENU_COUNT,
|
|
{
|
|
#ifdef FEATURE_CONT_FORBACK
|
|
{ RES_CM_ITEM_PAGE_GOBACK, RES_STRING_TT4, (MF_STRING | MF_ENABLED), CM_CMD_FL_BACK, &Page_GoBack },
|
|
{ RES_CM_ITEM_PAGE_GOFORWARD, RES_STRING_TT5, (MF_STRING | MF_ENABLED), CM_CMD_FL_FWD, &Page_GoForward },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
#endif
|
|
{ RES_CM_ITEM_IMAGE_PH_OPEN, RES_STRING_IMAGE_PH_OPEN, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_Open },
|
|
{ RES_CM_ITEM_IMAGE_PH_OPEN_NEW_WINDOW, RES_STRING_IMAGE_PH_OPEN_NEW_WINDOW, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_OpenNewWindow },
|
|
{ RES_CM_ITEM_LINK_SAVE_AS, RES_STRING_LINK_SAVE_AS, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_SaveAs },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_IMAGE_PH_SHOW_PICTURE, RES_STRING_IMAGE_PH_SHOW_PICTURE, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &ImagePlaceholder_Show },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_IMAGE_PH_COPY_SHORTCUT, RES_STRING_IMAGE_PH_COPY_SHORTCUT, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_Copy },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_IMAGE_PH_ADD_TO_FAVORITES, RES_STRING_IMAGE_PH_ADD_TO_FAVORITES, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_AddToFavorites },
|
|
{ RES_CM_ITEM_PROPERTIES, RES_STRING_PROPERTIES, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &Image_Properties },
|
|
}
|
|
};
|
|
|
|
PRIVATE_DATA CCONTEXTMENU s_ccmImage =
|
|
{
|
|
CONT_IMAGMENU_COUNT,
|
|
{
|
|
#ifdef FEATURE_CONT_FORBACK
|
|
{ RES_CM_ITEM_PAGE_GOBACK, RES_STRING_TT4, (MF_STRING | MF_ENABLED), CM_CMD_FL_BACK, &Page_GoBack },
|
|
{ RES_CM_ITEM_PAGE_GOFORWARD, RES_STRING_TT5, (MF_STRING | MF_ENABLED), CM_CMD_FL_FWD, &Page_GoForward },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
#endif
|
|
{ RES_CM_ITEM_LINK_OPEN, RES_STRING_IMAGE_OPEN, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_Open },
|
|
{ RES_CM_ITEM_LINK_OPEN_NEW_WINDOW, RES_STRING_IMAGE_OPEN_NEW_WINDOW, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_OpenNewWindow },
|
|
{ RES_CM_ITEM_LINK_SAVE_AS, RES_STRING_LINK_SAVE_AS, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_SaveAs },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_IMAGE_SAVE_AS, RES_STRING_IMAGE_SAVE_AS, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &Image_SaveAs },
|
|
{ RES_CM_ITEM_IMAGE_SET_AS_WALLPAPER, RES_STRING_IMAGE_SET_AS_WALLPAPER, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &Image_SetWallpaper },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_IMAGE_COPY_PICTURE, RES_STRING_IMAGE_COPY_PICTURE, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &Image_Copy },
|
|
{ RES_CM_ITEM_IMAGE_COPY_SHORTCUT, RES_STRING_IMAGE_COPY_SHORTCUT, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_Copy },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_IMAGE_ADD_TO_FAVORITES, RES_STRING_IMAGE_ADD_TO_FAVORITES, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_AddToFavorites },
|
|
{ RES_CM_ITEM_PROPERTIES, RES_STRING_PROPERTIES, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &Image_Properties },
|
|
}
|
|
};
|
|
|
|
PRIVATE_DATA CCONTEXTMENU s_ccmAviImage =
|
|
{
|
|
15,
|
|
{
|
|
{ RES_CM_ITEM_LINK_OPEN, RES_STRING_IMAGE_OPEN, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_Open },
|
|
{ RES_CM_ITEM_LINK_OPEN_NEW_WINDOW, RES_STRING_IMAGE_OPEN_NEW_WINDOW, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_OpenNewWindow },
|
|
{ RES_CM_ITEM_LINK_SAVE_AS, RES_STRING_LINK_SAVE_AS, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_SaveAs },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_IMAGE_SAVE_AS, RES_STRING_IMAGE_SAVE_AS, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &Image_SaveAs },
|
|
{ RES_CM_ITEM_IMAGE_SET_AS_WALLPAPER, RES_STRING_IMAGE_SET_AS_WALLPAPER, (MF_STRING | MF_ENABLED), CM_CMD_FL_NO_AVIS, &Image_SetWallpaper },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_IMAGE_COPY_PICTURE, RES_STRING_IMAGE_COPY_PICTURE, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &Image_Copy },
|
|
{ RES_CM_ITEM_IMAGE_COPY_SHORTCUT, RES_STRING_IMAGE_COPY_SHORTCUT, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_Copy },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_IMAGE_ADD_TO_FAVORITES, RES_STRING_IMAGE_ADD_TO_FAVORITES, (MF_STRING | MF_ENABLED), CM_CMD_FL_LINK_ONLY, &Link_AddToFavorites },
|
|
{ RES_CM_ITEM_NO_COMMAND, NO_STRING, (MF_SEPARATOR), CM_CMD_FL_ALL, NULL },
|
|
{ RES_CM_ITEM_AVI_PLAY, RES_STRING_PLAY, (MF_STRING | MF_ENABLED), CM_CMD_FL_AVI_STOPPED_ONLY, &Avi_Play },
|
|
{ RES_CM_ITEM_AVI_STOP, RES_STRING_STOP, (MF_STRING | MF_ENABLED), CM_CMD_FL_AVI_PLAYING_ONLY, &Avi_Stop },
|
|
{ RES_CM_ITEM_PROPERTIES, RES_STRING_PROPERTIES, (MF_STRING | MF_ENABLED), CM_CMD_FL_ALL, &Image_Properties },
|
|
}
|
|
};
|
|
|
|
|
|
/* context menu by element type */
|
|
|
|
PRIVATE_DATA CELEMTYPECONTEXTMENU s_rgcetcm[] =
|
|
{
|
|
{ ELE_IMAGE, &s_ccmImage },
|
|
{ ELE_FORMIMAGE, &s_ccmImage },
|
|
};
|
|
|
|
#pragma data_seg()
|
|
|
|
|
|
/***************************** Private Functions *****************************/
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
PRIVATE_CODE BOOL IsValidPCMENUITEM(PCMENUITEM pcmi)
|
|
{
|
|
/* uCmdStringID may be any value. */
|
|
|
|
return(IS_VALID_READ_PTR(pcmi, CMENUITEM) &&
|
|
FLAGS_ARE_VALID(pcmi->uMenuFlags, ALL_MENU_FLAGS) &&
|
|
(! pcmi->icp ||
|
|
IS_VALID_CODE_PTR(pcmi->icp, INVOKECOMMANDPROC)));
|
|
}
|
|
|
|
|
|
PRIVATE_CODE BOOL IsValidArrayOfMenuItems(PCMENUITEM pcmi, UINT ucMenuItems)
|
|
{
|
|
BOOL bResult = TRUE;
|
|
UINT u;
|
|
|
|
for (u = 0; u < ucMenuItems; u++)
|
|
{
|
|
bResult = IS_VALID_STRUCT_PTR(&(pcmi[u]), CMENUITEM);
|
|
|
|
if (! bResult)
|
|
break;
|
|
}
|
|
|
|
return(bResult);
|
|
}
|
|
|
|
|
|
PRIVATE_CODE BOOL IsValidPCCONTEXTMENU(PCCONTEXTMENU pccm)
|
|
{
|
|
return(IS_VALID_READ_PTR(pccm, CCONTEXTMENU) &&
|
|
EVAL(IsValidArrayOfMenuItems(pccm->rgcmi, pccm->ucMenuItems)));
|
|
}
|
|
|
|
|
|
PRIVATE_CODE BOOL IsValidPCELEMTYPECONTEXTMENU(PCELEMTYPECONTEXTMENU pcetcm)
|
|
{
|
|
/* Allow uchElemType to be any value. */
|
|
|
|
return(IS_VALID_READ_PTR(pcetcm, CELEMTYPECONTEXTMENU) &&
|
|
IS_VALID_STRUCT_PTR(pcetcm->pccm, CCONTEXTMENU));
|
|
}
|
|
|
|
|
|
PRIVATE_CODE BOOL IsValidWallpaperLook(WALLPAPER_LOOK wplk)
|
|
{
|
|
BOOL bResult;
|
|
|
|
switch (wplk)
|
|
{
|
|
case WPLK_AS_IS:
|
|
case WPLK_CENTERED:
|
|
case WPLK_TILED:
|
|
bResult = TRUE;
|
|
break;
|
|
|
|
default:
|
|
bResult = FALSE;
|
|
ERROR_OUT(("IsValidWallpaperLook(): Invalid WALLPAPER_LOOK %d.",
|
|
wplk));
|
|
break;
|
|
}
|
|
|
|
return(bResult);
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
PRIVATE_CODE BOOL GetContextMenuFromElement(PCELEMENT pcelem,
|
|
PCCONTEXTMENU *ppccm)
|
|
{
|
|
BOOL bResult = FALSE;
|
|
BOOL bLink;
|
|
BOOL bIsAvi;
|
|
int i;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcelem, CELEMENT));
|
|
ASSERT(IS_VALID_WRITE_PTR(ppccm, PCCONTEXTMENU));
|
|
|
|
*ppccm = NULL;
|
|
|
|
bLink = IS_FLAG_SET(pcelem->lFlags, ELEFLAG_ANCHOR);
|
|
bIsAvi = MCI_IS_LOADED(pcelem->pmo);
|
|
|
|
for (i = 0; i < ARRAY_ELEMENTS(s_rgcetcm); i++)
|
|
{
|
|
ASSERT(IS_VALID_STRUCT_PTR(&(s_rgcetcm[i]), CELEMTYPECONTEXTMENU));
|
|
|
|
if (s_rgcetcm[i].uchElemType == pcelem->type)
|
|
{
|
|
// If This image is an AVI, then make sure to give it,
|
|
// its special menu
|
|
//
|
|
// Warning: This May not work if the array this loop relies
|
|
// on is changed to non-images, which may not support AVIs
|
|
//
|
|
if ( bIsAvi )
|
|
*ppccm = &s_ccmAviImage;
|
|
else
|
|
*ppccm = s_rgcetcm[i].pccm;
|
|
bResult = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
if (!bIsAvi && ElementIsImagePlaceHolder(pcelem) )
|
|
{
|
|
*ppccm = &s_ccmImagePlaceholder;
|
|
bResult = TRUE;
|
|
}
|
|
|
|
if (! bResult && bLink)
|
|
{
|
|
*ppccm = &s_ccmLink;
|
|
bResult = TRUE;
|
|
}
|
|
|
|
ASSERT((bResult &&
|
|
IS_VALID_STRUCT_PTR(*ppccm, CCONTEXTMENU)) ||
|
|
(! bResult &&
|
|
! *ppccm));
|
|
|
|
return(bResult);
|
|
}
|
|
|
|
|
|
PRIVATE_CODE BOOL CreateContextMenu(PCCONTEXTMENU pccm, DWORD dwCmdFlags,
|
|
PHMENU phmenu)
|
|
{
|
|
BOOL bResult;
|
|
HMENU hmenu;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pccm, CCONTEXTMENU));
|
|
ASSERT(FLAGS_ARE_VALID(dwCmdFlags, ALL_CM_CMD_FLAGS));
|
|
ASSERT(IS_VALID_WRITE_PTR(phmenu, HMENU));
|
|
|
|
*phmenu = NULL;
|
|
|
|
hmenu = CreatePopupMenu();
|
|
|
|
bResult = (hmenu != NULL);
|
|
|
|
if (bResult)
|
|
{
|
|
UINT u;
|
|
|
|
for (u = 0; u < pccm->ucMenuItems; u++)
|
|
{
|
|
PCMENUITEM pcmi = &(pccm->rgcmi[u]);
|
|
char szCommand[MAX_CONTEXT_MENU_CMD_LEN];
|
|
PCSTR pcszCmd;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcmi, CMENUITEM));
|
|
|
|
/* Append this command? */
|
|
|
|
if (pcmi->uCmdStringID != NO_STRING)
|
|
{
|
|
bResult = LoadString(wg.hInstance, pcmi->uCmdStringID,
|
|
szCommand, sizeof(szCommand));
|
|
pcszCmd = szCommand;
|
|
}
|
|
else
|
|
{
|
|
bResult = TRUE;
|
|
pcszCmd = NULL;
|
|
}
|
|
|
|
if (bResult)
|
|
{
|
|
UINT uMenuFlags;
|
|
|
|
uMenuFlags = pcmi->uMenuFlags;
|
|
|
|
if (IS_FLAG_CLEAR(pcmi->dwCmdFlags, dwCmdFlags))
|
|
{
|
|
CLEAR_FLAG(uMenuFlags, MF_DISABLED);
|
|
CLEAR_FLAG(uMenuFlags, MF_ENABLED);
|
|
SET_FLAG(uMenuFlags, MF_GRAYED);
|
|
}
|
|
|
|
#ifdef DAYTONA_BUILD
|
|
if(OnNT351) {
|
|
if(pcmi->nCmdID == RES_CM_ITEM_IMAGE_PH_COPY_SHORTCUT ||
|
|
pcmi->nCmdID == RES_CM_ITEM_IMAGE_COPY_SHORTCUT ||
|
|
pcmi->nCmdID == RES_CM_ITEM_PAGE_CREATE_SHORTCUT) {
|
|
SET_FLAG(uMenuFlags, MF_DISABLED);
|
|
SET_FLAG(uMenuFlags, MF_GRAYED);
|
|
}
|
|
}
|
|
#endif
|
|
bResult = AppendMenu(hmenu, uMenuFlags, pcmi->nCmdID, pcszCmd);
|
|
}
|
|
|
|
if (! bResult)
|
|
break;
|
|
}
|
|
|
|
if (bResult)
|
|
{
|
|
ASSERT(u == pccm->ucMenuItems);
|
|
|
|
*phmenu = hmenu;
|
|
}
|
|
else
|
|
{
|
|
EVAL(DestroyMenu(hmenu));
|
|
hmenu = NULL;
|
|
}
|
|
}
|
|
|
|
if (bResult)
|
|
TRACE_OUT(("CreateContextMenu(): Created context menu."));
|
|
else
|
|
WARNING_OUT(("CreateContextMenu(): Failed to create context menu."));
|
|
|
|
ASSERT((bResult &&
|
|
IS_VALID_HANDLE(*phmenu, MENU)) ||
|
|
(! bResult &&
|
|
! *phmenu));
|
|
|
|
return(bResult);
|
|
}
|
|
|
|
|
|
PRIVATE_CODE BOOL FindMenuItem(PCCONTEXTMENU pccm, int nCmd, PCMENUITEM *ppcmi)
|
|
{
|
|
UINT u;
|
|
|
|
/* nCmd may be any value. */
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pccm, CCONTEXTMENU));
|
|
ASSERT(IS_VALID_WRITE_PTR(ppcmi, PCMENUITEM));
|
|
|
|
*ppcmi = NULL;
|
|
|
|
for (u = 0; u < pccm->ucMenuItems; u++)
|
|
{
|
|
PCMENUITEM pcmi = &(pccm->rgcmi[u]);
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcmi, CMENUITEM));
|
|
|
|
if (pcmi->nCmdID == nCmd)
|
|
{
|
|
*ppcmi = pcmi;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return(*ppcmi != NULL);
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void ContextMenu(HWND hwnd, PCCONTEXTMENU pccm, DWORD dwCmdFlags,
|
|
int xScreen, int yScreen, PVOID pvData)
|
|
{
|
|
HMENU hmenuContext;
|
|
|
|
/* pcvData may be any value. */
|
|
|
|
ASSERT(IS_VALID_HANDLE(hwnd, WND));
|
|
ASSERT(IS_VALID_STRUCT_PTR(pccm, CCONTEXTMENU));
|
|
ASSERT(FLAGS_ARE_VALID(dwCmdFlags, ALL_CM_CMD_FLAGS));
|
|
ASSERT(IsValidScreenX(xScreen));
|
|
ASSERT(IsValidScreenY(yScreen));
|
|
|
|
if (CreateContextMenu(pccm, dwCmdFlags, &hmenuContext))
|
|
{
|
|
int nCmd;
|
|
|
|
nCmd = TrackPopupMenu(hmenuContext, (TPM_TOPALIGN | TPM_LEFTALIGN |
|
|
TPM_RIGHTBUTTON | TPM_RETURNCMD),
|
|
xScreen, yScreen, 0, hwnd, NULL);
|
|
|
|
if (nCmd > 0)
|
|
{
|
|
PCMENUITEM pcmi;
|
|
|
|
if (FindMenuItem(pccm, nCmd, &pcmi))
|
|
{
|
|
if (pcmi->icp)
|
|
(*(pcmi->icp))(pvData);
|
|
}
|
|
else
|
|
ERROR_OUT(("ContextMenu(): Command %d not found.",
|
|
nCmd));
|
|
}
|
|
|
|
DestroyMenu(hmenuContext);
|
|
hmenuContext = NULL;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE BOOL GetBackgroundImageIndex(PCMWIN pcmwin,
|
|
PINT pniBackgroundImage)
|
|
{
|
|
BOOL bResult;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcmwin, CMWIN));
|
|
ASSERT(IS_VALID_WRITE_PTR(pniBackgroundImage, INT));
|
|
|
|
bResult = (EVAL(pcmwin != NULL) &&
|
|
pcmwin->w3doc != NULL &&
|
|
pcmwin->w3doc->nBackgroundImageElement != -1 &&
|
|
ElementIsValidImage(&(pcmwin->w3doc->aElements[pcmwin->w3doc->nBackgroundImageElement])));
|
|
|
|
*pniBackgroundImage = bResult ? pcmwin->w3doc->nBackgroundImageElement : -1;
|
|
|
|
if (bResult)
|
|
TRACE_OUT(("GetBackgroundImageIndex(): Page background image is element %d.",
|
|
*pniBackgroundImage));
|
|
else
|
|
TRACE_OUT(("GetBackgroundImageIndex(): Page does not have a background image."));
|
|
|
|
ASSERT((bResult &&
|
|
EVAL(*pniBackgroundImage >= 0)) ||
|
|
(! bResult &&
|
|
EVAL(*pniBackgroundImage == -1)));
|
|
|
|
return(bResult);
|
|
}
|
|
|
|
|
|
PRIVATE_CODE DWORD GetPageContextMenuFlags(PCMWIN pcmwin)
|
|
{
|
|
DWORD dwFlags;
|
|
int niBackgroundImage;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcmwin, CMWIN));
|
|
|
|
dwFlags = CM_CMD_FL_ALL;
|
|
|
|
if (GetBackgroundImageIndex(pcmwin, &niBackgroundImage))
|
|
SET_FLAG(dwFlags, CM_CMD_FL_BACKGROUND_IMAGE);
|
|
|
|
if (HasHTMLSource(pcmwin))
|
|
SET_FLAG(dwFlags, CM_CMD_FL_HAS_HTML_SOURCE);
|
|
|
|
#ifdef FEATURE_CONT_FORBACK
|
|
if (HasBackPages(pcmwin))
|
|
SET_FLAG(dwFlags, CM_CMD_FL_BACK);
|
|
|
|
if (HasFwdPages(pcmwin))
|
|
SET_FLAG(dwFlags, CM_CMD_FL_FWD);
|
|
#endif
|
|
|
|
TRACE_OUT(("GetPageContextMenuFlags(): Page context menu flags are %#08lx.",
|
|
dwFlags));
|
|
|
|
ASSERT(FLAGS_ARE_VALID(dwFlags, ALL_CM_CMD_FLAGS));
|
|
|
|
return(dwFlags);
|
|
}
|
|
|
|
|
|
PRIVATE_CODE DWORD GetElementContextMenuFlags(PCMWIN pcmwin, int iElem)
|
|
{
|
|
DWORD dwFlags;
|
|
PCELEMENT pcelem;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcmwin, CMWIN));
|
|
ASSERT(IsValidElementIndex(pcmwin, iElem));
|
|
|
|
pcelem = &(pcmwin->w3doc->aElements[iElem]);
|
|
|
|
dwFlags = GetPageContextMenuFlags(pcmwin);
|
|
|
|
SET_FLAG(dwFlags, IS_FLAG_SET(pcelem->lFlags, ELEFLAG_ANCHOR)
|
|
? CM_CMD_FL_LINK_ONLY
|
|
: CM_CMD_FL_NOT_LINK);
|
|
|
|
if ( MCI_IS_LOADED(pcelem->pmo) )
|
|
{
|
|
SET_FLAG(dwFlags,
|
|
IS_FLAG_SET(pcelem->pmo->dwFlags, MCI_OBJECT_FLAGS_PLAYING)
|
|
? CM_CMD_FL_AVI_PLAYING_ONLY
|
|
: CM_CMD_FL_AVI_STOPPED_ONLY);
|
|
}
|
|
else
|
|
{
|
|
SET_FLAG(dwFlags,
|
|
CM_CMD_FL_NO_AVIS );
|
|
}
|
|
|
|
TRACE_OUT(("GetElementContextMenuFlags(): Element %d context menu flags are %#08lx.",
|
|
iElem,
|
|
dwFlags));
|
|
|
|
ASSERT(FLAGS_ARE_VALID(dwFlags, ALL_CM_CMD_FLAGS));
|
|
|
|
return(dwFlags);
|
|
}
|
|
|
|
|
|
PRIVATE_CODE DWORD GetSelectionContextMenuFlags(PCMWIN pcmwin)
|
|
{
|
|
DWORD dwFlags;
|
|
|
|
/* GetPageContextMenuFlags() will perform input and output validation. */
|
|
|
|
dwFlags = GetPageContextMenuFlags(pcmwin);
|
|
|
|
TRACE_OUT(("GetSelectionContextMenuFlags(): Selection context menu flags are %#08lx.",
|
|
dwFlags));
|
|
|
|
return(dwFlags);
|
|
}
|
|
|
|
|
|
PRIVATE_CODE BOOL SetWallpaperLayout(WALLPAPER_LOOK wplk)
|
|
{
|
|
BOOL bResult;
|
|
BOOL bUpdate;
|
|
char szTiled[2];
|
|
|
|
ASSERT(IsValidWallpaperLook(wplk));
|
|
|
|
switch (wplk)
|
|
{
|
|
case WPLK_TILED:
|
|
bUpdate = TRUE;
|
|
lstrcpy(szTiled, s_cszOne);
|
|
break;
|
|
|
|
case WPLK_CENTERED:
|
|
bUpdate = TRUE;
|
|
lstrcpy(szTiled, s_cszZero);
|
|
break;
|
|
|
|
default:
|
|
ASSERT(wplk == WPLK_AS_IS);
|
|
bUpdate = FALSE;
|
|
*szTiled = '\0';
|
|
break;
|
|
}
|
|
|
|
ASSERT(IS_VALID_STRING_PTR(szTiled, STR));
|
|
ASSERT(lstrlen(szTiled) < sizeof(szTiled));
|
|
|
|
bResult = bUpdate ? (SetRegKeyValue(HKEY_CURRENT_USER, s_cszDesktopSubkey,
|
|
s_cszTileWallpaper, REG_SZ, szTiled,
|
|
lstrlen(szTiled) + 1) == ERROR_SUCCESS)
|
|
: TRUE;
|
|
|
|
#ifdef DEBUG
|
|
|
|
switch (wplk)
|
|
{
|
|
case WPLK_TILED:
|
|
TRACE_OUT(("SetWallpaperLayout(): %s desktop wallpaper.",
|
|
bResult ? "Tiled" : "Failed to tile"));
|
|
break;
|
|
|
|
case WPLK_CENTERED:
|
|
TRACE_OUT(("SetWallpaperLayout(): %s desktop wallpaper.",
|
|
bResult ? "Centered" : "Failed to center"));
|
|
break;
|
|
|
|
default:
|
|
ASSERT(wplk == WPLK_AS_IS);
|
|
ASSERT(bResult);
|
|
TRACE_OUT(("SetWallpaperLayout(): Left wallpaper layout as is."));
|
|
break;
|
|
}
|
|
|
|
#endif
|
|
|
|
return(bResult);
|
|
}
|
|
|
|
|
|
PRIVATE_CODE BOOL SaveWallpaperImage(PMWIN pmwin, int iElem)
|
|
{
|
|
BOOL bResult = FALSE;
|
|
PCELEMENT pcelem;
|
|
char szPath[MAX_PATH_LEN];
|
|
UINT ucbLen;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pmwin, CMWIN));
|
|
ASSERT(IsValidElementIndex(pmwin, iElem));
|
|
|
|
pcelem = &(pmwin->w3doc->aElements[iElem]);
|
|
ASSERT(pcelem->type == ELE_IMAGE ||
|
|
pcelem->type == ELE_FORMIMAGE);
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcelem->myImage, CImageInfo));
|
|
ASSERT(IS_VALID_STRING_PTR(pcelem->myImage->actualURL, CSTR) &&
|
|
EVAL(*(pcelem->myImage->actualURL)));
|
|
|
|
ucbLen = GetWindowsDirectory(szPath, sizeof(szPath));
|
|
|
|
if (ucbLen > 0 &&
|
|
ucbLen < sizeof(szPath))
|
|
{
|
|
char szName[MAX_PATH_LEN];
|
|
#ifdef DAYTONA_BUILD
|
|
if (OnNT351)
|
|
bResult = LoadString(wg.hInstance, RES_STRING_WALLPAPER_BMP_SHORT_NAME,
|
|
szName, sizeof(szName));
|
|
else
|
|
bResult = LoadString(wg.hInstance, IsLFNDrive(szPath) ? RES_STRING_WALLPAPER_BMP_LONG_NAME
|
|
: RES_STRING_WALLPAPER_BMP_SHORT_NAME,
|
|
szName, sizeof(szName));
|
|
if (bResult)
|
|
#else
|
|
if (LoadString(wg.hInstance, IsLFNDrive(szPath) ? RES_STRING_WALLPAPER_BMP_LONG_NAME
|
|
: RES_STRING_WALLPAPER_BMP_SHORT_NAME,
|
|
szName, sizeof(szName)))
|
|
#endif
|
|
{
|
|
/* (+ 1) for possible path separator. */
|
|
if (lstrlen(szPath) + 1 + lstrlen(szName) < sizeof(szPath))
|
|
{
|
|
CatPath(szPath, szName);
|
|
|
|
/*
|
|
* BUGBUG: (DavidDi 4/10/95) Viewer_SaveAsBitmap() should return a
|
|
* value indicating success or failure.
|
|
*/
|
|
Viewer_SaveAsBitmap(szPath, pcelem->myImage, pmwin);
|
|
|
|
bResult = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, szPath,
|
|
(SPIF_UPDATEINIFILE |
|
|
SPIF_SENDWININICHANGE));
|
|
}
|
|
}
|
|
}
|
|
|
|
if (bResult)
|
|
TRACE_OUT(("SaveWallpaperImage(): Set desktop wallpaper to %s.",
|
|
szPath));
|
|
else
|
|
WARNING_OUT(("SaveWallpaperImage(): Failed to set desktop wallpaper."));
|
|
|
|
return(bResult);
|
|
}
|
|
|
|
|
|
PRIVATE_CODE BOOL SetWallpaperFromElement(PMWIN pmwin, int iElem,
|
|
WALLPAPER_LOOK wplk)
|
|
{
|
|
ASSERT(IS_VALID_STRUCT_PTR(pmwin, CMWIN));
|
|
ASSERT(IsValidElementIndex(pmwin, iElem));
|
|
ASSERT(IsValidWallpaperLook(wplk));
|
|
|
|
/* Write out desktop wallpaper layout before changing it. */
|
|
|
|
return(SetWallpaperLayout(wplk) &&
|
|
SaveWallpaperImage(pmwin, iElem));
|
|
}
|
|
|
|
#ifdef FEATURE_CONT_FORBACK
|
|
PRIVATE_CODE void Page_GoBack(PMWIN pvmwin)
|
|
{
|
|
HWND hWnd;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pvmwin, CMWIN));
|
|
|
|
if (pvmwin->hdc == NULL)
|
|
hWnd=pvmwin->win;
|
|
else if (pvmwin->hWndStatusBar == 0xffffffff)
|
|
hWnd = pvmwin->gwc.hWnd;
|
|
else
|
|
hWnd=pvmwin->hWndProgress;
|
|
|
|
ASSERT(IS_VALID_HANDLE(hWnd, WND));
|
|
|
|
PostMessage( hWnd, WM_COMMAND, (WPARAM)RES_MENU_ITEM_BACK, (LPARAM) 0 );
|
|
|
|
return;
|
|
}
|
|
|
|
PRIVATE_CODE void Page_GoForward(PMWIN pvmwin)
|
|
{
|
|
HWND hWnd;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pvmwin, CMWIN));
|
|
if (pvmwin->hdc == NULL)
|
|
hWnd=pvmwin->win;
|
|
else if (pvmwin->hWndStatusBar == 0xffffffff)
|
|
hWnd = pvmwin->gwc.hWnd;
|
|
else
|
|
hWnd=pvmwin->hWndProgress;
|
|
|
|
ASSERT(IS_VALID_HANDLE(hWnd, WND));
|
|
|
|
PostMessage(hWnd, WM_COMMAND, (WPARAM)RES_MENU_ITEM_FORWARD, (LPARAM) 0 );
|
|
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
PRIVATE_CODE void Page_SaveBackgroundAs(PVOID pvmwin)
|
|
{
|
|
int niBackgroundImage;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pvmwin, CMWIN));
|
|
|
|
if (EVAL(GetBackgroundImageIndex(pvmwin, &niBackgroundImage)))
|
|
SaveElementAsImage(pvmwin, niBackgroundImage, NULL, 0, 0);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void Page_CopyBackground(PVOID pvmwin)
|
|
{
|
|
ELEMINFO eleminfo;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pvmwin, CMWIN));
|
|
|
|
if (EVAL(GetBackgroundImageIndex(pvmwin, &(eleminfo.iElem))))
|
|
{
|
|
eleminfo.pmwin = pvmwin;
|
|
|
|
Image_Copy(&eleminfo);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void Page_SelectAll(PVOID pvmwin)
|
|
{
|
|
ASSERT(IS_VALID_STRUCT_PTR(pvmwin, CMWIN));
|
|
|
|
SelectAll(pvmwin);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void Page_ViewSource(PVOID pvmwin)
|
|
{
|
|
PCMWIN pcmwin;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pvmwin, CMWIN));
|
|
|
|
pcmwin = pvmwin;
|
|
|
|
if (pcmwin->w3doc &&
|
|
pcmwin->w3doc->source &&
|
|
CS_GetLength(pcmwin->w3doc->source) > 0)
|
|
ViewHTMLSource(pcmwin->w3doc->szActualURL,
|
|
CS_GetPool(pcmwin->w3doc->source));
|
|
else
|
|
WARNING_OUT(("Page_ViewSource(): No HTML source for page."));
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void Page_SetBackgroundWallpaper(PVOID pvmwin)
|
|
{
|
|
int niBackgroundImage;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pvmwin, CMWIN));
|
|
|
|
if (EVAL(GetBackgroundImageIndex(pvmwin, &niBackgroundImage)))
|
|
/* Ignore return value. */
|
|
SetWallpaperFromElement(pvmwin, niBackgroundImage, WPLK_TILED);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void Page_CreateShortcut(PVOID pvmwin)
|
|
{
|
|
ASSERT(IS_VALID_STRUCT_PTR(pvmwin, CMWIN));
|
|
|
|
CreateLink(pvmwin);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void Page_AddToFavorites(PVOID pvmwin)
|
|
{
|
|
ASSERT(IS_VALID_STRUCT_PTR(pvmwin, CMWIN));
|
|
|
|
AddPageToHotList(pvmwin);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void Link_Open(PVOID pcveleminfo)
|
|
{
|
|
PCELEMINFO pceleminfo;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcveleminfo, CELEMINFO));
|
|
|
|
pceleminfo = pcveleminfo;
|
|
|
|
/* Ignore return value. */
|
|
OpenLink(pceleminfo->pmwin, pceleminfo->iElem, 0);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void Link_OpenNewWindow(PVOID pcveleminfo)
|
|
{
|
|
PCELEMINFO pceleminfo;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcveleminfo, CELEMINFO));
|
|
|
|
pceleminfo = pcveleminfo;
|
|
|
|
/* Ignore return value. */
|
|
OpenLink(pceleminfo->pmwin, pceleminfo->iElem, OPENLINK_FL_NEW_WINDOW);
|
|
|
|
return;
|
|
}
|
|
|
|
PRIVATE_CODE void Link_SaveAs(PVOID pcveleminfo)
|
|
{
|
|
PCELEMINFO pceleminfo;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcveleminfo, CELEMINFO));
|
|
|
|
pceleminfo = pcveleminfo;
|
|
|
|
/* Ignore return value. */
|
|
SaveElementAsAnything(pceleminfo->pmwin, pceleminfo->iElem);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void Link_Copy(PVOID pcveleminfo)
|
|
{
|
|
PCELEMINFO pceleminfo;
|
|
HRESULT hr;
|
|
PIDataObject pidoLink;
|
|
DWORD dwAvailEffects;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcveleminfo, CELEMINFO));
|
|
|
|
pceleminfo = pcveleminfo;
|
|
|
|
hr = CreateLinkDataObject(pceleminfo->pmwin, pceleminfo->iElem, &pidoLink,
|
|
&dwAvailEffects);
|
|
|
|
if (hr == S_OK)
|
|
{
|
|
hr = OleSetClipboard(pidoLink);
|
|
|
|
if (hr == S_OK)
|
|
hr = OleFlushClipboard();
|
|
|
|
pidoLink->lpVtbl->Release(pidoLink);
|
|
pidoLink = NULL;
|
|
}
|
|
|
|
if (hr == S_OK)
|
|
TRACE_OUT(("Link_Copy(): Copied link to clipboard."));
|
|
else
|
|
WARNING_OUT(("Link_Copy(): Failed to copy link to clipboard."));
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void Link_AddToFavorites(PVOID pcveleminfo)
|
|
{
|
|
PCELEMINFO pceleminfo;
|
|
PSTR pszURL;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcveleminfo, CELEMINFO));
|
|
|
|
pceleminfo = pcveleminfo;
|
|
|
|
if (GetURLFromHREF(pceleminfo->pmwin, pceleminfo->iElem, &pszURL) == S_OK)
|
|
{
|
|
PSTR pszName;
|
|
|
|
if (GetElementText(pceleminfo->pmwin, pceleminfo->iElem, &pszName)
|
|
== S_OK)
|
|
{
|
|
if (! HotList_Add(pszName, pszURL))
|
|
ERR_ReportError(pceleminfo->pmwin, errHotListItemNotAdded, NULL,
|
|
NULL);
|
|
|
|
GTR_FREE(pszName);
|
|
pszName = NULL;
|
|
}
|
|
|
|
GTR_FREE(pszURL);
|
|
pszURL = NULL;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void ImagePlaceholder_Show(PVOID pcveleminfo)
|
|
{
|
|
PCELEMINFO pceleminfo;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcveleminfo, CELEMINFO));
|
|
|
|
pceleminfo = pcveleminfo;
|
|
|
|
/* Ignore return value. */
|
|
LoadImageFromPlaceholder(pceleminfo->pmwin, pceleminfo->iElem);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void Avi_Stop(PVOID pcveleminfo)
|
|
{
|
|
PCELEMINFO pceleminfo;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcveleminfo, CELEMINFO));
|
|
|
|
pceleminfo = pcveleminfo;
|
|
|
|
// fail this call if any of the all important structures mysterously
|
|
// go away
|
|
if ( !pceleminfo->pmwin || !pceleminfo->pmwin->w3doc ||
|
|
! pceleminfo->pmwin->w3doc->aElements[pceleminfo->iElem].pmo )
|
|
return;
|
|
|
|
|
|
pceleminfo->pmwin->w3doc->aElements[pceleminfo->iElem].pmo->dwFlags &= ~(MCI_OBJECT_FLAGS_PLAYING);
|
|
MCIWndPause( pceleminfo->pmwin->w3doc->aElements[pceleminfo->iElem].pmo->hwnd );
|
|
|
|
}
|
|
|
|
PRIVATE_CODE void Avi_Play(PVOID pcveleminfo)
|
|
{
|
|
PCELEMINFO pceleminfo;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcveleminfo, CELEMINFO));
|
|
|
|
pceleminfo = pcveleminfo;
|
|
|
|
// fail this call if any of the all important structures mysterously
|
|
// go away
|
|
if ( !pceleminfo->pmwin || !pceleminfo->pmwin->w3doc ||
|
|
! pceleminfo->pmwin->w3doc->aElements[pceleminfo->iElem].pmo )
|
|
return;
|
|
|
|
pceleminfo->pmwin->w3doc->aElements[pceleminfo->iElem].pmo->dwFlags |= MCI_OBJECT_FLAGS_PLAYING;
|
|
MCIWndPlay( pceleminfo->pmwin->w3doc->aElements[pceleminfo->iElem].pmo->hwnd );
|
|
}
|
|
|
|
|
|
|
|
PRIVATE_CODE void Image_Copy(PVOID pcveleminfo)
|
|
{
|
|
HRESULT hr;
|
|
PCELEMINFO pceleminfo;
|
|
struct _element *pel;
|
|
PIDataObject pidoImage;
|
|
DWORD dwAvailEffects;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcveleminfo, CELEMINFO));
|
|
|
|
pceleminfo = pcveleminfo;
|
|
|
|
ASSERT(pceleminfo->pmwin);
|
|
ASSERT(pceleminfo->pmwin->w3doc);
|
|
|
|
// if its an AVI thats playing, then it will do its own copying
|
|
pel = &(pceleminfo->pmwin->w3doc->aElements[pceleminfo->iElem]);
|
|
if ( pel && pel->pmo && MCI_IS_LOADED(pel->pmo) )
|
|
{
|
|
SendMessage(pel->pmo->hwnd, WM_COMMAND, MCI_IDM_COPY, 0L );
|
|
return;
|
|
}
|
|
|
|
hr = CreateElementDataObject(pceleminfo->pmwin, pceleminfo->iElem,
|
|
&pidoImage, &dwAvailEffects);
|
|
|
|
if (hr == S_OK)
|
|
{
|
|
hr = SetClipboardDataFromDataObject(pceleminfo->pmwin->win, pidoImage);
|
|
|
|
pidoImage->lpVtbl->Release(pidoImage);
|
|
pidoImage = NULL;
|
|
}
|
|
|
|
if (hr == S_OK)
|
|
TRACE_OUT(("Image_Copy(): Copied image to clipboard."));
|
|
else
|
|
WARNING_OUT(("Image_Copy(): Failed to copy image to clipboard."));
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void Image_SaveAs(PVOID pcveleminfo)
|
|
{
|
|
PCELEMINFO pceleminfo;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcveleminfo, CELEMINFO));
|
|
|
|
pceleminfo = pcveleminfo;
|
|
|
|
/* Ignore return value. */
|
|
SaveElementAsImage(pceleminfo->pmwin, pceleminfo->iElem, NULL, 0, 0);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void Image_SetWallpaper(PVOID pcveleminfo)
|
|
{
|
|
PCELEMINFO pceleminfo;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcveleminfo, CELEMINFO));
|
|
|
|
pceleminfo = pcveleminfo;
|
|
|
|
/* Ignore return value. */
|
|
SetWallpaperFromElement(pceleminfo->pmwin, pceleminfo->iElem, WPLK_AS_IS);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PRIVATE_CODE void Selection_Copy(PVOID pvmwin)
|
|
{
|
|
HRESULT hr;
|
|
PMWIN pmwin;
|
|
PIDataObject pidoSelection;
|
|
DWORD dwAvailEffects;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pvmwin, CMWIN));
|
|
|
|
pmwin = pvmwin;
|
|
|
|
hr = CreateSelectionDataObject(pmwin, &pidoSelection, &dwAvailEffects);
|
|
|
|
if (hr == S_OK)
|
|
{
|
|
hr = SetClipboardDataFromDataObject(pmwin->win, pidoSelection);
|
|
|
|
pidoSelection->lpVtbl->Release(pidoSelection);
|
|
pidoSelection = NULL;
|
|
}
|
|
|
|
if (hr == S_OK)
|
|
TRACE_OUT(("Selection_Copy(): Copied selection to clipboard."));
|
|
else
|
|
WARNING_OUT(("Selection_Copy(): Failed to copy selection to clipboard."));
|
|
|
|
return;
|
|
}
|
|
|
|
PRIVATE_CODE void Page_Properties(PVOID pvmwin){
|
|
PMWIN tw;
|
|
void *ppsv;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pvmwin, CMWIN));
|
|
|
|
tw = pvmwin;
|
|
|
|
if (tw && tw->w3doc) {
|
|
ppsv = MakePropSheetVars(tw->w3doc->szActualURL, tw->w3doc->title, tw->w3doc->pCert, tw->w3doc->nCert, FALSE, TRUE);
|
|
PropertiesSheetDlg( tw, ppsv);
|
|
}
|
|
}
|
|
|
|
PRIVATE_CODE void Link_Properties(PVOID pcveleminfo)
|
|
{
|
|
PCELEMINFO pceleminfo;
|
|
PSTR pszURL;
|
|
void *ppsv;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcveleminfo, CELEMINFO));
|
|
|
|
pceleminfo = pcveleminfo;
|
|
|
|
if (GetURLFromHREF(pceleminfo->pmwin, pceleminfo->iElem, &pszURL) == S_OK){
|
|
ppsv = MakePropSheetVars(pszURL, NULL, NULL, 0, TRUE, FALSE);
|
|
PropertiesSheetDlg( pceleminfo->pmwin, ppsv);
|
|
}
|
|
}
|
|
|
|
PRIVATE_CODE void Image_Properties(PVOID pcveleminfo)
|
|
{
|
|
PCELEMINFO pceleminfo;
|
|
char *pURL;
|
|
PropSheetVars *ppsv;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcveleminfo, CELEMINFO));
|
|
pceleminfo = pcveleminfo;
|
|
|
|
ASSERT(pceleminfo->pmwin->w3doc);
|
|
|
|
/* Ignore return value. */
|
|
pURL = BLOB_IS_LOADED(pceleminfo->pmwin->w3doc->aElements[pceleminfo->iElem].pblob) ?
|
|
pceleminfo->pmwin->w3doc->aElements[pceleminfo->iElem].pblob->szURL :
|
|
pceleminfo->pmwin->w3doc->aElements[pceleminfo->iElem].myImage->actualURL;
|
|
ppsv = ( PropSheetVars * ) MakePropSheetVars(pURL, NULL, NULL, 0, FALSE, FALSE);
|
|
#ifdef FEATURE_VRML
|
|
if ( ppsv && pceleminfo->pmwin->w3doc->aElements[pceleminfo->iElem].pVrml )
|
|
{
|
|
ppsv->dwFlags |= PROP_SHEET_VARS_FLAGS_USE_VRML_SHEET;
|
|
}
|
|
#endif
|
|
PropertiesSheetDlg( pceleminfo->pmwin, (void *) ppsv);
|
|
}
|
|
|
|
|
|
|
|
/****************************** Public Functions *****************************/
|
|
|
|
PUBLIC_CODE BOOL HasHTMLSource(PCMWIN pcmwin)
|
|
{
|
|
BOOL bResult;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcmwin, CMWIN));
|
|
|
|
bResult = (EVAL(pcmwin != NULL) &&
|
|
pcmwin->w3doc != NULL &&
|
|
pcmwin->w3doc->source != NULL &&
|
|
CS_GetLength(pcmwin->w3doc->source) > 0);
|
|
|
|
TRACE_OUT(("HasHTMLSource(): Page %s HTML source.",
|
|
bResult ? "has" : "does not have"));
|
|
|
|
return(bResult);
|
|
}
|
|
|
|
#ifdef FEATURE_CONT_FORBACK
|
|
PRIVATE_CODE BOOL HasBackPages(PCMWIN pcmwin)
|
|
{
|
|
BOOL bResult;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcmwin, CMWIN));
|
|
|
|
bResult = (EVAL(pcmwin != NULL) &&
|
|
HTList_count(pcmwin->history) > (pcmwin->history_index + 1));
|
|
|
|
TRACE_OUT(("HasBackPages(): Page %s back pages.",
|
|
bResult ? "has" : "does not have"));
|
|
|
|
return(bResult);
|
|
}
|
|
|
|
PRIVATE_CODE BOOL HasFwdPages(PCMWIN pcmwin)
|
|
{
|
|
BOOL bResult;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pcmwin, CMWIN));
|
|
|
|
bResult = (EVAL(pcmwin != NULL) &&
|
|
pcmwin->history_index > 0);
|
|
|
|
TRACE_OUT(("HasFwdPages(): Page %s forward pages.",
|
|
bResult ? "has" : "does not have"));
|
|
|
|
return(bResult);
|
|
}
|
|
|
|
#endif // FEATURE_CONT_FORBACK
|
|
|
|
#ifdef DEBUG
|
|
|
|
PUBLIC_CODE BOOL IsValidPCELEMINFO(PCELEMINFO pceleminfo)
|
|
{
|
|
return(IS_VALID_READ_PTR(pceleminfo, CELEMINFO) &&
|
|
IS_VALID_STRUCT_PTR(pceleminfo->pmwin, CMWIN) &&
|
|
EVAL(IsValidElementIndex(pceleminfo->pmwin, pceleminfo->iElem)));
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
PUBLIC_CODE void PageContextMenu(PMWIN pmwin, int xScreen, int yScreen)
|
|
{
|
|
ASSERT(IS_VALID_STRUCT_PTR(pmwin, CMWIN));
|
|
ASSERT(IsValidScreenX(xScreen));
|
|
ASSERT(IsValidScreenY(yScreen));
|
|
|
|
ContextMenu(pmwin->hWndFrame, &s_ccmPage, GetPageContextMenuFlags(pmwin),
|
|
xScreen, yScreen, pmwin);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PUBLIC_CODE void ElementContextMenu(PMWIN pmwin, int iElem, int xScreen,
|
|
int yScreen)
|
|
{
|
|
PCELEMENT pcelem;
|
|
PCCONTEXTMENU pccm;
|
|
|
|
ASSERT(IS_VALID_STRUCT_PTR(pmwin, CMWIN));
|
|
ASSERT(IsValidElementIndex(pmwin, iElem));
|
|
ASSERT(IsValidScreenX(xScreen));
|
|
ASSERT(IsValidScreenY(yScreen));
|
|
|
|
pcelem = &(pmwin->w3doc->aElements[iElem]);
|
|
|
|
if (GetContextMenuFromElement(pcelem, &pccm))
|
|
{
|
|
ELEMINFO eleminfo;
|
|
|
|
eleminfo.pmwin = pmwin;
|
|
eleminfo.iElem = iElem;
|
|
|
|
ContextMenu(pmwin->hWndFrame, pccm,
|
|
GetElementContextMenuFlags(pmwin, iElem), xScreen, yScreen,
|
|
&eleminfo);
|
|
}
|
|
else
|
|
PageContextMenu(pmwin, xScreen, yScreen);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
PUBLIC_CODE void SelectionContextMenu(PMWIN pmwin, int xScreen, int yScreen)
|
|
{
|
|
ASSERT(IS_VALID_STRUCT_PTR(pmwin, CMWIN));
|
|
ASSERT(IsValidScreenX(xScreen));
|
|
ASSERT(IsValidScreenY(yScreen));
|
|
|
|
ContextMenu(pmwin->hWndFrame, &s_ccmSelection,
|
|
GetSelectionContextMenuFlags(pmwin), xScreen, yScreen, pmwin);
|
|
|
|
return;
|
|
}
|
|
|