Windows NT 4.0 source code leak
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

/*
* 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;
}