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.
3205 lines
98 KiB
3205 lines
98 KiB
#include "stdafx.h"
|
|
extern "C" {
|
|
#include <oidisp.h>
|
|
#include <oiadm.h>
|
|
#include <oifile.h>
|
|
#include <oiui.h>
|
|
#include <oierror.h>
|
|
}
|
|
#include <ocximage.h>
|
|
#include <image.h>
|
|
#include "disphids.h"
|
|
#include "toolpal.h"
|
|
#include "minitlbx.h"
|
|
#include "imgedit.h"
|
|
#include "imgedctl.h"
|
|
#include "imgedppg.h"
|
|
#include "norermap.h"
|
|
|
|
// 9604.30 paj needed for NT Bug6368
|
|
extern int MakeUnicodeString(LPTSTR AnsiInString, LPOLESTR *lpUniOutString, int * pLength);
|
|
extern void FreeUnicodeString(LPOLESTR *lpUniOutString);
|
|
|
|
extern const FONTDESC _fontdescHeading = { sizeof(FONTDESC), OLESTR("MS Sans Serif"), FONTSIZE( 12 ), FW_NORMAL, ANSI_CHARSET, FALSE, FALSE, FALSE };
|
|
CFontHolder SelectedAnnotationFont(NULL);
|
|
|
|
extern UINT uWangAnnotatedImageFormat;
|
|
extern UINT uWangAnnotationFormat;
|
|
|
|
void CImgEditCtrl::Display()
|
|
{
|
|
int RetCode,ScreenDPI;
|
|
DWORD dwFlags;
|
|
UINT Scale,ImageType,HelpIdDef;
|
|
PARM_RESOLUTION_STRUCT Res;
|
|
CDC *pDC;
|
|
PARM_SCALE_ALGORITHM_STRUCT ScaleAlg;
|
|
PARM_FILE_SCALE_STRUCT ParmFileScale;
|
|
CString szErr;
|
|
double dbZoom;
|
|
float fpSaveZoom;
|
|
|
|
#define FILE_AWD_FIT_TO_WIDTH 1
|
|
#define FILE_AWD_FIT_TO_HEIGHT 2
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
// if image displayed then send close event
|
|
if (m_bImageInWindow == TRUE)
|
|
FireClose();
|
|
|
|
// display image but don't paint it yet
|
|
RetCode = IMGDisplayFile(m_hWnd,(LPSTR)m_strImage.GetBuffer(MAXFILESPECLENGTH),(WORD)m_lPage, OI_DONT_REPAINT);
|
|
if (RetCode)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DISPLAY);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef);
|
|
return;
|
|
}
|
|
m_bImageInWindow = TRUE;
|
|
// set flag so that refresh method does not change resolution
|
|
m_bImageResolutionChange = FALSE;
|
|
// set flag so that refresh method does not change scroll position
|
|
m_bScrollPositionChange = FALSE;
|
|
// initialize scroll position to left,top in image
|
|
m_ScrollPositionX = 0; // save for refresh method
|
|
m_ScrollPositionY = 0; // save for refresh method
|
|
// Initialize the X & Y Resolution variables
|
|
m_lImageResolutionX = 0L;
|
|
m_lImageResolutionY = 0L;
|
|
// set flag so that refresh method does not change zoom factor
|
|
m_bZoomFactorChange = FALSE;
|
|
// set flag so that refresh method does not change Display Scale Alg
|
|
m_bDisplayScaleAlgChange = FALSE;
|
|
// set falg so that refresh method does not change Image Palette
|
|
m_bImagePaletteChange = FALSE;
|
|
// set flag so trhat refresh method does not change scroll bars
|
|
m_bScrollBarsChange = FALSE;
|
|
// set flag for allowing images to be redisplayed, not used till repainting needed or on error
|
|
dwFlags = NULL;
|
|
|
|
// if any existing group list then delete it with new image
|
|
if (m_lpGroupList != NULL)
|
|
{
|
|
free(m_lpGroupList);
|
|
m_lpGroupList = NULL;
|
|
}
|
|
|
|
// scale to what the user has set, if arbitrary setting use that
|
|
if (m_nFitToZoom != -1)
|
|
{
|
|
switch (m_nFitToZoom)
|
|
{
|
|
case BEST_FIT:
|
|
Scale = SD_FIT_WINDOW;
|
|
break;
|
|
case FIT_TO_WIDTH:
|
|
Scale = SD_FIT_HORIZONTAL;
|
|
break;
|
|
case FIT_TO_HEIGHT:
|
|
Scale = SD_FIT_VERTICAL;
|
|
break;
|
|
case INCH_TO_INCH:
|
|
IMGGetParmsCgbw(m_hWnd, PARM_RESOLUTION, &Res, NULL);
|
|
pDC = GetDC();
|
|
// get screen dpi from windows - this doesn't work for all monitors in win31
|
|
ScreenDPI = GetDeviceCaps(pDC->m_hDC, LOGPIXELSX);
|
|
// JPEG & images converted from JPEG may report a Vert & Horz Res of 1
|
|
// If so, set Horz Res == to 100 as a best guess default
|
|
if ( (long)Res.nHResolution == 1 )
|
|
Res.nHResolution = 100;
|
|
Scale = (UINT) (((long)ScreenDPI * 1000L) / (long)Res.nHResolution);
|
|
break;
|
|
default:
|
|
break;
|
|
} // end switch
|
|
}
|
|
else
|
|
Scale = (UINT) (m_fpZoom * 10);
|
|
|
|
// scale the image
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE, (void FAR *)&Scale, NULL);
|
|
if (RetCode == 0)
|
|
{
|
|
if (m_nFitToZoom != -1)
|
|
{
|
|
/* get the new scale if arbitray fit */
|
|
RetCode = IMGGetParmsCgbw(m_hWnd,PARM_SCALE, (void FAR *)&Scale, PARM_VARIABLE_SCALE);
|
|
if (RetCode)
|
|
{
|
|
// clear image buffer
|
|
IMGClearWindow(m_hWnd);
|
|
// set flag for no image in window
|
|
m_bImageInWindow = FALSE;
|
|
// allow images to be repainted again - especially for DisplayBlankImage
|
|
IMGSetParmsCgbw(m_hWnd, PARM_DWFLAGS, &dwFlags, NULL);
|
|
|
|
szErr.LoadString(IDS_BADMETH_DISPLAY);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
m_fpZoom = (float) Scale;
|
|
m_fpZoom /= 10;
|
|
}
|
|
}
|
|
// save zoom value to decide later if it has changed
|
|
fpSaveZoom = m_fpZoom;
|
|
}
|
|
else
|
|
{
|
|
// don't error out but send load event which may set the zoom property and fix error
|
|
fpSaveZoom = (float)0; // make code zoom the image again later
|
|
}
|
|
|
|
// get the scale factor from the display that was stored in the file
|
|
RetCode = IMGGetParmsCgbw(m_hWnd, PARM_FILE_SCALE, &ParmFileScale, NULL);
|
|
if (RetCode != 0)
|
|
{
|
|
// clear image buffer
|
|
IMGClearWindow(m_hWnd);
|
|
// set flag for no image in window
|
|
m_bImageInWindow = FALSE;
|
|
// allow images to be repainted again - especially for DisplayBlankImage
|
|
IMGSetParmsCgbw(m_hWnd, PARM_DWFLAGS, &dwFlags, NULL);
|
|
|
|
szErr.LoadString(IDS_BADMETH_DISPLAY);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// The ParmFileScale struct has a member called bFileScaleValid which when
|
|
// set to true means that there is scale info in the file. If true send
|
|
// user that value otherwise send 100 percent.
|
|
if (ParmFileScale.bFileScaleValid == TRUE)
|
|
{
|
|
// we have scale info in file, if value has fit to width or fit to height
|
|
// then send back defines for that.
|
|
if (ParmFileScale.nFileHScaleFlags & FILE_AWD_FIT_TO_WIDTH)
|
|
dbZoom = (double)AWD_FIT_TO_WIDTH;
|
|
else if (ParmFileScale.nFileHScaleFlags & FILE_AWD_FIT_TO_HEIGHT)
|
|
dbZoom = (double)AWD_FIT_TO_HEIGHT;
|
|
else
|
|
dbZoom = (double)ParmFileScale.nFileHScale / 10;
|
|
}
|
|
else
|
|
dbZoom = (double)UNDEFINED_ZOOM;
|
|
|
|
// fire group event
|
|
FireLoad(dbZoom);
|
|
|
|
if (m_bFirstImageDisplayed == FALSE)
|
|
{
|
|
// enable the scroll bars only on first image, if done on every display
|
|
// it can cause unwanted repaints, (i.e fit to width)
|
|
if (m_bScrollBars == TRUE)
|
|
IMGEnableScrollBar(m_hWnd);
|
|
else
|
|
IMGDisableScrollBar(m_hWnd);
|
|
m_bFirstImageDisplayed = TRUE;
|
|
}
|
|
else
|
|
{
|
|
// calling IMGDisplayFile without the OI_NO_SCROLL option causes the scroll bars
|
|
// to be enabled, therefore if user wants scroll bars off then disable them now.
|
|
if (m_bScrollBars == FALSE)
|
|
IMGDisableScrollBar(m_hWnd);
|
|
}
|
|
|
|
RetCode = IMGGetParmsCgbw(m_hWnd, PARM_IMAGE_TYPE, &ImageType, NULL);
|
|
if (RetCode != 0)
|
|
{
|
|
// clear image buffer
|
|
IMGClearWindow(m_hWnd);
|
|
// set flag for no image in window
|
|
m_bImageInWindow = FALSE;
|
|
// allow images to be repainted again - especially for DisplayBlankImage
|
|
IMGSetParmsCgbw(m_hWnd, PARM_DWFLAGS, &dwFlags, NULL);
|
|
|
|
szErr.LoadString(IDS_BADMETH_DISPLAY);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
|
|
// save the image type in case it is converted later. The SaveAs method needs to know
|
|
// what the image type is when the file is first displayed.
|
|
m_uOpenedImageType = ImageType;
|
|
|
|
// we need to see if the displayscale algorithm needs to be set for the image type
|
|
// of the file that the user specified.
|
|
switch(m_nDisplayScaleAlgorithm)
|
|
{
|
|
case NORMAL:
|
|
ScaleAlg.uScaleAlgorithm = OI_SCALE_ALG_NORMAL;
|
|
break;
|
|
|
|
case GRAY4:
|
|
ScaleAlg.uScaleAlgorithm = OI_SCALE_ALG_AVERAGE_TO_GRAY4;
|
|
break;
|
|
|
|
case GRAY8:
|
|
ScaleAlg.uScaleAlgorithm = OI_SCALE_ALG_AVERAGE_TO_GRAY8;
|
|
break;
|
|
|
|
case STAMP:
|
|
ScaleAlg.uScaleAlgorithm = OI_SCALE_ALG_STAMP;
|
|
break;
|
|
|
|
case OPTIMIZE:
|
|
if (ImageType == ITYPE_BI_LEVEL || ImageType == ITYPE_GRAY4 || ImageType == ITYPE_GRAY8)
|
|
ScaleAlg.uScaleAlgorithm = OI_SCALE_ALG_AVERAGE_TO_GRAY4;
|
|
else
|
|
ScaleAlg.uScaleAlgorithm = OI_SCALE_ALG_NORMAL;
|
|
break;
|
|
} // end switch
|
|
|
|
// compare user scale algorithm with my stored algorithm values based on ImageType.
|
|
RetCode = 0;
|
|
switch(ImageType)
|
|
{
|
|
case ITYPE_BI_LEVEL:
|
|
if (m_uBiLevelScaleAlg != ScaleAlg.uScaleAlgorithm)
|
|
{
|
|
ScaleAlg.uImageFlags = ITYPE_BI_LEVEL;
|
|
m_uBiLevelScaleAlg = ScaleAlg.uScaleAlgorithm;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE_ALGORITHM, &ScaleAlg, PARM_WINDOW_DEFAULT);
|
|
}
|
|
break;
|
|
|
|
case ITYPE_GRAY4:
|
|
if (m_uGray4ScaleAlg != ScaleAlg.uScaleAlgorithm)
|
|
{
|
|
ScaleAlg.uImageFlags = ITYPE_GRAY4;
|
|
m_uGray4ScaleAlg = ScaleAlg.uScaleAlgorithm;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE_ALGORITHM, &ScaleAlg, PARM_WINDOW_DEFAULT);
|
|
}
|
|
break;
|
|
|
|
case ITYPE_GRAY8:
|
|
if (m_uGray8ScaleAlg != ScaleAlg.uScaleAlgorithm)
|
|
{
|
|
ScaleAlg.uImageFlags = ITYPE_GRAY8;
|
|
m_uGray8ScaleAlg = ScaleAlg.uScaleAlgorithm;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE_ALGORITHM, &ScaleAlg, PARM_WINDOW_DEFAULT);
|
|
}
|
|
break;
|
|
|
|
case ITYPE_PAL4:
|
|
if (m_uPal4ScaleAlg != ScaleAlg.uScaleAlgorithm)
|
|
{
|
|
ScaleAlg.uImageFlags = ITYPE_PAL4;
|
|
m_uPal4ScaleAlg = ScaleAlg.uScaleAlgorithm;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE_ALGORITHM, &ScaleAlg, PARM_WINDOW_DEFAULT);
|
|
}
|
|
break;
|
|
|
|
case ITYPE_PAL8:
|
|
if (m_uPal8ScaleAlg != ScaleAlg.uScaleAlgorithm)
|
|
{
|
|
ScaleAlg.uImageFlags = ITYPE_PAL8;
|
|
m_uPal8ScaleAlg = ScaleAlg.uScaleAlgorithm;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE_ALGORITHM, &ScaleAlg, PARM_WINDOW_DEFAULT);
|
|
}
|
|
break;
|
|
|
|
case ITYPE_RGB24:
|
|
if (m_uRGB24ScaleAlg != ScaleAlg.uScaleAlgorithm)
|
|
{
|
|
ScaleAlg.uImageFlags = ITYPE_RGB24;
|
|
m_uRGB24ScaleAlg = ScaleAlg.uScaleAlgorithm;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE_ALGORITHM, &ScaleAlg, PARM_WINDOW_DEFAULT);
|
|
}
|
|
break;
|
|
|
|
case ITYPE_BGR24:
|
|
if (m_uBGR24ScaleAlg != ScaleAlg.uScaleAlgorithm)
|
|
{
|
|
ScaleAlg.uImageFlags = ITYPE_BGR24;
|
|
m_uBGR24ScaleAlg = ScaleAlg.uScaleAlgorithm;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE_ALGORITHM, &ScaleAlg, PARM_WINDOW_DEFAULT);
|
|
}
|
|
break;
|
|
} // end switch
|
|
|
|
if (RetCode != 0)
|
|
{
|
|
// clear image buffer
|
|
IMGClearWindow(m_hWnd);
|
|
// set flag for no image in window
|
|
m_bImageInWindow = FALSE;
|
|
// allow images to be repainted again - especially for DisplayBlankImage
|
|
IMGSetParmsCgbw(m_hWnd, PARM_DWFLAGS, &dwFlags, NULL);
|
|
|
|
szErr.LoadString(IDS_BADMETH_DISPLAY);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
|
|
// before we repaint see if the user changed the scale in the load event
|
|
if (fpSaveZoom != m_fpZoom)
|
|
{
|
|
// do not need to check for fit to scales because the FitTo method would have
|
|
// already set the new scale but just not repainted. Only need to check the zoom
|
|
// property because they would not have set the scale if auto refresh is FALSE.
|
|
Scale = (UINT) (m_fpZoom * 10);
|
|
|
|
// scale the image
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE, (void FAR *)&Scale, NULL);
|
|
if (RetCode != 0)
|
|
{
|
|
// clear image buffer
|
|
IMGClearWindow(m_hWnd);
|
|
// set flag for no image in window
|
|
m_bImageInWindow = FALSE;
|
|
// allow images to be repainted again - especially for DisplayBlankImage
|
|
IMGSetParmsCgbw(m_hWnd, PARM_DWFLAGS, &dwFlags, NULL);
|
|
|
|
szErr.LoadString(IDS_BADMETH_DISPLAY);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
}
|
|
|
|
// repaint image
|
|
dwFlags = NULL;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_DWFLAGS, &dwFlags, PARM_REPAINT);
|
|
if (RetCode != 0)
|
|
{
|
|
// clear image buffer
|
|
IMGClearWindow(m_hWnd);
|
|
// set flag for no image in window
|
|
m_bImageInWindow = FALSE;
|
|
// allow images to be repainted again - especially for DisplayBlankImage
|
|
IMGSetParmsCgbw(m_hWnd, PARM_DWFLAGS, &dwFlags, NULL);
|
|
|
|
szErr.LoadString(IDS_BADMETH_DISPLAY);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_lStatusCode = (long)SUCCESS;
|
|
}
|
|
|
|
|
|
BSTR CImgEditCtrl::GetAnnotationGroup(short GroupIndex)
|
|
{
|
|
short GroupCount,i;
|
|
BOOL RunMode;
|
|
LPANNOTATION_GROUP_LIST lpTempGroupList;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
// find out if design mode or run mode
|
|
RunMode = AmbientUserMode();
|
|
if (RunMode == FALSE)
|
|
return NULL; // no runtime error
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
m_bImageInWindow = ImageInWindow();
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_GETANNOTATIONGROUP);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_GETANNOTATIONGROUP);
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
// see if group list exists
|
|
if (m_lpGroupList == NULL)
|
|
{
|
|
// group list does not exist, GetAnnotationGroupCount will generate it
|
|
m_lStatusCode = 0;
|
|
GroupCount = GetAnnotationGroupCount();
|
|
if (m_lStatusCode != 0)
|
|
{
|
|
// GetAnnotationGroupCount got an error, use its error processing
|
|
return NULL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// have an existing list, use its group count
|
|
GroupCount = (short)m_lpGroupList->GroupCount;
|
|
}
|
|
|
|
|
|
// go thru group list and find index of group that user wants
|
|
lpTempGroupList = (LPANNOTATION_GROUP_LIST) &m_lpGroupList->GroupList;
|
|
for (i = 0; i < GroupCount; i++, lpTempGroupList++)
|
|
{
|
|
// see if this is the one the user wants
|
|
if (GroupIndex == i)
|
|
{
|
|
// found the one we want, point to the group after this one
|
|
m_lStatusCode = (long)SUCCESS;
|
|
CString TempString = lpTempGroupList->GroupName;
|
|
return TempString.AllocSysString();
|
|
}
|
|
} // end for
|
|
|
|
// invalid index for group, return error
|
|
szErr.LoadString(IDS_BADMETH_GETANNOTATIONGROUP);
|
|
m_lStatusCode = ErrMap::Xlate(CTL_E_ILLEGALFUNCTIONCALL,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_GETANNOTATIONGROUP);
|
|
return NULL;
|
|
}
|
|
|
|
void CImgEditCtrl::AddAnnotationGroup(LPCTSTR Group)
|
|
{
|
|
char GroupName[ANNOTATION_GROUP_SIZE];
|
|
LPPARM_NAMED_BLOCK_STRUCT lpNamedBlock;
|
|
int RetCode;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
// Make sure that the length of the group name does not exceed the max.
|
|
if (_mbstrlen((const char *)Group) > ANNOTATION_GROUP_SIZE)
|
|
{
|
|
// size to big
|
|
szErr.LoadString(IDS_BADVAR_PARMEXCEEDSMAX);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_BUFFERTOLARGE,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_ADDANNOTATIONGROUP);
|
|
return;
|
|
}
|
|
// We need to make sure that an image is displayed.
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_ADDANNOTATIONGROUP);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_ADDANNOTATIONGROUP);
|
|
return;
|
|
}
|
|
|
|
// set the new group name
|
|
lpNamedBlock = (LPPARM_NAMED_BLOCK_STRUCT) malloc(sizeof(PARM_NAMED_BLOCK_STRUCT));
|
|
if (lpNamedBlock == NULL)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_ADDANNOTATIONGROUP);
|
|
m_lStatusCode = ErrMap::Xlate(CTL_E_OUTOFMEMORY,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_ADDANNOTATIONGROUP);
|
|
return;
|
|
}
|
|
_mbscpy((unsigned char *)lpNamedBlock->szBlockName, (const unsigned char *)"OiGroup\0");
|
|
lpNamedBlock->uScope = NB_SCOPE_DEFAULT_MARK;
|
|
lpNamedBlock->uNumberOfBlocks = 1;
|
|
_mbscpy((unsigned char *)GroupName, (const unsigned char *)Group);
|
|
lpNamedBlock->Block[0].lSize = _mbstrlen((const char *)GroupName) + 1;
|
|
lpNamedBlock->Block[0].lpBlock = GroupName;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_NAMED_BLOCK, lpNamedBlock, NULL);
|
|
free(lpNamedBlock);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_ADDANNOTATIONGROUP);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
|
|
// Get rid of group list, because list is now invalid
|
|
if (m_lpGroupList != NULL)
|
|
{
|
|
free(m_lpGroupList);
|
|
m_lpGroupList = NULL;
|
|
}
|
|
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
OLE_COLOR CImgEditCtrl::GetSelectedAnnotationLineColor()
|
|
{
|
|
int RetCode;
|
|
PARM_MARK_ATTRIBUTES_STRUCT MarkAttributesStruct;
|
|
BYTE RedValue,GreenValue,BlueValue;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
// We need to make sure that an image is displayed.
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONLINECOLOR);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_GETSELECTEDANNOTATIONLINECOLOR);
|
|
return NULL;
|
|
}
|
|
// make sure mark is selected and get line color
|
|
RetCode = IMGGetParmsCgbw(m_hWnd,PARM_MARK_ATTRIBUTES, (void FAR *)&MarkAttributesStruct, PARM_WINDOW);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONLINECOLOR);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return NULL;
|
|
}
|
|
|
|
// make sure straight line, freehand line or hollow rect
|
|
if (!(MarkAttributesStruct.Attributes.uType == OIOP_AN_LINE ||
|
|
MarkAttributesStruct.Attributes.uType == OIOP_AN_FREEHAND ||
|
|
MarkAttributesStruct.Attributes.uType == OIOP_AN_HOLLOW_RECT))
|
|
{
|
|
// invalid annotation type
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONLINECOLOR);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_INVALIDANNOTATIONSELECTED,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_GETSELECTEDANNOTATIONLINECOLOR);
|
|
return NULL;
|
|
}
|
|
// return line color
|
|
RedValue = GetRValue(MarkAttributesStruct.Attributes.rgbColor1.rgbRed);
|
|
GreenValue = GetRValue(MarkAttributesStruct.Attributes.rgbColor1.rgbGreen);
|
|
BlueValue = GetRValue(MarkAttributesStruct.Attributes.rgbColor1.rgbBlue);
|
|
|
|
m_lStatusCode = SUCCESS;
|
|
return RGB(RedValue, GreenValue, BlueValue);
|
|
}
|
|
|
|
void CImgEditCtrl::FitTo(short Option, const VARIANT FAR& V_Repaint)
|
|
{
|
|
int RetCode;
|
|
UINT Scale;
|
|
PARM_RESOLUTION_STRUCT Res;
|
|
int ScreenDPI;
|
|
CDC *pDC;
|
|
BOOL Repaint;
|
|
UINT unFlags;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (Option < BEST_FIT || Option > INCH_TO_INCH)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_FITTO);
|
|
m_lStatusCode = ErrMap::Xlate(CTL_E_INVALIDPROPERTYVALUE,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_FITTO);
|
|
return;
|
|
}
|
|
|
|
// redisplay image if one in window
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
// Repaint is optional parameter, DEFAULT = PARM_REPAINT
|
|
// The following CheckVarXXX functions will verify that the variant data
|
|
// passed into this method is of the correct data type. These member
|
|
// functions are implemented in IEMISC.CPP
|
|
// If successful, the function(s) will return 0.
|
|
if ( CheckVarBool(V_Repaint, Repaint,TRUE,FALSE,IDH_METHOD_FITTO,IDS_BADVAR_NOTBOOL))
|
|
return;
|
|
|
|
if (m_bImageInWindow == TRUE)
|
|
{
|
|
switch (Option)
|
|
{
|
|
case BEST_FIT:
|
|
Scale = SD_FIT_WINDOW;
|
|
break;
|
|
case FIT_TO_WIDTH:
|
|
Scale = SD_FIT_HORIZONTAL;
|
|
break;
|
|
case FIT_TO_HEIGHT:
|
|
Scale = SD_FIT_VERTICAL;
|
|
break;
|
|
case INCH_TO_INCH:
|
|
RetCode = IMGGetParmsCgbw(m_hWnd, PARM_RESOLUTION, &Res, NULL);
|
|
if (RetCode)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_FITTO);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode,szErr,HelpIdDef);
|
|
return;
|
|
}
|
|
pDC = GetDC();
|
|
// get screen dpi from windows - this doesn't work for all monitors in win31
|
|
ScreenDPI = GetDeviceCaps(pDC->m_hDC, LOGPIXELSX);
|
|
// JPEG & images converted from JPEG may report a Vert & Horz Res of 1
|
|
// If so, set Horz Res == to 100 as a best guess default
|
|
if ( (long)Res.nHResolution == 1L )
|
|
Res.nHResolution = 100;
|
|
Scale = (int) (((long)ScreenDPI * 1000L) / (long)Res.nHResolution);
|
|
break;
|
|
default:
|
|
break;
|
|
} // end switch
|
|
|
|
// repaint according to user request
|
|
if (Repaint)
|
|
unFlags = PARM_REPAINT;
|
|
else
|
|
unFlags = NULL;
|
|
|
|
// zoom the image
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE, (void FAR *)&Scale, unFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_FITTO);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// update zoom property variable
|
|
RetCode = IMGGetParmsCgbw(m_hWnd,PARM_SCALE, (void FAR *)&Scale, PARM_VARIABLE_SCALE);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_FITTO);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_fpZoom = (float) Scale;
|
|
m_fpZoom /= 10;
|
|
}
|
|
// store zoom value for later zooming
|
|
m_nFitToZoom = Option;
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
void CImgEditCtrl::ClearDisplay()
|
|
{
|
|
int RetCode;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
// if image displayed then send close event
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
// if any existing group list then delete it with new image
|
|
if (m_lpGroupList != NULL)
|
|
{
|
|
free(m_lpGroupList);
|
|
m_lpGroupList = NULL;
|
|
}
|
|
|
|
if (m_bImageInWindow == TRUE)
|
|
FireClose();
|
|
else
|
|
{
|
|
// if no image in window then no error, everything is ok
|
|
m_lStatusCode = SUCCESS;
|
|
return;
|
|
}
|
|
|
|
// clear the window
|
|
RetCode = IMGClearWindow(m_hWnd);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CLEARDISPLAY);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
|
|
m_bImageInWindow = FALSE;
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
void CImgEditCtrl::DeleteAnnotationGroup(LPCTSTR GroupName)
|
|
{
|
|
POINT Point;
|
|
int RetCode;
|
|
WORD fwKeys;
|
|
UINT uFlags;
|
|
OIOP_START_OPERATION_STRUCT StartStruct;
|
|
char Group[ANNOTATION_GROUP_SIZE],SelectBuffer[2];
|
|
LPPARM_NAMED_BLOCK_STRUCT lpNamedBlock;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
// 9602.16 jar initialized
|
|
fwKeys = 0;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_DELETEANNOTATIONGROUP);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_DELETEANNOTATIONGROUP);
|
|
return;
|
|
}
|
|
// save current annotation status
|
|
RetCode = SaveAnnotationStatus();
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DELETEANNOTATIONGROUP);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef);
|
|
return;
|
|
}
|
|
// deselected all annotations
|
|
RetCode = OiAnSelectByMarkAttrib(m_hWnd, NULL, NULL, FALSE, TRUE, OIAN_SELECT_ALL);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DELETEANNOTATIONGROUP);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef);
|
|
return;
|
|
}
|
|
// select all annotations for specified group
|
|
_mbscpy((unsigned char *)Group, (const unsigned char *)GroupName);
|
|
RetCode = OiAnSelectByMarkNamedBlock(m_hWnd, "OiGroup\0", Group, _mbstrlen((const char *)Group) + 1, TRUE, TRUE, 0);
|
|
if (RetCode != 0)
|
|
{
|
|
RestoreAnnotationStatus();
|
|
szErr.LoadString(IDS_BADMETH_DELETEANNOTATIONGROUP);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
Point.x = 0;
|
|
Point.y = 0;
|
|
uFlags = PARM_WINDOW;
|
|
|
|
memset(&StartStruct, 0, sizeof(OIOP_START_OPERATION_STRUCT));
|
|
StartStruct.Attributes.uType = OIOP_DELETE;
|
|
|
|
// delete all selected annotations
|
|
RetCode = OiOpStartOperation(m_hWnd, (LPOIOP_START_OPERATION_STRUCT)&StartStruct,
|
|
Point, fwKeys, uFlags);
|
|
if (RetCode == 0)
|
|
RetCode = OiOpEndOperation(m_hWnd);
|
|
else
|
|
{
|
|
RestoreAnnotationStatus();
|
|
szErr.LoadString(IDS_BADMETH_DELETEANNOTATIONGROUP);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// get rid of named block for this group
|
|
lpNamedBlock = (LPPARM_NAMED_BLOCK_STRUCT) malloc(sizeof(PARM_NAMED_BLOCK_STRUCT));
|
|
if (lpNamedBlock == NULL)
|
|
{
|
|
RestoreAnnotationStatus();
|
|
szErr.LoadString(IDS_BADMETH_DELETEANNOTATIONGROUP);
|
|
m_lStatusCode = ErrMap::Xlate(CTL_E_OUTOFMEMORY,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_DELETEANNOTATIONGROUP);
|
|
return;
|
|
}
|
|
_mbscpy((unsigned char *)lpNamedBlock->szBlockName, (const unsigned char *)Group);
|
|
lpNamedBlock->uScope = NB_SCOPE_SELECTED_MARKS;
|
|
lpNamedBlock->uNumberOfBlocks = 1;
|
|
lpNamedBlock->Block[0].lSize = 0;
|
|
_mbscpy((unsigned char *)SelectBuffer, (const unsigned char *)"");
|
|
lpNamedBlock->Block[0].lpBlock = SelectBuffer;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_NAMED_BLOCK, (void FAR *)lpNamedBlock, NULL);
|
|
if (RetCode != 0)
|
|
{
|
|
free(lpNamedBlock);
|
|
RestoreAnnotationStatus();
|
|
szErr.LoadString(IDS_BADMETH_DELETEANNOTATIONGROUP);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// free memory
|
|
free(lpNamedBlock);
|
|
|
|
// Get rid of group list, because list is now invalid
|
|
if (m_lpGroupList != NULL)
|
|
{
|
|
free(m_lpGroupList);
|
|
m_lpGroupList = NULL;
|
|
}
|
|
|
|
// put annotations back into original state
|
|
RetCode = RestoreAnnotationStatus();
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DELETEANNOTATIONGROUP);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
void CImgEditCtrl::DeleteImageData(const VARIANT FAR& V_Left, const VARIANT FAR& V_Top,
|
|
const VARIANT FAR& V_Width, const VARIANT FAR& V_Height)
|
|
{
|
|
POINT Point,StartPoint,EndPoint;
|
|
WORD fwKeys;
|
|
int RetCode;
|
|
UINT uFlags;
|
|
OIOP_START_OPERATION_STRUCT StartStruct;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
long Left, Top, Width, Height;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
// 9602.16 jar initialized
|
|
fwKeys = 0;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_DELETEIMAGEDATA);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_DELETEIMAGEDATA);
|
|
return;
|
|
}
|
|
// if no selection rect then all parameters are needed
|
|
if (m_bSelectRectangle == FALSE)
|
|
{
|
|
// No selection Rect drawn, ALL rect parms must be provided...else error
|
|
if (V_Left.vt == VT_ERROR || V_Top.vt == VT_ERROR || V_Width.vt == VT_ERROR || V_Height.vt == VT_ERROR)
|
|
{
|
|
// no selection rect drawn
|
|
szErr.LoadString(IDS_BADMETH_DELETEIMAGEDATA);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOSELECTIONRECTDRAWN,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_DELETEIMAGEDATA);
|
|
return;
|
|
}
|
|
}
|
|
// Check to see if any of the input parms are blank
|
|
if (V_Left.vt == VT_ERROR || V_Top.vt == VT_ERROR || V_Width.vt == VT_ERROR || V_Height.vt == VT_ERROR)
|
|
{
|
|
// at least one not passed in, make sure all not passed in
|
|
if (V_Left.vt == VT_ERROR && V_Top.vt == VT_ERROR && V_Width.vt == VT_ERROR && V_Height.vt == VT_ERROR)
|
|
{
|
|
// all not passed in, assuming selection rect drawn
|
|
;
|
|
}
|
|
else
|
|
{
|
|
// error, not all passed in
|
|
szErr.LoadString(IDS_BADMETH_DELETEIMAGEDATA);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_OPTIONALPARAMETERSNEEDED,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_DELETEIMAGEDATA);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( CheckVarLong(V_Left, Left, 0, TRUE, IDH_METHOD_DELETEIMAGEDATA,IDS_BADVAR_RECTANGLEPARMS))
|
|
return;
|
|
if ( CheckVarLong(V_Top, Top, 0, TRUE, IDH_METHOD_DELETEIMAGEDATA,IDS_BADVAR_RECTANGLEPARMS))
|
|
return;
|
|
if ( CheckVarLong(V_Width, Width, 0, TRUE, IDH_METHOD_DELETEIMAGEDATA,IDS_BADVAR_RECTANGLEPARMS))
|
|
return;
|
|
if ( CheckVarLong(V_Height, Height, 0, TRUE, IDH_METHOD_DELETEIMAGEDATA,IDS_BADVAR_RECTANGLEPARMS))
|
|
return;
|
|
|
|
// All parms pass Variant data type check...continue
|
|
// we need to draw a rect by ourselves for O/i
|
|
// use parameters passed in by user - left
|
|
StartPoint.x = Left;
|
|
StartPoint.y = Top;
|
|
EndPoint.x = StartPoint.x + (int)Width;
|
|
EndPoint.y = StartPoint.y + (int)Height;
|
|
|
|
memset(&StartStruct, 0, sizeof(OIOP_START_OPERATION_STRUCT));
|
|
StartStruct.Attributes.uType = OIOP_SELECT_BY_RECT_VARIABLE;
|
|
|
|
// start selection rect
|
|
uFlags = PARM_WINDOW | OIOP_IMAGE_ONLY;
|
|
RetCode = OiOpStartOperation(m_hWnd, (LPOIOP_START_OPERATION_STRUCT)&StartStruct,
|
|
StartPoint, fwKeys, uFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DELETEIMAGEDATA);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// set last point in selection rect
|
|
RetCode = OiOpContinueOperation(m_hWnd, EndPoint, uFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DELETEIMAGEDATA);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// end the operation
|
|
RetCode = OiOpEndOperation(m_hWnd);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DELETEIMAGEDATA);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
}
|
|
Point.x = 0L;
|
|
Point.y = 0L;
|
|
// delete image data only
|
|
uFlags = PARM_WINDOW | OIOP_IMAGE_ONLY;
|
|
|
|
memset(&StartStruct, 0, sizeof(OIOP_START_OPERATION_STRUCT));
|
|
StartStruct.Attributes.uType = OIOP_DELETE;
|
|
|
|
// delete image data
|
|
RetCode = OiOpStartOperation(m_hWnd, (LPOIOP_START_OPERATION_STRUCT)&StartStruct,
|
|
Point, fwKeys, uFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DELETEIMAGEDATA);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// end the operation
|
|
RetCode = OiOpEndOperation(m_hWnd);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DELETEIMAGEDATA);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
|
|
void CImgEditCtrl::ClipboardPaste(const VARIANT FAR& V_Left, const VARIANT FAR& V_Top)
|
|
{
|
|
int RetCode;
|
|
POINT Point;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
long Left, Top;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDPASTE);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_CLIPBOARDPASTE);
|
|
return;
|
|
}
|
|
|
|
// if any parameter passed in then all must be passed in
|
|
if (V_Left.vt == VT_ERROR || V_Top.vt == VT_ERROR)
|
|
{
|
|
// at least one not passed in, make sure all not passed in
|
|
if (V_Left.vt == VT_ERROR && V_Top.vt == VT_ERROR)
|
|
{
|
|
// use 0 for left and top
|
|
Point.x = 0L;
|
|
Point.y = 0L;
|
|
}
|
|
else
|
|
{
|
|
// error, not all passed in
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDPASTE);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_OPTIONALPARAMETERSNEEDED,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_CLIPBOARDPASTE);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( CheckVarLong(V_Left, Left, 0, TRUE, IDH_METHOD_CLIPBOARDPASTE,IDS_BADVAR_RECTANGLEPARMS))
|
|
return;
|
|
if ( CheckVarLong(V_Top, Top, 0, TRUE, IDH_METHOD_CLIPBOARDPASTE,IDS_BADVAR_RECTANGLEPARMS))
|
|
return;
|
|
|
|
// use parameters passed in by user - left
|
|
Point.x = Left;
|
|
Point.y = Top;
|
|
}
|
|
|
|
// if any existing group list then delete it, make group get recreated
|
|
if (m_lpGroupList != NULL)
|
|
{
|
|
free(m_lpGroupList);
|
|
m_lpGroupList = NULL;
|
|
}
|
|
|
|
// paste from clipboard
|
|
WORD fwKeys;
|
|
UINT uFlags,ClipboardFormat;
|
|
OIOP_START_OPERATION_STRUCT StartStruct;
|
|
|
|
memset(&StartStruct,0,sizeof(OIOP_START_OPERATION_STRUCT));
|
|
StartStruct.Attributes.uType = OIOP_PASTE;
|
|
fwKeys = (WORD)1;
|
|
uFlags = PARM_WINDOW | OIAN_UPPER_LEFT;
|
|
|
|
ClipboardFormat = uWangAnnotatedImageFormat;
|
|
*((LPUINT)StartStruct.szString) = ClipboardFormat;
|
|
|
|
RetCode = OiOpStartOperation(m_hWnd, (LPOIOP_START_OPERATION_STRUCT)&StartStruct,
|
|
Point, fwKeys, uFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
// if dib data in clipboard try again with dib
|
|
if (RetCode == DISPLAY_NO_CLIPBOARD)
|
|
{
|
|
ClipboardFormat = CF_DIB;
|
|
*((LPUINT)StartStruct.szString) = ClipboardFormat;
|
|
RetCode = OiOpStartOperation(m_hWnd, (LPOIOP_START_OPERATION_STRUCT)&StartStruct,
|
|
Point, fwKeys, uFlags);
|
|
}
|
|
if (RetCode != 0)
|
|
{
|
|
// still an error
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDPASTE);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
}
|
|
RetCode = OiOpEndOperation(m_hWnd);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDPASTE);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// need to set paste mode for next left button down message
|
|
m_bInPasteMode = TRUE;
|
|
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
void CImgEditCtrl::ClipboardCopy(const VARIANT FAR& V_Left, const VARIANT FAR& V_Top,
|
|
const VARIANT FAR& V_Width, const VARIANT FAR& V_Height)
|
|
{
|
|
int RetCode;
|
|
CString szErr;
|
|
WORD fwKeys;
|
|
UINT uFlags,HelpIdDef;
|
|
POINT StartPoint, EndPoint, Point;
|
|
long Left, Top, Width, Height;
|
|
OIOP_START_OPERATION_STRUCT StartStruct;
|
|
PARM_MARK_ATTRIBUTES_STRUCT MarkAttributesStruct;
|
|
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
// 9602.16 jar initialized
|
|
fwKeys = 0;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCOPY);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_CLIPBOARDCOPY);
|
|
return;
|
|
}
|
|
|
|
// if no selection rect then all parameters are needed if image data
|
|
if (m_bSelectRectangle == FALSE)
|
|
{
|
|
if (V_Left.vt == VT_ERROR || V_Top.vt == VT_ERROR || V_Width.vt == VT_ERROR || V_Height.vt == VT_ERROR)
|
|
{
|
|
// no selection rect drawn, see if any annotation selected
|
|
RetCode = IMGGetParmsCgbw(m_hWnd,PARM_MARK_ATTRIBUTES, (void FAR *)&MarkAttributesStruct, PARM_WINDOW);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCOPY);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate( RetCode,szErr,HelpIdDef,__FILE__, __LINE__);
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
// if any parameter passed in then all must be passed in
|
|
if (V_Left.vt == VT_ERROR || V_Top.vt == VT_ERROR || V_Width.vt == VT_ERROR || V_Height.vt == VT_ERROR)
|
|
{
|
|
// at least one not passed in, make sure all not passed in
|
|
if (V_Left.vt == VT_ERROR && V_Top.vt == VT_ERROR && V_Width.vt == VT_ERROR && V_Height.vt == VT_ERROR)
|
|
{
|
|
// use selection rect
|
|
}
|
|
else
|
|
{
|
|
// error, not all passed in
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCOPY);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_OPTIONALPARAMETERSNEEDED,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_CLIPBOARDCOPY);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( CheckVarLong(V_Left, Left, 0, TRUE, IDH_METHOD_CLIPBOARDCOPY,IDS_BADVAR_RECTANGLEPARMS))
|
|
return;
|
|
if ( CheckVarLong(V_Top, Top, 0, TRUE, IDH_METHOD_CLIPBOARDCOPY,IDS_BADVAR_RECTANGLEPARMS))
|
|
return;
|
|
if ( CheckVarLong(V_Width, Width, 0, TRUE, IDH_METHOD_CLIPBOARDCOPY,IDS_BADVAR_RECTANGLEPARMS))
|
|
return;
|
|
if ( CheckVarLong(V_Height, Height, 0, TRUE, IDH_METHOD_CLIPBOARDCOPY,IDS_BADVAR_RECTANGLEPARMS))
|
|
return;
|
|
// All parms pass Variant data type check...continue
|
|
|
|
// 9604.30 paj Bug6370
|
|
// error, can't have a zero width or height
|
|
if ( (Height == 0) || (Width == 0) )
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCOPY);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_INVALIDRECT,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_CLIPBOARDCOPY);
|
|
return;
|
|
}
|
|
|
|
// use parameters passed in by user - left
|
|
// draw selection rect
|
|
memset(&StartStruct, 0, sizeof(OIOP_START_OPERATION_STRUCT));
|
|
StartStruct.Attributes.uType = OIOP_SELECT_BY_RECT_VARIABLE;
|
|
|
|
// Changed the End Pt calc so that the width & height set with respects
|
|
// to the specified specifed Left and Top values.
|
|
StartPoint.x = (int)Left;
|
|
StartPoint.y = (int)Top;
|
|
EndPoint.x = StartPoint.x + (int)Width;
|
|
EndPoint.y = StartPoint.y + (int)Height;
|
|
fwKeys = 0;
|
|
|
|
// start selection rect
|
|
uFlags = PARM_WINDOW | OIOP_IMAGE_ONLY | PARM_DONT_REPAINT;
|
|
RetCode = OiOpStartOperation(m_hWnd, (LPOIOP_START_OPERATION_STRUCT)&StartStruct,
|
|
StartPoint, fwKeys, uFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCOPY);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// set last point in selection rect
|
|
RetCode = OiOpContinueOperation(m_hWnd, EndPoint, uFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCOPY);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// end the operation
|
|
RetCode = OiOpEndOperation(m_hWnd);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCOPY);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
}
|
|
|
|
// if any existing group list then delete it, make group get recreated
|
|
if (m_lpGroupList != NULL)
|
|
{
|
|
free(m_lpGroupList);
|
|
m_lpGroupList = NULL;
|
|
}
|
|
|
|
// copy to clipboard
|
|
memset(&StartStruct,0,sizeof(OIOP_START_OPERATION_STRUCT));
|
|
StartStruct.Attributes.uType = OIOP_COPY;
|
|
Point.x = 0;
|
|
Point.y = 0;
|
|
fwKeys = (WORD)1;
|
|
uFlags = PARM_WINDOW;
|
|
|
|
RetCode = OiOpStartOperation(m_hWnd, (LPOIOP_START_OPERATION_STRUCT)&StartStruct,
|
|
Point, fwKeys, uFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCOPY);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
void CImgEditCtrl::ClipboardCut(const VARIANT FAR& V_Left, const VARIANT FAR& V_Top,
|
|
const VARIANT FAR& V_Width, const VARIANT FAR& V_Height)
|
|
{
|
|
int RetCode;
|
|
WORD fwKeys;
|
|
POINT StartPoint,EndPoint, Point;
|
|
CString szErr;
|
|
UINT uFlags, HelpIdDef;
|
|
long Left, Top, Width, Height;
|
|
PARM_MARK_ATTRIBUTES_STRUCT MarkAttributesStruct;
|
|
OIOP_START_OPERATION_STRUCT StartStruct;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
// 9602.16 jar initialized
|
|
fwKeys = 0;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCUT);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_CLIPBOARDCUT);
|
|
return;
|
|
}
|
|
// if no selection rect then all parameters are needed
|
|
if (m_bSelectRectangle == FALSE)
|
|
{
|
|
if (V_Left.vt == VT_ERROR || V_Top.vt == VT_ERROR || V_Width.vt == VT_ERROR || V_Height.vt == VT_ERROR)
|
|
{
|
|
// no selection rect drawn, see if any annotation selected
|
|
RetCode = IMGGetParmsCgbw(m_hWnd,PARM_MARK_ATTRIBUTES, (void FAR *)&MarkAttributesStruct, PARM_WINDOW);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCUT);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
// if any parameter passed in then all must be passed in
|
|
if (V_Left.vt == VT_ERROR || V_Top.vt == VT_ERROR || V_Width.vt == VT_ERROR || V_Height.vt == VT_ERROR)
|
|
{
|
|
// at least one not passed in, make sure all not passed in
|
|
if (V_Left.vt == VT_ERROR && V_Top.vt == VT_ERROR && V_Width.vt == VT_ERROR && V_Height.vt == VT_ERROR)
|
|
{
|
|
// use selection rect
|
|
}
|
|
else
|
|
{
|
|
// error, not all passed in
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCUT);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_OPTIONALPARAMETERSNEEDED,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_CLIPBOARDCUT);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( CheckVarLong(V_Left, Left, 0, TRUE, IDH_METHOD_CLIPBOARDCUT,IDS_BADVAR_RECTANGLEPARMS))
|
|
return;
|
|
if ( CheckVarLong(V_Top, Top, 0, TRUE, IDH_METHOD_CLIPBOARDCUT,IDS_BADVAR_RECTANGLEPARMS))
|
|
return;
|
|
if ( CheckVarLong(V_Width, Width, 0, TRUE, IDH_METHOD_CLIPBOARDCUT,IDS_BADVAR_RECTANGLEPARMS))
|
|
return;
|
|
if ( CheckVarLong(V_Height, Height, 0, TRUE, IDH_METHOD_CLIPBOARDCUT,IDS_BADVAR_RECTANGLEPARMS))
|
|
return;
|
|
// All parms pass Variant data type check...continue
|
|
|
|
// 9604.30 paj Bug6370
|
|
// error, can't have a zero width or height
|
|
if ( (Height == 0) || (Width == 0) )
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCUT);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_INVALIDRECT,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_CLIPBOARDCUT);
|
|
return;
|
|
}
|
|
|
|
// use parameters passed in by user - left
|
|
// draw selection rect
|
|
memset(&StartStruct, 0, sizeof(OIOP_START_OPERATION_STRUCT));
|
|
StartStruct.Attributes.uType = OIOP_SELECT_BY_RECT_VARIABLE;
|
|
|
|
// Changed the End Pt calc so that the width & height set with respects
|
|
// to the specified specifed Left and Top values.
|
|
StartPoint.x = (int)Left;
|
|
StartPoint.y = (int)Top;
|
|
EndPoint.x = StartPoint.x + (int)Width;
|
|
EndPoint.y = StartPoint.y + (int)Height;
|
|
fwKeys =(WORD)0;
|
|
|
|
// start selection rect
|
|
uFlags = PARM_WINDOW | OIOP_IMAGE_ONLY | PARM_DONT_REPAINT;
|
|
RetCode = OiOpStartOperation(m_hWnd, (LPOIOP_START_OPERATION_STRUCT)&StartStruct,
|
|
StartPoint, fwKeys, uFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCUT);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// set last point in selection rect
|
|
RetCode = OiOpContinueOperation(m_hWnd, EndPoint, uFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCUT);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// end the operation
|
|
RetCode = OiOpEndOperation(m_hWnd);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCUT);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
}
|
|
|
|
// if any existing group list then delete it, make group get recreated
|
|
if (m_lpGroupList != NULL)
|
|
{
|
|
free(m_lpGroupList);
|
|
m_lpGroupList = NULL;
|
|
}
|
|
|
|
// cut to clipboard
|
|
memset(&StartStruct,0,sizeof(OIOP_START_OPERATION_STRUCT));
|
|
StartStruct.Attributes.uType = (UINT)OIOP_CUT;
|
|
Point.x = 0;
|
|
Point.y = 0;
|
|
fwKeys = (WORD)1;
|
|
uFlags = PARM_WINDOW;
|
|
|
|
RetCode = OiOpStartOperation(m_hWnd, (LPOIOP_START_OPERATION_STRUCT)&StartStruct,
|
|
Point, fwKeys, uFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CLIPBOARDCUT);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
void CImgEditCtrl::DeleteSelectedAnnotations()
|
|
{
|
|
POINT Point;
|
|
int RetCode;
|
|
WORD fwKeys;
|
|
UINT uFlags;
|
|
OIOP_START_OPERATION_STRUCT StartStruct;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
// 9602.16 jar initialized
|
|
fwKeys = 0;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_DELETESELECTEDANNOTATIONS);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_DELETESELECTEDANNOTATIONS);
|
|
return;
|
|
}
|
|
Point.x = 0;
|
|
Point.y = 0;
|
|
uFlags = PARM_WINDOW;
|
|
|
|
// 9605.10 paj Added to allow abort of a paste operation
|
|
if (m_bInPasteMode == TRUE)
|
|
{
|
|
RetCode = OiOpAbortOperation(m_hWnd, uFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DELETESELECTEDANNOTATIONS);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
|
|
m_bInPasteMode = FALSE;
|
|
}
|
|
else
|
|
{
|
|
memset(&StartStruct, 0, sizeof(OIOP_START_OPERATION_STRUCT));
|
|
StartStruct.Attributes.uType = OIOP_DELETE;
|
|
|
|
// delete all selected annotations
|
|
RetCode = OiOpStartOperation(m_hWnd, (LPOIOP_START_OPERATION_STRUCT)&StartStruct,
|
|
Point, fwKeys, uFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DELETESELECTEDANNOTATIONS);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// if any existing group list then delete it, make group get recreated
|
|
if (m_lpGroupList != NULL)
|
|
{
|
|
free(m_lpGroupList);
|
|
m_lpGroupList = NULL;
|
|
}
|
|
|
|
RetCode = OiOpEndOperation(m_hWnd);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DELETESELECTEDANNOTATIONS);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
}
|
|
|
|
m_lStatusCode = (long)SUCCESS;
|
|
}
|
|
|
|
void CImgEditCtrl::Flip()
|
|
{
|
|
int RetCode;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_FLIP);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_FLIP);
|
|
return;
|
|
}
|
|
|
|
RetCode = IMGOrientDisplay(m_hWnd, OD_FLIP, TRUE);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_FLIP);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_lStatusCode = (long)SUCCESS;
|
|
}
|
|
|
|
OLE_COLOR CImgEditCtrl::GetSelectedAnnotationBackColor()
|
|
{
|
|
int RetCode;
|
|
PARM_MARK_ATTRIBUTES_STRUCT MarkAttributesStruct;
|
|
BYTE RedValue,GreenValue,BlueValue;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONBACKCOLOR);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_GETSELECTEDANNOTATIONBACKCOLOR);
|
|
return 0;
|
|
}
|
|
|
|
// make sure mark is selected and get text attachment color
|
|
RetCode = IMGGetParmsCgbw(m_hWnd,PARM_MARK_ATTRIBUTES, (void FAR *)&MarkAttributesStruct, PARM_WINDOW);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONBACKCOLOR);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return 0;
|
|
}
|
|
|
|
// make sure text attachment mark
|
|
if (MarkAttributesStruct.Attributes.uType != OIOP_AN_ATTACH_A_NOTE)
|
|
{
|
|
// invalid annotation type
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONBACKCOLOR);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_INVALIDANNOTATIONSELECTED,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_GETSELECTEDANNOTATIONBACKCOLOR);
|
|
return 0;
|
|
}
|
|
|
|
RedValue = GetRValue(MarkAttributesStruct.Attributes.rgbColor1.rgbRed);
|
|
GreenValue = GetRValue(MarkAttributesStruct.Attributes.rgbColor1.rgbGreen);
|
|
BlueValue = GetRValue(MarkAttributesStruct.Attributes.rgbColor1.rgbBlue);
|
|
|
|
m_lStatusCode = (long)SUCCESS;
|
|
return RGB(RedValue, GreenValue, BlueValue);
|
|
}
|
|
|
|
short CImgEditCtrl::GetSelectedAnnotationFillStyle()
|
|
{
|
|
int RetCode;
|
|
PARM_MARK_ATTRIBUTES_STRUCT MarkAttributesStruct;
|
|
short FillStyle;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONFILLSTYLE);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_GETSELECTEDANNOTATIONFILLSTYLE);
|
|
return NULL;
|
|
}
|
|
// make sure mark is selected and get fill style
|
|
RetCode = IMGGetParmsCgbw(m_hWnd,PARM_MARK_ATTRIBUTES, (void FAR *)&MarkAttributesStruct, PARM_WINDOW);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONFILLSTYLE);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return 0;
|
|
}
|
|
|
|
// make sure filled rect, image embedded or image by reference
|
|
if (!(MarkAttributesStruct.Attributes.uType == OIOP_AN_FILLED_RECT ||
|
|
MarkAttributesStruct.Attributes.uType == OIOP_AN_IMAGE ||
|
|
MarkAttributesStruct.Attributes.uType == OIOP_AN_IMAGE_BY_REFERENCE))
|
|
{
|
|
// invalid annotation type
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONFILLSTYLE);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_INVALIDANNOTATIONSELECTED, szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_GETSELECTEDANNOTATIONFILLSTYLE);
|
|
return 0;
|
|
}
|
|
|
|
if (MarkAttributesStruct.Attributes.uType == OIOP_AN_FILLED_RECT)
|
|
{
|
|
if (MarkAttributesStruct.Attributes.bHighlighting == TRUE)
|
|
FillStyle = OI_TRANSPARENT;
|
|
else
|
|
FillStyle = OI_OPAQUE;
|
|
}
|
|
else
|
|
{
|
|
if (MarkAttributesStruct.Attributes.bTransparent == TRUE)
|
|
FillStyle = OI_TRANSPARENT;
|
|
else
|
|
FillStyle = OI_OPAQUE;
|
|
}
|
|
m_lStatusCode = (long)SUCCESS;
|
|
return FillStyle;
|
|
}
|
|
|
|
LPFONTDISP CImgEditCtrl::GetSelectedAnnotationFont()
|
|
{
|
|
int RetCode;
|
|
PARM_MARK_ATTRIBUTES_STRUCT MarkAttributesStruct;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONFONT);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_GETSELECTEDANNOTATIONFONT);
|
|
return NULL;
|
|
}
|
|
// make sure mark is selected and get font attributes
|
|
RetCode = IMGGetParmsCgbw(m_hWnd,PARM_MARK_ATTRIBUTES, (void FAR *)&MarkAttributesStruct, PARM_WINDOW);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONFONT);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return NULL;
|
|
}
|
|
|
|
if (!(MarkAttributesStruct.Attributes.uType == OIOP_AN_TEXT ||
|
|
MarkAttributesStruct.Attributes.uType == OIOP_AN_TEXT_FROM_A_FILE ||
|
|
MarkAttributesStruct.Attributes.uType == OIOP_AN_TEXT_STAMP ||
|
|
MarkAttributesStruct.Attributes.uType == OIOP_AN_ATTACH_A_NOTE))
|
|
{
|
|
// invalid annotation type
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONFONT);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_INVALIDANNOTATIONSELECTED, szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_GETSELECTEDANNOTATIONFONT);
|
|
return NULL;
|
|
}
|
|
BSTR lpBuffer;
|
|
char Buffer[50];
|
|
CY Size;
|
|
|
|
SelectedAnnotationFont.InitializeFont(&_fontdescHeading, NULL);
|
|
|
|
lpBuffer = (BSTR)Buffer;
|
|
// set the selected font name
|
|
// 9604.30 paj needed for NT Bug6368
|
|
_tcscpy((LPTSTR)lpBuffer, (LPCTSTR)MarkAttributesStruct.Attributes.lfFont.lfFaceName);
|
|
int Length = 0;
|
|
LPOLESTR lpOleString;
|
|
MakeUnicodeString( (LPTSTR)lpBuffer, &lpOleString, &Length);
|
|
SelectedAnnotationFont.m_pFont->put_Name(lpOleString);
|
|
FreeUnicodeString( &lpOleString);
|
|
|
|
// set the selected font size
|
|
Size.Hi = 0;
|
|
Size.Lo = MarkAttributesStruct.Attributes.lfFont.lfHeight;
|
|
Size.Lo *= 10000;
|
|
SelectedAnnotationFont.m_pFont->put_Size(Size);
|
|
|
|
// set selected font bold characteristics
|
|
if (MarkAttributesStruct.Attributes.lfFont.lfWeight == FW_BOLD)
|
|
SelectedAnnotationFont.m_pFont->put_Bold(TRUE);
|
|
else
|
|
SelectedAnnotationFont.m_pFont->put_Bold(FALSE);
|
|
|
|
// set italic
|
|
if (MarkAttributesStruct.Attributes.lfFont.lfItalic == TRUE)
|
|
SelectedAnnotationFont.m_pFont->put_Italic(TRUE);
|
|
else
|
|
SelectedAnnotationFont.m_pFont->put_Italic(FALSE);
|
|
|
|
// set font strikethru
|
|
if (MarkAttributesStruct.Attributes.lfFont.lfStrikeOut == TRUE)
|
|
SelectedAnnotationFont.m_pFont->put_Strikethrough(TRUE);
|
|
else
|
|
SelectedAnnotationFont.m_pFont->put_Strikethrough(FALSE);
|
|
|
|
// set font underline
|
|
if (MarkAttributesStruct.Attributes.lfFont.lfUnderline == TRUE)
|
|
SelectedAnnotationFont.m_pFont->put_Underline(TRUE);
|
|
else
|
|
SelectedAnnotationFont.m_pFont->put_Underline(FALSE);
|
|
|
|
m_lStatusCode =(long)SUCCESS;
|
|
return SelectedAnnotationFont.GetFontDispatch();
|
|
}
|
|
|
|
|
|
BSTR CImgEditCtrl::GetSelectedAnnotationImage()
|
|
{
|
|
int RetCode;
|
|
PARM_MARK_ATTRIBUTES_STRUCT MarkAttributesStruct;
|
|
LPPARM_NAMED_BLOCK_STRUCT lpNamedBlock;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONIMAGE);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_GETSELECTEDANNOTATIONIMAGE);
|
|
return NULL;
|
|
}
|
|
// make sure mark is selected and get image name
|
|
RetCode = IMGGetParmsCgbw(m_hWnd,PARM_MARK_ATTRIBUTES, (void FAR *)&MarkAttributesStruct, PARM_WINDOW);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONIMAGE);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return NULL;
|
|
}
|
|
|
|
// make sure image embedded or image by reference
|
|
if (!(MarkAttributesStruct.Attributes.uType == OIOP_AN_IMAGE ||
|
|
MarkAttributesStruct.Attributes.uType == OIOP_AN_IMAGE_BY_REFERENCE))
|
|
{
|
|
// invalid annotation type
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONIMAGE);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_INVALIDANNOTATIONSELECTED, szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_GETSELECTEDANNOTATIONIMAGE);
|
|
return NULL;
|
|
}
|
|
|
|
lpNamedBlock = (LPPARM_NAMED_BLOCK_STRUCT) malloc(sizeof(PARM_NAMED_BLOCK_STRUCT));
|
|
if (lpNamedBlock == NULL)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONIMAGE);
|
|
m_lStatusCode = ErrMap::Xlate(CTL_E_OUTOFMEMORY,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_GETSELECTEDANNOTATIONIMAGE);
|
|
return NULL;
|
|
}
|
|
|
|
// get the named block for OiFilNam which will contain the image name
|
|
_mbscpy((unsigned char *)lpNamedBlock->szBlockName, (const unsigned char *)"OiFilNam");
|
|
lpNamedBlock->uScope = NB_SCOPE_SELECTED_MARKS;
|
|
lpNamedBlock->uNumberOfBlocks = 1;
|
|
RetCode = IMGGetParmsCgbw(m_hWnd, PARM_NAMED_BLOCK, (void FAR *)lpNamedBlock, NULL);
|
|
if (RetCode != 0)
|
|
{
|
|
free(lpNamedBlock);
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONIMAGE);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return NULL;
|
|
}
|
|
|
|
CString SelectedAnnotationImage = lpNamedBlock->Block[0].lpBlock;
|
|
free(lpNamedBlock);
|
|
m_lStatusCode = (long)SUCCESS;
|
|
return SelectedAnnotationImage.AllocSysString();
|
|
}
|
|
|
|
short CImgEditCtrl::GetSelectedAnnotationLineStyle()
|
|
{
|
|
int RetCode;
|
|
PARM_MARK_ATTRIBUTES_STRUCT MarkAttributesStruct;
|
|
short LineStyle;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONLINESTYLE);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_GETSELECTEDANNOTATIONLINESTYLE);
|
|
return NULL;
|
|
}
|
|
// make sure mark is selected and get line style
|
|
RetCode = IMGGetParmsCgbw(m_hWnd,PARM_MARK_ATTRIBUTES, (void FAR *)&MarkAttributesStruct, PARM_WINDOW);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONLINESTYLE);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return 0;
|
|
}
|
|
|
|
// make sure line, freehand or hollow rect
|
|
if (!(MarkAttributesStruct.Attributes.uType == OIOP_AN_HOLLOW_RECT ||
|
|
MarkAttributesStruct.Attributes.uType == OIOP_AN_LINE ||
|
|
MarkAttributesStruct.Attributes.uType == OIOP_AN_FREEHAND))
|
|
{
|
|
// invalid annotation type
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONLINESTYLE);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_INVALIDANNOTATIONSELECTED, szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_GETSELECTEDANNOTATIONLINESTYLE);
|
|
return 0;
|
|
}
|
|
// get line style
|
|
if (MarkAttributesStruct.Attributes.bHighlighting == TRUE)
|
|
LineStyle = OI_TRANSPARENT;
|
|
else
|
|
LineStyle = OI_OPAQUE;
|
|
|
|
m_lStatusCode = SUCCESS;
|
|
return LineStyle;
|
|
}
|
|
|
|
short CImgEditCtrl::GetSelectedAnnotationLineWidth()
|
|
{
|
|
int RetCode;
|
|
PARM_MARK_ATTRIBUTES_STRUCT MarkAttributesStruct;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONLINEWIDTH);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_GETSELECTEDANNOTATIONLINEWIDTH);
|
|
return NULL;
|
|
}
|
|
// make sure mark is selected and get line width
|
|
RetCode = IMGGetParmsCgbw(m_hWnd,PARM_MARK_ATTRIBUTES, (void FAR *)&MarkAttributesStruct, PARM_WINDOW);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONLINEWIDTH);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return 0;
|
|
}
|
|
|
|
// make sure line, freehand or hollow rect
|
|
if (!(MarkAttributesStruct.Attributes.uType == OIOP_AN_HOLLOW_RECT ||
|
|
MarkAttributesStruct.Attributes.uType == OIOP_AN_LINE ||
|
|
MarkAttributesStruct.Attributes.uType == OIOP_AN_FREEHAND))
|
|
{
|
|
// invalid annotation type
|
|
szErr.LoadString(IDS_BADMETH_GETSELECTEDANNOTATIONLINEWIDTH);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_INVALIDANNOTATIONSELECTED, szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_GETSELECTEDANNOTATIONLINEWIDTH);
|
|
return 0;
|
|
}
|
|
m_lStatusCode = SUCCESS;
|
|
// return line width
|
|
return (short)MarkAttributesStruct.Attributes.uLineSize;
|
|
}
|
|
|
|
|
|
BOOL CImgEditCtrl::IsClipboardDataAvailable()
|
|
{
|
|
m_lStatusCode = SUCCESS;
|
|
|
|
// use wangannotatedimage - it does image and/or annotation - depending on what was copied.
|
|
// O/i supports CF_DIB also.
|
|
if (IsClipboardFormatAvailable(CF_DIB) ||
|
|
IsClipboardFormatAvailable(uWangAnnotatedImageFormat))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
void CImgEditCtrl::Refresh()
|
|
{
|
|
WORD wFlags;
|
|
int RetCode;
|
|
PARM_SCROLL_STRUCT Scroll;
|
|
CONV_RESOLUTION_STRUCT ConvResolutionStruct;
|
|
UINT Scale,ImageType,ImagePalette;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
BOOL bRefreshAll;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_REFRESH);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_REFRESH);
|
|
return;
|
|
}
|
|
|
|
// set flag to refresh whole screen
|
|
bRefreshAll = TRUE;
|
|
|
|
if (m_bZoomFactorChange == TRUE)
|
|
{
|
|
Scale = (UINT) (m_fpZoom * 10);
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE, (void FAR *)&Scale, NULL);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_REFRESH);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_bZoomFactorChange = FALSE;
|
|
}
|
|
|
|
if (m_bImageResolutionChange == TRUE)
|
|
{
|
|
wFlags = (WORD)NULL;
|
|
// X & Y RES member variables are set to 0 at construction. This test is being
|
|
// put in due to a bug that occurs when the Refresh method is called but the
|
|
// SetImageResX or Y is not called and therefore the value was undefined...causing
|
|
// IMGConvertImage to run out of memory.
|
|
if (m_lImageResolutionX == 0 )
|
|
ConvResolutionStruct.uHRes = (UINT)GetImageResolutionX();
|
|
else
|
|
ConvResolutionStruct.uHRes = (UINT)m_lImageResolutionX;
|
|
|
|
if (m_lImageResolutionY == 0 )
|
|
ConvResolutionStruct.uVRes = (UINT)GetImageResolutionY();
|
|
else
|
|
ConvResolutionStruct.uVRes = (UINT)m_lImageResolutionY;
|
|
|
|
ConvResolutionStruct.uScaleAlgorithm = OI_SCALE_ALG_NORMAL; // use normal decimation
|
|
RetCode = IMGConvertImage(m_hWnd, CONV_RESOLUTION, (void far *)&ConvResolutionStruct, wFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_REFRESH);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_bImageResolutionChange = FALSE;
|
|
}
|
|
|
|
if (m_bScrollPositionChange == TRUE)
|
|
{
|
|
Scroll.lHorz = m_ScrollPositionX;
|
|
Scroll.lVert = m_ScrollPositionY;
|
|
wFlags = (WORD) PARM_PIXEL | PARM_ABSOLUTE | PARM_SCALED;
|
|
// move to new position in image
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCROLL, (void FAR *)&Scroll, wFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_REFRESH);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_bScrollPositionChange = FALSE;
|
|
bRefreshAll = FALSE;
|
|
FireScroll();
|
|
}
|
|
// check for DisplayScale Algorithm change
|
|
if (m_bDisplayScaleAlgChange == TRUE)
|
|
{
|
|
PARM_SCALE_ALGORITHM_STRUCT ScaleAlg;
|
|
|
|
RetCode = IMGGetParmsCgbw(m_hWnd, PARM_IMAGE_TYPE, &ImageType, NULL);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_REFRESH);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
|
|
switch(m_nDisplayScaleAlgorithm)
|
|
{
|
|
case NORMAL:
|
|
ScaleAlg.uScaleAlgorithm = OI_SCALE_ALG_NORMAL;
|
|
break;
|
|
|
|
case GRAY4:
|
|
ScaleAlg.uScaleAlgorithm = OI_SCALE_ALG_AVERAGE_TO_GRAY4;
|
|
break;
|
|
|
|
case GRAY8:
|
|
ScaleAlg.uScaleAlgorithm = OI_SCALE_ALG_AVERAGE_TO_GRAY8;
|
|
break;
|
|
|
|
case STAMP:
|
|
ScaleAlg.uScaleAlgorithm = OI_SCALE_ALG_STAMP;
|
|
break;
|
|
|
|
case OPTIMIZE:
|
|
if (ImageType == ITYPE_BI_LEVEL || ImageType == ITYPE_GRAY4 || ImageType == ITYPE_GRAY8)
|
|
ScaleAlg.uScaleAlgorithm = OI_SCALE_ALG_AVERAGE_TO_GRAY8;
|
|
else
|
|
ScaleAlg.uScaleAlgorithm = OI_SCALE_ALG_NORMAL;
|
|
break;
|
|
} // end switch
|
|
|
|
// if my stored o/i setting for each image tpye are the same as the current image type then we
|
|
// don't do anything, else set new o/i defaults and store in my settings. Then call o/i.
|
|
RetCode = 0;
|
|
switch(ImageType)
|
|
{
|
|
case ITYPE_BI_LEVEL:
|
|
if (m_uBiLevelScaleAlg != ScaleAlg.uScaleAlgorithm)
|
|
{
|
|
ScaleAlg.uImageFlags = ITYPE_BI_LEVEL;
|
|
m_uBiLevelScaleAlg = ScaleAlg.uScaleAlgorithm;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE_ALGORITHM, &ScaleAlg, PARM_WINDOW_DEFAULT);
|
|
}
|
|
break;
|
|
|
|
case ITYPE_GRAY4:
|
|
if (m_uGray4ScaleAlg != ScaleAlg.uScaleAlgorithm)
|
|
{
|
|
ScaleAlg.uImageFlags = ITYPE_GRAY4;
|
|
m_uGray4ScaleAlg = ScaleAlg.uScaleAlgorithm;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE_ALGORITHM, &ScaleAlg, PARM_WINDOW_DEFAULT);
|
|
}
|
|
break;
|
|
|
|
case ITYPE_GRAY8:
|
|
if (m_uGray8ScaleAlg != ScaleAlg.uScaleAlgorithm)
|
|
{
|
|
ScaleAlg.uImageFlags = ITYPE_GRAY8;
|
|
m_uGray8ScaleAlg = ScaleAlg.uScaleAlgorithm;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE_ALGORITHM, &ScaleAlg, PARM_WINDOW_DEFAULT);
|
|
}
|
|
break;
|
|
|
|
case ITYPE_PAL4:
|
|
if (m_uPal4ScaleAlg != ScaleAlg.uScaleAlgorithm)
|
|
{
|
|
ScaleAlg.uImageFlags = ITYPE_PAL4;
|
|
m_uPal4ScaleAlg = ScaleAlg.uScaleAlgorithm;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE_ALGORITHM, &ScaleAlg, PARM_WINDOW_DEFAULT);
|
|
}
|
|
break;
|
|
|
|
case ITYPE_PAL8:
|
|
if (m_uPal8ScaleAlg != ScaleAlg.uScaleAlgorithm)
|
|
{
|
|
ScaleAlg.uImageFlags = ITYPE_PAL8;
|
|
m_uPal8ScaleAlg = ScaleAlg.uScaleAlgorithm;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE_ALGORITHM, &ScaleAlg, PARM_WINDOW_DEFAULT);
|
|
}
|
|
break;
|
|
|
|
case ITYPE_RGB24:
|
|
if (m_uRGB24ScaleAlg != ScaleAlg.uScaleAlgorithm)
|
|
{
|
|
ScaleAlg.uImageFlags = ITYPE_RGB24;
|
|
m_uRGB24ScaleAlg = ScaleAlg.uScaleAlgorithm;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE_ALGORITHM, &ScaleAlg, PARM_WINDOW_DEFAULT);
|
|
}
|
|
break;
|
|
|
|
case ITYPE_BGR24:
|
|
if (m_uBGR24ScaleAlg != ScaleAlg.uScaleAlgorithm)
|
|
{
|
|
ScaleAlg.uImageFlags = ITYPE_BGR24;
|
|
m_uBGR24ScaleAlg = ScaleAlg.uScaleAlgorithm;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCALE_ALGORITHM, &ScaleAlg, PARM_WINDOW_DEFAULT);
|
|
}
|
|
break;
|
|
} // end switch
|
|
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_REFRESH);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_bDisplayScaleAlgChange = FALSE;
|
|
}
|
|
|
|
if (m_bImagePaletteChange == TRUE)
|
|
{
|
|
switch(m_nImagePalette)
|
|
{
|
|
case CUSTOM_PALETTE:
|
|
ImagePalette = DISP_PALETTE_CUSTOM;
|
|
break;
|
|
case COMMON_PALETTE:
|
|
ImagePalette = DISP_PALETTE_COMMON;
|
|
break;
|
|
case GRAY8_PALETTE:
|
|
ImagePalette = DISP_PALETTE_GRAY8;
|
|
break;
|
|
case RGB24_PALETTE:
|
|
ImagePalette = DISP_PALETTE_RGB24;
|
|
break;
|
|
case BLACK_AND_WHITE_PALETTE:
|
|
ImagePalette = DISP_PALETTE_BW;
|
|
break;
|
|
} // end switch
|
|
|
|
// give O/i the palette settings
|
|
wFlags = (WORD)PARM_IMAGE;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_DISPLAY_PALETTE, &ImagePalette, wFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_REFRESH);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_bImagePaletteChange = FALSE;
|
|
}
|
|
|
|
// repaint the image
|
|
if (bRefreshAll == TRUE)
|
|
RetCode = IMGRepaintDisplay(m_hWnd, (LPRECT)-1);
|
|
else
|
|
RetCode = IMGRepaintDisplay(m_hWnd, NULL);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_REFRESH);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
|
|
// do scroll bars last
|
|
if (m_bScrollBarsChange == TRUE)
|
|
{
|
|
if (m_bScrollBars == TRUE)
|
|
IMGEnableScrollBar(m_hWnd);
|
|
else
|
|
IMGDisableScrollBar(m_hWnd);
|
|
m_bScrollBarsChange = FALSE;
|
|
}
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
void CImgEditCtrl::RotateLeft()
|
|
{
|
|
int RetCode;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_ROTATELEFT);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_ROTATELEFT);
|
|
return;
|
|
}
|
|
|
|
RetCode = IMGOrientDisplay(m_hWnd, OD_ROTLEFT, TRUE);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_ROTATELEFT);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
void CImgEditCtrl::RotateRight()
|
|
{
|
|
int RetCode;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_ROTATERIGHT);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr,IDH_METHOD_ROTATERIGHT);
|
|
return;
|
|
}
|
|
RetCode = IMGOrientDisplay(m_hWnd, OD_ROTRIGHT, TRUE);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_ROTATERIGHT);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
void CImgEditCtrl::ScrollImage(short Direction, long ScrollAmount)
|
|
{
|
|
int RetCode=0;
|
|
PARM_SCROLL_STRUCT ScrollPos;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (Direction < DOWN || Direction > LEFT)
|
|
{
|
|
// Invalid parm passed to this method
|
|
szErr.LoadString(IDS_BADMETH_SCROLLIMAGE);
|
|
m_lStatusCode = ErrMap::Xlate(CTL_E_ILLEGALFUNCTIONCALL,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_SCROLLIMAGE);
|
|
return;
|
|
}
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_SCROLLIMAGE);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_SCROLLIMAGE);
|
|
return;
|
|
}
|
|
switch(Direction)
|
|
{
|
|
case DOWN:
|
|
case UP:
|
|
if (Direction == UP)
|
|
ScrollAmount *= -1;
|
|
ScrollPos.lVert = ScrollAmount;
|
|
ScrollPos.lHorz = 0;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCROLL, &ScrollPos,
|
|
PARM_PIXEL | PARM_WINDOW | PARM_REPAINT);
|
|
break;
|
|
|
|
case RIGHT:
|
|
case LEFT:
|
|
if (Direction == LEFT)
|
|
ScrollAmount *= -1;
|
|
ScrollPos.lHorz = ScrollAmount;
|
|
ScrollPos.lVert = 0;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_SCROLL, &ScrollPos,
|
|
PARM_PIXEL | PARM_WINDOW | PARM_REPAINT);
|
|
break;
|
|
} // end switch
|
|
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_SCROLLIMAGE);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef);
|
|
return;
|
|
}
|
|
// Fire scroll event to container
|
|
FireScroll();
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
void CImgEditCtrl::SelectAnnotationGroup(LPCTSTR GroupName)
|
|
{
|
|
int RetCode;
|
|
char Group[ANNOTATION_GROUP_SIZE];
|
|
UINT HelpIdDef;
|
|
CString szErr;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_SELECTANNOTATIONGROUP);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_SELECTANNOTATIONGROUP);
|
|
return;
|
|
}
|
|
// save current annotation status
|
|
RetCode = SaveAnnotationStatus();
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_SELECTANNOTATIONGROUP);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef);
|
|
return;
|
|
}
|
|
// deselecte all annotations
|
|
RetCode = OiAnSelectByMarkAttrib(m_hWnd, NULL, NULL, FALSE, TRUE, OIAN_SELECT_ALL);
|
|
if (RetCode != 0)
|
|
{
|
|
RestoreAnnotationStatus();
|
|
szErr.LoadString(IDS_BADMETH_SELECTANNOTATIONGROUP);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
|
|
// select all annotations by group name
|
|
_mbscpy((unsigned char *)Group, (const unsigned char *)GroupName);
|
|
RetCode = OiAnSelectByMarkNamedBlock(m_hWnd, "OiGroup\0", Group, _mbstrlen((const char *)Group) + 1, TRUE, TRUE, OIAN_REPAINT);
|
|
if (RetCode != 0)
|
|
{
|
|
RestoreAnnotationStatus();
|
|
szErr.LoadString(IDS_BADMETH_SELECTANNOTATIONGROUP);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
|
|
|
|
void CImgEditCtrl::DrawSelectionRect(OLE_XPOS_PIXELS Left, OLE_YPOS_PIXELS Top, OLE_XSIZE_PIXELS Width, OLE_YSIZE_PIXELS Height)
|
|
{
|
|
POINT StartPoint,EndPoint;
|
|
int RetCode;
|
|
WORD fwKeys;
|
|
UINT uFlags;
|
|
OIOP_START_OPERATION_STRUCT StartStruct;
|
|
UINT HelpIdDef;
|
|
CString szErr;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
// 9602.16 jar initialized
|
|
fwKeys = 0;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_DRAWSELECTIONRECT);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_DRAWSELECTIONRECT);
|
|
return;
|
|
}
|
|
|
|
memset(&StartStruct, 0, sizeof(OIOP_START_OPERATION_STRUCT));
|
|
StartStruct.Attributes.uType = OIOP_SELECT_BY_RECT_VARIABLE;
|
|
|
|
// SDW - BUG 3,251
|
|
// Changed the End Pt calc so that the width & height set with respects
|
|
// to the specified specifed Left and Top values.
|
|
StartPoint.x = (int)Left;
|
|
StartPoint.y = (int)Top;
|
|
EndPoint.x = StartPoint.x + (int)Width;
|
|
EndPoint.y = StartPoint.y + (int)Height;
|
|
fwKeys = 0;
|
|
|
|
// start selection rect
|
|
uFlags = PARM_WINDOW | OIOP_IMAGE_ONLY;
|
|
RetCode = OiOpStartOperation(m_hWnd, (LPOIOP_START_OPERATION_STRUCT)&StartStruct,
|
|
StartPoint, fwKeys, uFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DRAWSELECTIONRECT);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// set last point in selection rect
|
|
RetCode = OiOpContinueOperation(m_hWnd, EndPoint, uFlags);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DRAWSELECTIONRECT);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// end the operation
|
|
RetCode = OiOpEndOperation(m_hWnd);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DRAWSELECTIONRECT);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
// send selection rect event
|
|
m_bSelectRectangle = TRUE;
|
|
FireSelectionRectDrawn(Left, Top, Width, Height);
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
// 8/95
|
|
// This is a currently an Undocumented function solely for the support of AWD files
|
|
//
|
|
void CImgEditCtrl::RotateAll(const VARIANT FAR& V_Degrees)
|
|
{
|
|
int RetCode;
|
|
long Degrees;
|
|
BOOL bArchiveStatus;
|
|
CString szErr;
|
|
UINT Rotation;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
// WE NEED THE IMAGE TO BE DISPLAYED. If the display flag is false, call IamgeInWindow
|
|
// to get the latest status
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
// NO IMAGE DISPLAYED, ERROR OUT
|
|
if (m_bImageInWindow == FALSE )
|
|
{
|
|
HelpIdDef = 0;
|
|
szErr.LoadString(IDS_BADPROP_NOIMAGEINWND);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGESPECIFIED,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_ROTATEALL);
|
|
return;
|
|
}
|
|
// Check the Variant parm V_Degrees to insure that it is a short
|
|
// If V_Degrees == VT_ERROR, this will not throw an error
|
|
// Default value for Degrees = ROTATE_ALL90
|
|
if ( CheckVarLong(V_Degrees, Degrees, ROTATE_ALL90, FALSE,IDH_METHOD_ROTATEALL,IDS_BADVAR_ROTATEALL))
|
|
return;
|
|
|
|
// Parm is the correct type but is it a valid value....
|
|
if ( Degrees == ROTATE_ALL90 || Degrees == ROTATE_ALL180 || Degrees == ROTATE_ALL270 )
|
|
{
|
|
RetCode = OiRotateAllPages(m_hWnd,(LPSTR)m_strImage.GetBuffer(MAXFILESPECLENGTH),
|
|
(int)Degrees, NULL);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_ROTATEALL);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(CTL_E_ILLEGALFUNCTIONCALL,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_ROTATEALL);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{ // DEGREES PARM IS NOT A VALID VALUE...ERROR OUT
|
|
szErr.LoadString(IDS_BADVAR_DEGREES);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(CTL_E_ILLEGALFUNCTIONCALL,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_ROTATEALL);
|
|
return;
|
|
}
|
|
|
|
// Rotate the currently displayed image, all other pages are rotated in the file
|
|
if (Degrees == ROTATE_ALL90)
|
|
Rotation = OD_ROTRIGHT;
|
|
else if (Degrees == ROTATE_ALL180)
|
|
Rotation = OD_FLIP;
|
|
else
|
|
Rotation = OD_ROTLEFT;
|
|
|
|
// Get the current state of the the image modification bit ARCHIVE BIT
|
|
RetCode = IMGGetParmsCgbw(m_hWnd, PARM_ARCHIVE, &bArchiveStatus, NULL);
|
|
if (RetCode)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_ROTATEALL);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(CTL_E_ILLEGALFUNCTIONCALL,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_ROTATEALL);
|
|
return;
|
|
}
|
|
// Instead of spending the time to fetch the rotated image file from disk, we simply
|
|
// display the image buffer
|
|
RetCode = IMGOrientDisplay(m_hWnd, Rotation, TRUE);
|
|
if (RetCode)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_DISPLAY);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_DISPLAY);
|
|
return;
|
|
}
|
|
|
|
// Set the current state of the the image modification bit ARCHIVE BIT to what it's
|
|
// value was prior to the Orientation call
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_ARCHIVE, &bArchiveStatus, NULL);
|
|
if (RetCode)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_ROTATEALL);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(CTL_E_ILLEGALFUNCTIONCALL,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_ROTATEALL);
|
|
return;
|
|
}
|
|
|
|
m_lStatusCode = (long)SUCCESS;
|
|
return;
|
|
}
|
|
|
|
void CImgEditCtrl::EditSelectedAnnotationText(long Left, long Top)
|
|
{
|
|
int RetCode;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
PARM_MARK_ATTRIBUTES_STRUCT MarkAttributes;
|
|
LPPARM_NAMED_BLOCK_STRUCT lpTextNamedBlock;
|
|
LPOIAN_TEXTPRIVDATA lpTextPrivData;
|
|
BOOL bCancelPressed=FALSE;
|
|
long lStatusCode;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
{
|
|
// no image in window
|
|
szErr.LoadString(IDS_BADMETH_EDITSELECTEDANNOTATIONTEXT);
|
|
m_lStatusCode = ErrMap::Xlate(WICTL_E_NOIMAGEINWINDOW,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_EDITSELECTEDANNOTATIONTEXT);
|
|
return;
|
|
}
|
|
|
|
// get the named block for the selected annotation
|
|
lpTextNamedBlock = (LPPARM_NAMED_BLOCK_STRUCT) malloc(sizeof(PARM_NAMED_BLOCK_STRUCT));
|
|
if (lpTextNamedBlock == NULL)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_EDITSELECTEDANNOTATIONTEXT);
|
|
m_lStatusCode = ErrMap::Xlate(CTL_E_OUTOFMEMORY, szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_EDITSELECTEDANNOTATIONTEXT);
|
|
return;
|
|
}
|
|
|
|
_mbscpy((unsigned char *)lpTextNamedBlock->szBlockName, (const unsigned char *)"OiAnText\0");
|
|
lpTextNamedBlock->uScope = NB_SCOPE_SELECTED_MARKS;
|
|
lpTextNamedBlock->uNumberOfBlocks = 1;
|
|
// get text
|
|
RetCode = IMGGetParmsCgbw(m_hWnd,PARM_NAMED_BLOCK, (void FAR *)lpTextNamedBlock, NULL);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_EDITSELECTEDANNOTATIONTEXT);
|
|
m_lStatusCode = ErrMap::Xlate(RetCode, szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_EDITSELECTEDANNOTATIONTEXT);
|
|
return;
|
|
}
|
|
|
|
// if more than one text mark selected then an error
|
|
if (lpTextNamedBlock->uNumberOfBlocks != 1)
|
|
{
|
|
free(lpTextNamedBlock);
|
|
szErr.LoadString(IDS_BADMETH_EDITSELECTEDANNOTATIONTEXT);
|
|
m_lStatusCode = WICTL_E_INVALIDANNOTATIONSELECTED;
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_EDITSELECTEDANNOTATIONTEXT);
|
|
return;
|
|
}
|
|
|
|
// need mark type and font
|
|
RetCode = IMGGetParmsCgbw(m_hWnd, PARM_MARK_ATTRIBUTES,
|
|
(void FAR *)&MarkAttributes, PARM_WINDOW);
|
|
if (RetCode)
|
|
{
|
|
free(lpTextNamedBlock);
|
|
szErr.LoadString(IDS_BADMETH_EDITSELECTEDANNOTATIONTEXT);
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_EDITSELECTEDANNOTATIONTEXT);
|
|
return;
|
|
}
|
|
|
|
// get pointer into existing data
|
|
lpTextPrivData = (LPOIAN_TEXTPRIVDATA)lpTextNamedBlock->Block[0].lpBlock;
|
|
|
|
// show edit dialog box
|
|
lStatusCode = ShowAnoTextDlg(MarkAttributes.Attributes.lfFont, MarkAttributes.Attributes.uType,
|
|
szErr, lpTextPrivData->szAnoText,
|
|
(LRECT *)&(MarkAttributes.Attributes.lrBounds),
|
|
MarkAttributes.Attributes.rgbColor1, TRUE,
|
|
lpTextPrivData->nCurrentOrientation);
|
|
if (lStatusCode != 0)
|
|
{
|
|
if (lStatusCode == CANCELPRESSED)
|
|
{
|
|
bCancelPressed = TRUE;
|
|
}
|
|
else
|
|
{
|
|
szErr.LoadString(IDS_ERR_INTERNALERROR);
|
|
m_lStatusCode = WICTL_E_INTERNALERROR;
|
|
free(lpTextNamedBlock);
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_EDITSELECTEDANNOTATIONTEXT);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// 9606.07 jar i did this!
|
|
// upon return from the text dialog, the rect will be updated automagically
|
|
memset( &(MarkAttributes.Enables), 0,
|
|
sizeof ( OIAN_MARK_ATTRIBUTE_ENABLES));
|
|
|
|
MarkAttributes.Enables.bBounds = TRUE;
|
|
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_MARK_ATTRIBUTES,
|
|
(void FAR *)&MarkAttributes, PARM_WINDOW);
|
|
if (RetCode != 0)
|
|
{
|
|
free(m_lpText);
|
|
szErr.LoadString(IDS_ERR_INTERNALERROR);
|
|
HelpIdDef = 0;
|
|
lStatusCode = ErrMap::Xlate(RetCode,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
FireErrorEdit(lStatusCode, szErr, HelpIdDef);
|
|
return;
|
|
}
|
|
|
|
if (bCancelPressed == TRUE)
|
|
{
|
|
free(lpTextNamedBlock);
|
|
m_lStatusCode = SUCCESS;
|
|
return;
|
|
}
|
|
|
|
// replace text with new text
|
|
RetCode = ReplaceTextAnnotation(NB_SCOPE_SELECTED_MARKS);
|
|
if (RetCode)
|
|
{
|
|
free(lpTextNamedBlock);
|
|
szErr.LoadString(IDS_BADMETH_EDITSELECTEDANNOTATIONTEXT);
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_EDITSELECTEDANNOTATIONTEXT);
|
|
return;
|
|
}
|
|
|
|
free(lpTextNamedBlock);
|
|
m_lStatusCode = (long)SUCCESS;
|
|
return;
|
|
}
|
|
|
|
void CImgEditCtrl::CacheImage(LPCTSTR Image, long Page)
|
|
{
|
|
CACHE_FILE_PARMS CacheFile;
|
|
int RetCode;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
memset(&CacheFile, 0, sizeof(CACHE_FILE_PARMS));
|
|
CacheFile.hWnd = m_hWnd;
|
|
_mbscpy((unsigned char *)CacheFile.file_name, (const unsigned char *)Image);
|
|
CacheFile.wPage_number = (unsigned short)Page;
|
|
|
|
RetCode = IMGCacheFile(&CacheFile);
|
|
if (RetCode)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CACHEIMAGE);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_CLIPBOARDCOPY );
|
|
return;
|
|
}
|
|
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
|
|
|
|
void CImgEditCtrl::CompletePaste()
|
|
{
|
|
int RetCode;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
if (m_bInPasteMode == TRUE)
|
|
{
|
|
// end paste operation
|
|
RetCode = OiOpEndOperation(m_hWnd);
|
|
if (RetCode)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CACHEIMAGE);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_CLIPBOARDCOPY );
|
|
return;
|
|
}
|
|
|
|
m_bInPasteMode = FALSE;
|
|
|
|
// fire PasteCompleted event
|
|
FirePasteCompleted();
|
|
}
|
|
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
void CImgEditCtrl::RemoveImageCache(LPCTSTR Image, long Page)
|
|
{
|
|
int RetCode;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
RetCode = IMGCacheDiscardFileCgbw(m_hWnd, (LPSTR)Image, Page);
|
|
if (RetCode != 0 )
|
|
{
|
|
if (RetCode != DISPLAY_CACHEFILEINUSE && RetCode != DISPLAY_CACHENOTFOUND)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_CACHEIMAGE);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_CLIPBOARDCOPY );
|
|
return;
|
|
}
|
|
}
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
|
|
OLE_YSIZE_PIXELS CImgEditCtrl::GetImageScaleHeight()
|
|
{
|
|
int RetCode;
|
|
PARM_DIM_STRUCT ParmDimensions;
|
|
FIO_INFORMATION FileInfo;
|
|
BOOL RunMode;
|
|
LRECT lRect;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
// find out if design mode or run mode
|
|
RunMode = AmbientUserMode();
|
|
if (RunMode == FALSE)
|
|
{
|
|
// can't get height in design mode because 1st time the image
|
|
// property will not be set and therefore an error would be returned
|
|
return (OLE_YSIZE_PIXELS)0;
|
|
}
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == TRUE)
|
|
{
|
|
// get height from display
|
|
RetCode = IMGGetParmsCgbw(m_hWnd, PARM_DIMENSIONS, &ParmDimensions, NULL);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADPROP_GETIMAGEHEIGHT);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef);
|
|
return (OLE_YSIZE_PIXELS)0;
|
|
}
|
|
lRect.bottom = ParmDimensions.nHeight;
|
|
}
|
|
else
|
|
{
|
|
// get height from file
|
|
FileInfo.filename = m_strImage.GetBuffer(MAXFILESPECLENGTH);
|
|
FileInfo.page_number = (UINT) m_lPage;
|
|
// RetCode = IMGFileInfoCgbw(m_hWnd, &FileInfo, NULL);
|
|
RetCode = IMGFileGetInfo(NULL, m_hWnd, &FileInfo, NULL, NULL);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADPROP_GETIMAGEHEIGHT);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr,HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef);
|
|
return (OLE_YSIZE_PIXELS)0;
|
|
}
|
|
lRect.bottom = FileInfo.vertical_pixels;
|
|
}
|
|
|
|
// convert to window coordinates
|
|
lRect.left = 0;
|
|
lRect.top = 0;
|
|
lRect.right = 0;
|
|
RetCode = IMGConvertRect(m_hWnd, &lRect, CONV_FULLSIZE_TO_SCALED);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADPROP_GETIMAGEWIDTH);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef);
|
|
return (OLE_XSIZE_PIXELS)0;
|
|
}
|
|
|
|
m_lStatusCode = (long)SUCCESS;
|
|
return (OLE_YSIZE_PIXELS)lRect.bottom;
|
|
}
|
|
|
|
OLE_XSIZE_PIXELS CImgEditCtrl::GetImageScaleWidth()
|
|
{
|
|
int RetCode;
|
|
PARM_DIM_STRUCT ParmDimensions;
|
|
FIO_INFORMATION FileInfo;
|
|
BOOL RunMode;
|
|
LRECT lRect;
|
|
CString szErr;
|
|
UINT HelpIdDef;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
// find out if design mode or run mode
|
|
RunMode = AmbientUserMode();
|
|
if (RunMode == FALSE)
|
|
{
|
|
// can't get resolution in design mode because 1st time the image
|
|
// property will not be set and therefore an error would be returned
|
|
return (OLE_XSIZE_PIXELS)0;
|
|
}
|
|
|
|
if (m_bImageInWindow == FALSE)
|
|
m_bImageInWindow = ImageInWindow();
|
|
|
|
if (m_bImageInWindow == TRUE)
|
|
{
|
|
// get width from display
|
|
RetCode = IMGGetParmsCgbw(m_hWnd, PARM_DIMENSIONS, &ParmDimensions, NULL);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADPROP_GETIMAGEWIDTH);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef);
|
|
return (OLE_XSIZE_PIXELS)0;
|
|
}
|
|
lRect.right = ParmDimensions.nWidth;
|
|
}
|
|
else
|
|
{
|
|
// get width from file
|
|
FileInfo.filename = m_strImage.GetBuffer(MAXFILESPECLENGTH);
|
|
FileInfo.page_number = (UINT) m_lPage;
|
|
RetCode = IMGFileGetInfo(NULL, m_hWnd, &FileInfo, NULL, NULL);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADPROP_GETIMAGEWIDTH);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef);
|
|
return (OLE_XSIZE_PIXELS)0;
|
|
}
|
|
lRect.right = FileInfo.horizontal_pixels;
|
|
}
|
|
|
|
// convert to window coordinates
|
|
lRect.left = 0;
|
|
lRect.top = 0;
|
|
lRect.bottom = 0;
|
|
RetCode = IMGConvertRect(m_hWnd, &lRect, CONV_FULLSIZE_TO_SCALED);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADPROP_GETIMAGEWIDTH);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef);
|
|
return (OLE_XSIZE_PIXELS)0;
|
|
}
|
|
|
|
m_lStatusCode = SUCCESS;
|
|
return (OLE_XSIZE_PIXELS)lRect.right;
|
|
}
|
|
|
|
|
|
void CImgEditCtrl::SetCurrentAnnotationGroup(LPCTSTR GroupName)
|
|
{
|
|
LPPARM_NAMED_BLOCK_STRUCT lpNamedBlock;
|
|
int RetCode;
|
|
UINT HelpIdDef;
|
|
CString szErr;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
// set the group name based on index
|
|
lpNamedBlock = (LPPARM_NAMED_BLOCK_STRUCT) malloc(sizeof(PARM_NAMED_BLOCK_STRUCT));
|
|
if (lpNamedBlock == NULL)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_SETCURRENTANNOTATIONGROUP);
|
|
m_lStatusCode = ErrMap::Xlate(CTL_E_OUTOFMEMORY,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, IDH_METHOD_SETCURRENTANNOTATIONGROUP);
|
|
return;
|
|
}
|
|
_mbscpy((unsigned char *)lpNamedBlock->szBlockName, (const unsigned char *)"OiGroup\0");
|
|
lpNamedBlock->uScope = NB_SCOPE_DEFAULT_MARK;
|
|
lpNamedBlock->uNumberOfBlocks = 1;
|
|
lpNamedBlock->Block[0].lSize = _mbstrlen((const char *)GroupName) + 1;
|
|
lpNamedBlock->Block[0].lpBlock = (LPSTR)GroupName;
|
|
RetCode = IMGSetParmsCgbw(m_hWnd, PARM_NAMED_BLOCK, lpNamedBlock, NULL);
|
|
free(lpNamedBlock);
|
|
if (RetCode != 0)
|
|
{
|
|
szErr.LoadString(IDS_BADMETH_SETCURRENTANNOTATIONGROUP);
|
|
HelpIdDef = 0;
|
|
m_lStatusCode = ErrMap::Xlate(RetCode,szErr, HelpIdDef,__FILE__, __LINE__ );
|
|
ThrowError(m_lStatusCode, szErr, HelpIdDef );
|
|
return;
|
|
}
|
|
m_lStatusCode = SUCCESS;
|
|
}
|
|
|
|
// Return the version number of this control
|
|
BSTR CImgEditCtrl::GetVersion()
|
|
{
|
|
CString strVersion = "01.00";
|
|
|
|
m_lStatusCode = 0;
|
|
return strVersion.AllocSysString();
|
|
}
|
|
|
|
//*******************************************************************************************
|
|
//* RenderAllPages - This method will render all annotations on all the pages in the
|
|
//* the file name specified by the Image property.
|
|
//*
|
|
//*******************************************************************************************
|
|
long CImgEditCtrl::RenderAllPages(short Option, short MarkOption)
|
|
{
|
|
UINT Convert,i;
|
|
long RetCode;
|
|
CWnd* HiddenWnd;
|
|
BOOL bResult;
|
|
CString szErr;
|
|
LPSAVE_EX_STRUCT lpSaveEx;
|
|
PARM_FILE_STRUCT ParmFile;
|
|
FIO_INFORMATION FileInfo;
|
|
FIO_INFO_CGBW CGBWInfo;
|
|
|
|
//9603.14 jar added init
|
|
m_lStatusCode = 0L;
|
|
|
|
// Verify that an image is in the edit window
|
|
if (m_bImageInWindow == FALSE)
|
|
return (WICTL_E_NOIMAGEINWINDOW);
|
|
|
|
// Verify that the specified option parm is within the valid range of values
|
|
if (Option < ALL_ANNOTATIONS || Option > SELECTED_ANNOTATIONS)
|
|
return(CTL_E_ILLEGALFUNCTIONCALL);
|
|
|
|
// Verify the MarkOption value
|
|
if (MarkOption < CHANGE_ALL_ANNOTATIONS_BLACK || MarkOption > DONT_CHANGE_ANNOTATION_COLOR)
|
|
return(CTL_E_ILLEGALFUNCTIONCALL);
|
|
|
|
// Get currently total number of pages in the displayed image
|
|
RetCode = IMGGetParmsCgbw(m_hWnd, PARM_FILE, &ParmFile, 0);
|
|
if (RetCode)
|
|
return (RetCode);
|
|
|
|
// Check the Option parm value
|
|
if (Option == ALL_ANNOTATIONS)
|
|
Convert = SAVE_ANO_ALL;
|
|
else
|
|
{
|
|
Convert = SAVE_ANO_SELECTED;
|
|
if (Option == VISIBLE_ANNOTATIONS)
|
|
{
|
|
// all groups whose visible property is true are rendered
|
|
Convert = SAVE_ANO_VISIBLE;
|
|
}
|
|
else if (Option == SELECTED_ANNOTATIONS)
|
|
{
|
|
// render only selected annotations
|
|
Convert = SAVE_ANO_SELECTED;
|
|
}
|
|
}
|
|
|
|
// Set the image file name to be examined
|
|
FileInfo.filename = m_strImage.GetBuffer(MAXFILESPECLENGTH);
|
|
|
|
// Set the File Info flags to determine what image data info we want returned
|
|
CGBWInfo.fio_flags = FIO_IMAGE_DATA | FIO_ANNO_DATA;
|
|
|
|
// Create the Hidden Window
|
|
HiddenWnd = new CWnd;
|
|
|
|
// allocate o/i saveas structures
|
|
lpSaveEx = (LPSAVE_EX_STRUCT) malloc(sizeof(SAVE_EX_STRUCT));
|
|
if (lpSaveEx == NULL)
|
|
return(CTL_E_OUTOFMEMORY);
|
|
|
|
// INIT SaveEx struct
|
|
memset(lpSaveEx,0,sizeof(SAVE_EX_STRUCT));
|
|
|
|
// Set Save As parms
|
|
lpSaveEx->uFileType = FIO_TIF;
|
|
lpSaveEx->uImageType = ITYPE_BI_LEVEL;
|
|
lpSaveEx->bConvertImageType = FALSE;
|
|
lpSaveEx->bRenderAnnotations = FALSE;
|
|
lpSaveEx->lpFileName = (LPSTR)FileInfo.filename;
|
|
lpSaveEx->uPageOpts = FIO_OVERWRITE_PAGE;
|
|
lpSaveEx->bUpdateImageFile = FALSE;
|
|
|
|
|
|
// For each page in FileInfo.filename, check to see if the page contains annotation
|
|
// marks. If so, call IMGConvertImage and Render anno marks
|
|
for (i = 1; i < ParmFile.nFileTotalPages + 1; i++)
|
|
{
|
|
memset(&FileInfo, NULL, sizeof(FIO_INFORMATION));
|
|
memset(&CGBWInfo, NULL, sizeof(FIO_INFO_CGBW));
|
|
// For each page in the input TIFF file, we will check to see if the page
|
|
// contains any annotation marks. If so we will render that page
|
|
// Set the image file name to be examined
|
|
FileInfo.filename = m_strImage.GetBuffer(MAXFILESPECLENGTH);
|
|
FileInfo.page_number = (UINT) i;
|
|
|
|
// Set the File Info flags to determine what image data info we want returned
|
|
CGBWInfo.fio_flags = FIO_IMAGE_DATA | FIO_ANNO_DATA;
|
|
|
|
RetCode = IMGFileGetInfo(NULL, m_hWnd, &FileInfo, &CGBWInfo, NULL);
|
|
if (RetCode)
|
|
{
|
|
free(lpSaveEx);
|
|
return (RetCode);
|
|
}
|
|
|
|
lpSaveEx->FioInfoCgbw.compress_type = CGBWInfo.compress_type;
|
|
lpSaveEx->FioInfoCgbw.compress_info1 = CGBWInfo.compress_info1;
|
|
|
|
// Check if anno marks are on the page. For each page that contains an annotation mark,
|
|
// we will display the page in a hidden window so that IMGConvertImage may render the
|
|
// annotation marks
|
|
if ( CGBWInfo.fio_flags & FIO_ANNO_DATA )
|
|
{
|
|
// first create a hidden window. Do Not forget to DELETE this object
|
|
if (HiddenWnd == NULL)
|
|
{
|
|
free(lpSaveEx);
|
|
return(CTL_E_OUTOFMEMORY);
|
|
}
|
|
|
|
CString lpszClassName = AfxRegisterWndClass(CS_DBLCLKS, 0, 0, 0);
|
|
|
|
// use createex to get the popup....
|
|
bResult = HiddenWnd->CreateEx(WS_EX_NOPARENTNOTIFY, lpszClassName, "",
|
|
WS_POPUP, 0, 0, 500, 500, HWND_DESKTOP, 0);
|
|
if (bResult == FALSE)
|
|
{
|
|
free(lpSaveEx);
|
|
return(CTL_E_OUTOFMEMORY);
|
|
}
|
|
|
|
// register the window with o/i
|
|
RetCode = IMGRegWndw(HiddenWnd->m_hWnd);
|
|
if (RetCode)
|
|
{
|
|
free(lpSaveEx);
|
|
return(RetCode);
|
|
}
|
|
|
|
// Display each page
|
|
RetCode = IMGDisplayFile(HiddenWnd->m_hWnd,(LPSTR)FileInfo.filename, i, OI_DONT_REPAINT);
|
|
if (RetCode)
|
|
{
|
|
free(lpSaveEx);
|
|
return(RetCode);
|
|
}
|
|
|
|
// Convert But do not repaint
|
|
RetCode = IMGConvertImage(HiddenWnd->m_hWnd, CONV_RENDER_ANNOTATIONS, (void far *)&Convert, NULL);
|
|
if (RetCode)
|
|
{
|
|
free(lpSaveEx);
|
|
return(RetCode);
|
|
}
|
|
|
|
// Set the Current page number to Save
|
|
lpSaveEx->nPage = (UINT)i;
|
|
// Save each page in file
|
|
RetCode = IMGSavetoFileEx(HiddenWnd->m_hWnd, lpSaveEx, SAVE_ONLY_MODIFIED);
|
|
if (RetCode)
|
|
{
|
|
free(lpSaveEx);
|
|
return(RetCode);
|
|
}
|
|
// Deregister the window with o/i
|
|
IMGDeRegWndw(HiddenWnd->m_hWnd);
|
|
// Destroy the created window
|
|
HiddenWnd->DestroyWindow();
|
|
}
|
|
|
|
} // End of For Loop
|
|
|
|
// Free the memory
|
|
if (lpSaveEx)
|
|
free(lpSaveEx);
|
|
// Delete the CWnd object instance
|
|
if (HiddenWnd)
|
|
delete HiddenWnd;
|
|
return (SUCCESS);
|
|
}
|