home *** CD-ROM | disk | FTP | other *** search
- /* -*- 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 */
-