зеркало из https://github.com/mozilla/gecko-dev.git
230 строки
8.3 KiB
C++
Executable File
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 */
|