gecko-dev/cmd/winfe/feimages.cpp

230 строки
8.3 KiB
C++
Executable File

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "stdafx.h"
#include "edt.h"
#include "prefapi.h"
// Structures
//
// Yea I know pImageURL has no size!
// Image strings are dynamically allocated starting there
typedef struct _FE_CopyImageData {
int iSize; // size of all data, including variable length strings
Bool bIsMap; // For server side maps
int32 iWidth; // Fixed size data correspond to fields in LO_ImageDataStruct
int32 iHeight; // and EDT_ImageData
int32 iHSpace;
int32 iVSpace;
int32 iBorder;
int iLowResOffset; // Offsets into string_data. If 0, string is NULL (not used)
int iAltOffset;
int iAnchorOffset; // HREF in image
int iExtraHTML_Offset; // Extra HTML (stored in CImageElement)
#pragma warning( disable: 4200)
char pImageURL[]; // Append all variable-length strings starting here
#pragma warning( default: 4200)
} FE_CopyImageData;
// TODO: Should we include other image_attr fields? (e.g.: alignment, attrmask)
void FE_ShiftImage(MWContext *context, LO_ImageStruct *lo_image) {
}
// free the mem using correct conditional call
inline void fe_PtrFreeBits(void XP_HUGE *pBits)
{
if (pBits) {
#ifdef XP_WIN16
_hfree(pBits);
#else
free(pBits);
#endif
}
}
// Dragged Image can only be dropped in Composer
#ifdef EDITOR
// Fill our structure with data about an image
// for drag n drop and copying to clipboard
HGLOBAL WFE_CreateCopyImageData(MWContext *pMWContext, LO_ImageStruct *pImage)
{
if( pMWContext == NULL ||
pImage == NULL ||
pImage->image_url == NULL) {
return NULL;
}
char *pImageURL = NULL;
char *pExtraHTML = EDT_GetExtraHTML_FromImage(pImage);
// Lifted from GetImageHref() in POPUP.CPP:
// Check for that funky internal-external-reconnect jazz.
char *pReconnect = "internal-external-reconnect:";
// Don't use anything else that starts with this:
// TODO: CHANGE THIS TO TEST FOR pImage->bIsInternalImage AFTER lloyd IMPLEMENTS THAT
char *pInternal = "internal-";
if(strncmp((const char *)pImage->image_url, pReconnect, 28) == 0) {
// Need to take the URL off the history.
//MWContext *pContext = GetContext()->GetContext();
History_entry *pHistEnt = SHIST_GetCurrent(&pMWContext->hist);
if ( pHistEnt && pHistEnt->address ){
pImageURL = pHistEnt->address;
}
}
else if(strncmp((const char *)pImage->image_url, pInternal, 9) == 0) {
return NULL;
} else {
pImageURL = (char *)pImage->image_url;
}
if(pImageURL && XP_STRLEN(pImageURL) > 0) {
// We have an URL, the most important part,
// but save all the data in our drag structure
int iLowResOffset = 0;
int iAltOffset = 0;
int iAnchorOffset = 0;
int iExtraHTML_Offset = 0;
// First calculate allocation size and offsets for the strings
// Offset to pImageURL = 1 past end of struct size,
// so offset to next string is 1 past the '\0' of pImageURL
int iOffset = sizeof( FE_CopyImageData ) + XP_STRLEN(pImageURL) + 2;
if ( pImage->lowres_image_url ){
iLowResOffset = iOffset;
// Add size of string + 1 for '\0'
iOffset += XP_STRLEN((char*)pImage->lowres_image_url) + 1;
}
if ( pImage->alt ){
iAltOffset = iOffset;
iOffset += XP_STRLEN((char*)pImage->alt) + 1;
}
if ( pImage->anchor_href ){
if ( pImage->anchor_href->anchor ){
iAnchorOffset = iOffset;
iOffset += XP_STRLEN((char*)pImage->anchor_href->anchor) + 1;
}
}
if ( pExtraHTML ){
// Get Extra HTML if it exists
iExtraHTML_Offset = iOffset;
iOffset += XP_STRLEN(pExtraHTML) + 1;
}
// Total size = last offset calculated + extra '\0'
int iDataSize = iOffset + 1;
// Clipboard data should have GMEM_MOVEABLE,
// and it should be OK for drag and drop too?
HGLOBAL hImageData = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE | GMEM_ZEROINIT, iDataSize);
if(hImageData){
FE_CopyImageData * pDragData = (FE_CopyImageData*)GlobalLock(hImageData);
// Not used, but its good form to include size of all data
pDragData->iSize = iDataSize;
pDragData->iWidth = pImage->width;
pDragData->iHeight = pImage->height;
pDragData->iHSpace = pImage->border_horiz_space;
pDragData->iVSpace = pImage->border_vert_space;
pDragData->iBorder = pImage->border_width;
XP_STRCPY(pDragData->pImageURL, pImageURL);
if ( pImage->image_attr && (pImage->image_attr->attrmask & LO_ATTR_ISMAP) ){
pDragData->bIsMap = TRUE;
}
if (iLowResOffset){
pDragData->iLowResOffset = iLowResOffset;
XP_STRCPY( ((char*)pDragData)+iLowResOffset,
(char*)pImage->lowres_image_url );
}
if (iAltOffset){
pDragData->iAltOffset = iAltOffset;
XP_STRCPY( ((char*)pDragData)+iAltOffset,
(char*)pImage->alt );
}
if (iAnchorOffset){
pDragData->iAnchorOffset = iAnchorOffset;
XP_STRCPY( ((char*)pDragData)+iAnchorOffset,
(char*)pImage->anchor_href->anchor);
}
if (iExtraHTML_Offset){
pDragData->iExtraHTML_Offset = iExtraHTML_Offset;
XP_STRCPY( ((char*)pDragData)+iExtraHTML_Offset, pExtraHTML );
// Done with string - release it
XP_FREE(pExtraHTML);
}
GlobalUnlock(hImageData);
return hImageData;
}
}
return NULL;
}
void WFE_DragDropImage(HGLOBAL h, MWContext *pMWContext)
{
if( h ){
FE_CopyImageData* pDragData = (FE_CopyImageData*) GlobalLock( h );
if ( pDragData && XP_STRLEN(pDragData->pImageURL) > 0 ){
EDT_ImageData* pEdtData = EDT_NewImageData();
// Get the fixed-size data
pEdtData->bIsMap = pDragData->bIsMap;
pEdtData->iWidth = pDragData->iWidth;
pEdtData->iHeight = pDragData->iHeight;
pEdtData->iHSpace = pDragData->iHSpace;
pEdtData->iVSpace = pDragData->iVSpace;
pEdtData->iBorder = pDragData->iBorder;
// Kludge: Sitemanager gives us D:/foo/bar
// so convert to URL
CString csURL;
WFE_ConvertFile2Url(csURL, pDragData->pImageURL);
pEdtData->pSrc = XP_STRDUP(csURL);
// Get variable-allocated strings
if ( pDragData->iLowResOffset ){
pEdtData->pLowSrc =
XP_STRDUP(((char*)pDragData)+pDragData->iLowResOffset);
}
if ( pDragData->iAltOffset ){
pEdtData->pAlt = XP_STRDUP(((char*)pDragData)+pDragData->iAltOffset);
}
if ( pDragData->iAnchorOffset ){
}
if ( pDragData->iExtraHTML_Offset ){
pEdtData->pExtra =
XP_STRDUP(((char*)pDragData)+pDragData->iExtraHTML_Offset);
// HARDTS: USEMAP data is now in pExtra, fix for bug 73283
}
int bKeepImages;
PREF_GetBoolPref("editor.publish_keep_images",&bKeepImages);
EDT_InsertImage(pMWContext, pEdtData,bKeepImages);
EDT_FreeImageData(pEdtData);
}
GlobalUnlock( h );
}
}
#endif /* EDITOR */