NT4/private/wangview/norway/iedit95/docambnt.cpp

1251 lines
38 KiB
C++
Raw Normal View History

2001-01-01 00:00:00 +01:00
//=============================================================================
// (c) Copyright Wang Laboratories, Inc. 1993 All rights reserved.
//-----------------------------------------------------------------------------
// Project: Norway - Image Editor
//
// Component: CIeditDoc
//
// File Name: docambnt.cpp
//
// Class: CIeditDoc
//
// Functions:
//
// Remarks: This file is the continuation of the ieditdoc.cpp file
// it is #included at the end of that file
// Broken apart for source control. Logically, Still compiles as one!!!
//-----------------------------------------------------------------------------
// Maintenance Log:
/*
$Header: S:\products\msprods\norway\iedit95\docambnt.cpv 1.37 03 Jun 1996 13:47:56 GMP $
$Log: S:\products\msprods\norway\iedit95\docambnt.cpv $
Rev 1.37 03 Jun 1996 13:47:56 GMP
don't allow hot key cut, delete, and paste if in read only mode.
Rev 1.36 21 May 1996 17:39:44 GMP
dont disable cut just for annotations.
Rev 1.35 10 May 1996 14:39:20 MMB
fixes bug 6357, clear is now available when the user pastes
Rev 1.34 07 May 1996 16:55:44 GMP
allow delete when selection rect drawn.
Rev 1.33 10 Apr 1996 10:32:50 MMB
added code to OnEditDrag to check if we have an image displayed
Rev 1.32 22 Feb 1996 06:48:24 GSAGER
added autoclip ambient property
Rev 1.31 06 Feb 1996 09:28:20 GSAGER
restore the selection rectangle correctly for copy after
modifications to the doc rotate right.
Rev 1.30 18 Jan 1996 11:48:40 GSAGER
added changes for copy page to work with new ole way
Rev 1.29 21 Dec 1995 09:36:50 MMB
remove restriction on pasting annotations on an already annotated image
Rev 1.28 17 Nov 1995 10:58:24 LMACLENNAN
back from VC++2.2
Rev 1.27 17 Nov 1995 10:51:54 LMACLENNAN
just added comments to remind that InternalSaveMod for CutCOpy is the
same logic as in StartDragDrop
Rev 1.26 09 Nov 1995 15:17:20 LMACLENNAN
from VC++4.0
Rev 1.27 09 Nov 1995 14:43:22 LMACLENNAN
set m_nFinishInit on UpdateUI call for Drag Mode (does nothing)
Rev 1.26 02 Nov 1995 17:05:34 GMP
In DoCutCopy call InternalSaveModified instead of SaveModified so that
changes are written to the temp file instead of the original file.
Rev 1.25 27 Oct 1995 14:03:42 GMP
put up hourglass for paste operations.
Rev 1.24 19 Oct 1995 07:24:34 LMACLENNAN
DEBUG_NEW
Rev 1.23 10 Oct 1995 08:41:52 LMACLENNAN
better error messaged for clipboard cut/copy
Rev 1.22 09 Oct 1995 11:31:02 LMACLENNAN
VC++4.0
Rev 1.21 09 Oct 1995 10:33:08 LMACLENNAN
fix in FinishPasteNow for dirty cases
Rev 1.20 06 Oct 1995 14:15:04 LMACLENNAN
adjust copy rect by scroll posit for copy page
Rev 1.19 06 Oct 1995 11:58:38 LMACLENNAN
FreeCLipboard
Rev 1.18 06 Oct 1995 09:06:20 LMACLENNAN
added CATCH-TRYS a few places, moved one to Catch More...
Rev 1.17 05 Oct 1995 16:33:54 LMACLENNAN
for copy page, zoom bets fit to capture full metafile
Rev 1.16 29 Sep 1995 11:00:40 LMACLENNAN
RestoreSelectionRect updated to diff the scroll posits
Rev 1.15 27 Sep 1995 16:44:24 LMACLENNAN
FinishPasteNow now uses parm set to 2 to force dirty, default = not dirty
Rev 1.14 22 Sep 1995 17:50:16 LMACLENNAN
qualify the restoreselectionrect call
Rev 1.13 22 Sep 1995 15:33:06 LMACLENNAN
restoreseelctionrect, updatefinishpastenow
Rev 1.12 21 Sep 1995 16:46:00 LMACLENNAN
new width/height from OCX
Rev 1.11 21 Sep 1995 14:15:40 LMACLENNAN
uex OCX for paste complete now, call savemodified at edit-copy
Rev 1.10 20 Sep 1995 17:06:02 MMB
delete thumbnails and save causes problems
Rev 1.9 20 Sep 1995 15:14:00 LMACLENNAN
paste/cut/clear ole dirty
Rev 1.8 20 Sep 1995 11:51:06 LMACLENNAN
set isclip at OLEgetclipboarddata
Rev 1.7 18 Sep 1995 16:25:08 LMACLENNAN
FinishPaste, update pasting
Rev 1.6 18 Sep 1995 15:04:20 MMB
change mouse pointer for selection mode
Rev 1.5 18 Sep 1995 09:51:40 LMACLENNAN
more updates on pasting; go to pointer mode before paste
Rev 1.4 16 Sep 1995 16:39:54 LMACLENNAN
clearsleectionrect
Rev 1.3 16 Sep 1995 14:00:26 LMACLENNAN
now all clipboard, ptr mode code here
Rev 1.2 12 Sep 1995 11:41:12 MMB
border style fixes
Rev 1.1 04 Aug 1995 09:32:50 LMACLENNAN
remove srvritem.h
Rev 1.0 31 May 1995 09:28:06 MMB
Initial entry
*/
//=============================================================================
// ----------------------------> Includes <-------------------------------
#include "stdafx.h"
#include "IEdit.h"
#include "IEditdoc.h"
#include "cntritem.h"
#include "srvritem.h"
#include "ocxitem.h"
#include "image.h"
#include "items.h"
// ALL READY TO START ADDING ERROR CODES..
#define E_02_CODES // (Really codes from IEDITDOC.CPP)
#include "error.h"
// ----------------------------> Globals <-------------------------------
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
// This will help detect memory Leaks from "new" - "delete" mismatches
#define new DEBUG_NEW
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// CIEditDoc ambient properties & clipboard functions
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// CLIPBOARD HELPER FUNCTION SECTION - CIEditDoc
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//=============================================================================
// Function: SetSelectionState (BOOL bSel)
//-----------------------------------------------------------------------------
BOOL CIEditDoc :: SetSelectionState (SelectionStatus eStatus)
{
m_bSelectionState = eStatus;
return (TRUE);
}
//=============================================================================
// Function: GetSelectionState ()
//-----------------------------------------------------------------------------
SelectionStatus CIEditDoc :: GetSelectionState ()
{
return (m_bSelectionState);
}
//=============================================================================
// Function: RestoreSelectionRect
///
// gathers all aclls & logic to one place...
//-----------------------------------------------------------------------------
BOOL CIEditDoc::RestoreSelectionRect()
{
// if nothing there now, restore what was there
if (m_bSelectionState == No_Selection)
{
_DImagedit* pIedDisp = g_pAppOcxs->GetIeditDispatch();
long l,t,w,h, scrollx, scrolly;
CPoint topleft;
TRY
{
scrollx = pIedDisp->GetScrollPositionX();
scrolly = pIedDisp->GetScrollPositionY();
topleft = m_SelectionRect.TopLeft();
l = topleft.x;
t = topleft.y;
w = m_SelectionRect.Width();
h = m_SelectionRect.Height();
// we must account for any scrolling that has taken place
// since the selectionrect was first drawn
l += (m_SelectionScrollX - scrollx);
t += (m_SelectionScrollY - scrolly);
pIedDisp->DrawSelectionRect(l,t,w,h);
}
CATCH(COleDispatchException, e)
{
return FALSE;
}
END_CATCH
}
return (TRUE);
}
//=============================================================================
// Function: ClearSelectionRect
///
// gathers all aclls & logic to one place...
//-----------------------------------------------------------------------------
BOOL CIEditDoc :: ClearSelectionRect(SelectionStatus clearwhat)
{
BOOL clear = FALSE;
BeginWaitCursor ();
switch (clearwhat)
{
case Annotation_Selection:
case Image_Selection:
if (m_bSelectionState == clearwhat)
clear = TRUE;
break;
case Both:
if (m_bSelectionState != No_Selection)
clear = TRUE;
break;
default:
break;
}
// see what to do...
// if done, will fire event and we will reset our selection to NO SELECTION
if (clear)
{
_DImagedit* pIedDisp = g_pAppOcxs->GetIeditDispatch ();
TRY
{
pIedDisp->DrawSelectionRect (0, 0, 0, 0);
}
CATCH(COleDispatchException, e)
{
EndWaitCursor ();
return FALSE;
}
END_CATCH
}
EndWaitCursor ();
return(TRUE);
}
//=============================================================================
// Function: OurGetImageModified()
///
// gathers all calls & logic to one place...
//
// we need to know if there is also floating pasted data hanging around...
//-----------------------------------------------------------------------------
BOOL CIEditDoc :: OurGetImageModified()
{
BOOL retval = FALSE;
_DImagedit* pIedDisp = g_pAppOcxs->GetIeditDispatch ();
TRY
{
// if he tells us or if its a floating paste....
if (pIedDisp->GetImageModified () || m_bFloatingPaste)
retval = TRUE;
}
CATCH(COleDispatchException, e)
{
return FALSE;
}
END_CATCH
return(retval);
}
//=============================================================================
// Function: FinishPasteNow()
///
// gathers all calls & logic to one place...
//
// we need to know if there is also floating pasted data hanging around...
//
// Input event defaults to 0 (will not do a dirtyset)
// set to '1' from the real event. (does a dirtyset)
// Set to '2' to force a dirtyset
//-----------------------------------------------------------------------------
BOOL CIEditDoc :: FinishPasteNow(UINT event)
{
BOOL retval = TRUE;
BOOL dodirty = FALSE;
BeginWaitCursor ();
if (m_bFloatingPaste)
{
m_bFloatingPaste = FALSE;
// If not called by real event, force complete now
if (1 != event)
{
_DImagedit* pIedDisp = g_pAppOcxs->GetIeditDispatch ();
VARIANT evt;
evt.vt = VT_ERROR;
TRY
{
pIedDisp->CompletePaste();
}
CATCH(COleDispatchException, e)
{
EndWaitCursor ();
return FALSE;
}
END_CATCH
}
// must be set to 1 (event) or 2 (force) for dirtyset
if (event > 0)
{
// only get new picture if its the real event and the
// guy touches screen to fix it. If it was forced, then probably
// some other action that will do a new dirtyset is immediately
// going to follow this operation.
dodirty = TRUE;
}
// force de-selection of things...
// our annotations remain selected after they are pasted and
// we dont know a thing about it...
// force it for function.. picked up in generl logic below
m_bSelectionState = Annotation_Selection;
}
// also generically clear selection rectangles now because
// we know this code is called before SAVE/SAVEAS in our app
// save/saveas will lose selection rectangles and subsequent copy's
// will end up with nothing in clipboard
ClearSelectionRect(Both);
// Tell Ole new stuff on screen...wait till now to get latest info on screen
if (dodirty)
OleDirtyset(OLEDIRTY_PASTE); // call our function to set it dirty..
EndWaitCursor ();
return (retval);
}
//=============================================================================
// Function: OnUpdateEditPaste(CCmdUI* pCmdUI)
//-----------------------------------------------------------------------------
void CIEditDoc::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
BOOL setting = FALSE; // dont enable unless its good to do it...
//VARIANT evt;
//evt.vt = VT_ERROR;
// disabled for readnlly!!!
// if we are in thumbnail view or null view paste is disabled
// therefore, only can enable for one page or thumb&page
if ( (m_eFileStatus != ReadOnly) &&
(m_eCurrentView == One_Page) || (m_eCurrentView == Thumbnail_and_Page))
{
// we are either in One page view or thumbnail and page view
// NO ANNOTATIONS and data here = OK
_DImagedit* pIedDisp = g_pAppOcxs->GetIeditDispatch();
// if ( (pIedDisp->IsClipboardDataAvailable ()) &&
// (OurGetAnnotMarkCount() == 0) )
if (pIedDisp->IsClipboardDataAvailable ())
setting = TRUE;
}
pCmdUI->Enable (setting);
}
//=============================================================================
// Function: OnUpdateEditCopy(CCmdUI* pCmdUI)
//
// NOTE this UPDATEUI code is used for both CUT and COPY menu items
//-----------------------------------------------------------------------------
void CIEditDoc::OnUpdateEditCopy(CCmdUI* pCmdUI)
{
BOOL enab = FALSE;
//VARIANT evt;
//evt.vt = VT_ERROR;
// if we are in thumbnail view or null view copy/cut is disabled
// therefore, only can enable for one page or thumb&page and something selected
if ((m_eCurrentView == One_Page) || (m_eCurrentView == Thumbnail_and_Page))
if (m_bSelectionState)
enab = TRUE;
// disable cut & copy if we are in floating paste mode
if (m_bFloatingPaste)
enab = FALSE;
// BUT WAIT A MINUTE!! If enabled and its CUT, look again
if (enab && (pCmdUI->m_nID == ID_EDIT_CUT))
{
// disable CUTTING from readonly
if (m_eFileStatus == ReadOnly)
enab = FALSE;
// Disallow cutting the image selection if annotations there
/* if (m_bSelectionState == Image_Selection)
{
if (OurGetAnnotMarkCount() != 0)
enab = FALSE;
}*/
}
pCmdUI->Enable (enab);
}
//=============================================================================
// Function: OnUpdateEditCopypage(CCmdUI* pCmdUI)
//-----------------------------------------------------------------------------
void CIEditDoc::OnUpdateEditCopypage(CCmdUI* pCmdUI)
{
BOOL enab = FALSE;
// if we are in thumbnail view or null view copy is disabled
// therefore, only can enable for one page or thumb&page and something displayed
if ((m_eCurrentView == One_Page) || (m_eCurrentView == Thumbnail_and_Page))
if (m_eCurrentAppDocStatus != No_Document)
enab = TRUE;
pCmdUI->Enable (enab);
return;
}
//=============================================================================
// Function: OnUpdateEditClear(CCmdUI* pCmdUI)
//-----------------------------------------------------------------------------
void CIEditDoc::OnUpdateEditClear(CCmdUI* pCmdUI)
{
BOOL enab = FALSE;
VARIANT evt;
evt.vt = VT_ERROR;
// if we are in thumbnail view or null view clear is disabled
// therefore, only can enable for one page or thumb&page and something selected
if ((m_eCurrentView == One_Page) || (m_eCurrentView == Thumbnail_and_Page))
{
// can only clear IF NOT readonly
if (m_eFileStatus != ReadOnly)
{
// if sonething selected (annotation OR image)
if (m_bSelectionState || m_bFloatingPaste)
// only have clear if its annotations only??
//if (m_bSelectionState == Annotation_Selection)
enab = TRUE;
}
}
pCmdUI->Enable (enab);
}
//=============================================================================
// Function: OnEditCopypage()
//-----------------------------------------------------------------------------
void CIEditDoc::OnEditCopypage()
{
// perform operation....
OnCutCopy(CLIP_COPYPAGE);
}
//=============================================================================
// Function: OnEditCut () Perform CLipboard Function.....
//-----------------------------------------------------------------------------
void CIEditDoc::OnEditCut()
{
// perform operation....
if( theApp.GetViewMode() == FALSE )
OnCutCopy(CLIP_CUT);
}
//=============================================================================
// Function: OnEditCopy () Perform CLipboard Function.....
//-----------------------------------------------------------------------------
void CIEditDoc::OnEditCopy()
{
// perform operation....
OnCutCopy(CLIP_COPY);
}
//=============================================================================
// Function: OnEditClear () Remove selected item
//-----------------------------------------------------------------------------
void CIEditDoc::OnEditClear()
{
if( theApp.GetViewMode() == TRUE )
return;
SelectionStatus state = m_bSelectionState;
_DImagedit* pIedDisp = g_pAppOcxs->GetIeditDispatch ();
VARIANT l;
l.vt=VT_ERROR;
// Invoke the OCX to Zap the data
TRY
{
if (Annotation_Selection == state || m_bFloatingPaste)
pIedDisp->DeleteSelectedAnnotations();
else if (Image_Selection == state)
pIedDisp->DeleteImageData(l,l,l,l);
if (m_bFloatingPaste)
{
m_bFloatingPaste = FALSE;
return;
}
// Tell Ole new stuff on screen...
OleDirtyset(OLEDIRTY_PASTE); // call our function to set it dirty..
}
CATCH (COleDispatchException, e)
{
// to do : what went wrong ? post message box
long ocxerr = pIedDisp->GetStatusCode();
g_pErr->DispErr(E_02_OCXDEL, (DWORD)ocxerr);
return;
}
END_CATCH
// once he clears image data, the rect is gone
// The Code in OCXEVENT to draw a rect will have set
// Rectangle drawing to FALSE, so re-enable it here.
//if (Image_Selection == state)
//{
// m_bSelectionState = No_Selection;
// pIedDisp->SetSelectionRectangle(TRUE);
//}
// when annotations are removed, nothings selected anymore
if (Annotation_Selection == state)
{
m_bSelectionState = No_Selection;
}
return;
}
//=============================================================================
// Function: OnCutCopy () services Cut and Copy...
//-----------------------------------------------------------------------------
void CIEditDoc::OnCutCopy(CLIPTYPE type) // TRUE = CUT
{
_DImagedit* pIedDisp = g_pAppOcxs->GetIeditDispatch ();
BOOL bOleData = FALSE;
SelectionStatus state = m_bSelectionState; // must remember state at top
VARIANT l,t,w,h;
l.vt = t.vt = w.vt = h.vt = VT_ERROR;
//l.lVal = t.lVal = w.lVal = h.lVal = 0;
// for copypage, programattically get whole page.
if (type == CLIP_COPYPAGE)
{
long scrollx, scrolly;
l.vt = t.vt = w.vt = h.vt = VT_I4;
l.lVal = t.lVal = w.lVal = h.lVal = 0;
scrollx = pIedDisp->GetScrollPositionX();
scrolly = pIedDisp->GetScrollPositionY();
// in case its scrolled, adjust origin for the copy
// LDM NOTE: This was one attempt to get it right. THese scroll
// co-ordinates do not match with co-ordinates needed for the clipboardcopy
// This would affect the CF_DIB data that O/i puts on clipboard
l.lVal -= scrollx;
t.lVal -= scrolly;
w.lVal = pIedDisp->GetImageScaleWidth();
h.lVal = pIedDisp->GetImageScaleHeight();
}
// all unset means use selected rectangle
// Invoke the OCX to put O/i data on clipboard
TRY
{
if (type == CLIP_CUT)
pIedDisp->ClipboardCut(l,l,l,l);
else // one of the copys
pIedDisp->ClipboardCopy(l,t,w,h);
}
CATCH (COleDispatchException, e)
{
// to do : what went wrong ? post message box
long ocxerr = pIedDisp->GetStatusCode();
if (type == CLIP_CUT)
g_pErr->DispErr(E_02_CLIPCUT, (DWORD)ocxerr);
else
g_pErr->DispErr(E_02_CLIPCOPY, (DWORD)ocxerr);
return;
}
END_CATCH
// when annotations are cut, nothings selected anymore
// when image data is cut, blow away the rect..
if (type == CLIP_CUT)
{
if (Annotation_Selection == state)
m_bSelectionState = No_Selection;
// clear the rect for cuy of image data
if (Image_Selection == state)
{
ClearSelectionRect(Image_Selection);
}
// Tell Ole new stuff on screen...
OleDirtyset(OLEDIRTY_PASTE); // call our function to set it dirty..
}
// for copy page, kill the rect it drew for us
else if (type == CLIP_COPYPAGE)
{
// force it for function
m_bSelectionState = Image_Selection;
ClearSelectionRect(Image_Selection);
}
else // must be just copy
{
// nothings happening here
}
// unless we modify below, its OI on clipboard
m_clipstate = CLIP_OI;
CRect saveSelectionRect = m_SelectionRect;
// only do OLE stuff if it if regular, NOT ANNOTATION clipboard copy
// OR if it was the copy page function
if ( ((type == CLIP_COPY) && (Image_Selection == state)) ||
(type == CLIP_COPYPAGE) )
{
// If the clipboard viewer is open, then there will
// be a conflict with him trying to access the data that was
// just placed there by O/i to display it himself.
// If the clipboard is not clear, then O/i will fail if we have dirty
// data and we really try to save in SaveModofied
FreeClipboard(5000);
// This save stuff should be after the O/i (OCX) clipboard copy
// the save will destroy any known selection.
// to get the OLE data correct on clipboard, the data must be up-to-date
//
// Note that we will only proceed with the OLE data if there is
// a successful return from the SaveModified
// If he cancells us, or it dies, NO OLE DATA
// Force the implicit save to be sure we never ask the question
// Should not really ne necessary, but for safety, do it!
// 11/17/95 LDM NOTE: This logic must be the same as in StartDragDrop
theApp.m_bImplicitSave = TRUE;
bOleData = InternalSaveModified ();
theApp.m_bImplicitSave = FALSE;
// if the save killed it, put back now but not for the copypage
if (type != CLIP_COPYPAGE)
{
m_SelectionRect = saveSelectionRect;
RestoreSelectionRect();
}
}
// See if SaveModified allows us to proceed with up-to-date OLE data
if (bOleData)
{
FLOAT fZoom;
long lastXScroll,lastYScroll;
m_clipstate = CLIP_OLE;
m_bNewEmbed = TRUE;
// before performing OLE stuff, which puts Metafile data in clipboard,
// if its copy page, zoom to best fit so that we capture the whole
// page on the metafile
if(type == CLIP_COPYPAGE)
{
VARIANT evt;
evt.vt = VT_ERROR;
TRY // catch all errors here in case Fit To bugs out
{
long width,height;
fZoom = pIedDisp->GetZoom();
lastXScroll = pIedDisp->GetScrollPositionX();
lastYScroll = pIedDisp->GetScrollPositionY();
pIedDisp->FitTo (BEST_FIT,evt);
m_fZoomFactor = pIedDisp->GetZoom();
width = pIedDisp->GetImageScaleWidth();
height = pIedDisp->GetImageScaleHeight();
pIedDisp->DrawSelectionRect(0,0,width,height);
}
CATCH (CException, e)
{
}
END_CATCH
}
// Now perform the OLE copy. This wraps all around the place...
// The new CIEditSrvrItem will register clipboard formats it wants to pick up
// The COpyToClipboard function goes into the MFC bowels and gets the EMbeddeded
// formats, calls back to the SrvrItem class to get the O/i formats that were just
// put there by the OCX control method above, then puts the link formats on as well
CIEditSrvrItem* pItem = (CIEditSrvrItem*) GetEmbeddedItem();
// call sets item name and tells if we make link or not..
BOOL getlink = pItem->SetLinkItemName(FALSE);
BeginWaitCursor();
TRY // catch all errors here
{
// Set flag for serialize to tell we sent it here...
m_isClip = 1;
pItem->CopyToClipboard(getlink);
m_isClip = 0;
// Shove back the last view now since we doodled it
if(type == CLIP_COPYPAGE)
{
// BOOL bDisp;
// bDisp = pIedDisp->GetAutoRefresh();
// if (bDisp)
// pIedDisp->SetAutoRefresh(FALSE);
pIedDisp->SetZoom(fZoom);
pIedDisp->SetScrollPositionX(lastXScroll);
pIedDisp->SetScrollPositionY(lastYScroll);
pIedDisp->DrawSelectionRect(saveSelectionRect.left,saveSelectionRect.right,
saveSelectionRect.Width(),saveSelectionRect.Height());
// pIedDisp->SetAutoRefresh(bDisp);
// pIedDisp->Refresh();
}
}
CATCH (CException, e)
{
m_isClip = 0;
g_pErr->DispErr(E_02_CLIPBOARD);
}
END_CATCH
m_bNewEmbed = FALSE;
EndWaitCursor();
} // OLE operation
}
//=============================================================================
// Function: OnEditPaste () Perform CLipboard Function.....
// NON-OLE, just OI native in our app
//-----------------------------------------------------------------------------
void CIEditDoc::OnEditPaste()
{
if( theApp.GetViewMode() == TRUE )
return;
// Just DO IT...
_DImagedit* pIedDisp = g_pAppOcxs->GetIeditDispatch();
VARIANT x;
x.vt = VT_ERROR;
// clear any current selctions
ClearSelectionRect(Both);
// Zap any previous pasted data if its hanging there
// dont force dirtyset, because this is still a hanging state...
FinishPasteNow();
BeginWaitCursor ();
// move to selection state for post-paste operation
// Now if he selects an annotation tool, or selects drag mode,
// this pasted data will be burnt in...
OnEditSelect();
// no values means to paste upper-left...
pIedDisp->ClipboardPaste(x, x);
// trying to identify what got pasted??
// image data, annotation, both?
// this will burn the data!!
// cnt = pIedDisp->GetAnnotationGroupCount();
// controls menu enable/disable/inadvertent paste
// used with FinishPasteNow()
// Since we were here, there can be no mark count.
// this gets reset various places as we know it was pasted
m_bFloatingPaste = TRUE;
EndWaitCursor ();
}
//=============================================================================
// Function: FreeClipboard()
//
// If the clipboard viewer is open, conflicts are created because of the fact that
// we tell O/i to put data on clipboard, then expect to access it right after during
// our OLE Data Object creation (In SrvrItem::OnRenderFileData). What happens
// when the clipboard viewer is open is that when he sees that data on clipboard change,
// he immedialtly opens clipboard to update his display. This must be accounted for
// in a coulpe areas of our code.
// 1) in srvritem, as above,
// 2) when we perform the SaveModified and O/i is closing out stuff if the file is dirty
// and then O/i tries to render his data to clipboard, but gets in a hopeless
// conflict with clip viewer trying to get h im to render the data and caught in
// an O/i mutex lockout. We'll help him clear it.
//
//
// returns TRUE if its free
//-----------------------------------------------------------------------------
BOOL CIEditDoc::FreeClipboard(DWORD millisec) // use at least 4000
{
MSG msg;
DWORD start, now;
BOOL open, retval;
start = ::GetTickCount();
open = ::OpenClipboard(AfxGetMainWnd()->m_hWnd);
retval = TRUE; // assume will be OK
while (!open)
{
// let it out after 4 seconds....
now = ::GetTickCount();
if (now > (start + millisec))
{
open = TRUE;
retval = FALSE; // bad
}
else // give time to whomever is hogging the clipboard
{
::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
open = ::OpenClipboard(AfxGetMainWnd()->m_hWnd);
}
}
if (retval)
::CloseClipboard();
return (retval);
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// Selection mode HELPER FUNCTION SECTION - CIEditDoc
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//=============================================================================
// Function: GetCurrPtrMode ()
//-----------------------------------------------------------------------------
MouseMode CIEditDoc::GetCurrPtrMode ()
{
return (m_eCurrPtrMode);
}
//=============================================================================
// Function: OnUpdateEditSelect(CCmdUI* pCmdUI)
//-----------------------------------------------------------------------------
void CIEditDoc::OnUpdateEditSelect(CCmdUI* pCmdUI)
{
if (m_eCurrentAppDocStatus == No_Document || m_eCurrentView == Null_View)
pCmdUI->Enable (FALSE);
else
pCmdUI->Enable (TRUE);
if (m_eCurrPtrMode == Select)
pCmdUI->SetCheck (1);
else
pCmdUI->SetCheck (0);
}
//=============================================================================
// Function: OnEditSelect()
//-----------------------------------------------------------------------------
void CIEditDoc::OnEditSelect()
{
// goto state if not there
if (m_eCurrPtrMode != Select)
{
m_eCurrPtrMode = Select;
_DImagedit* pIedit = g_pAppOcxs->GetIeditDispatch ();
if (m_nCurrAnnTool != NoTool)
{
pIedit->SelectTool ((short)NoTool);
m_nCurrAnnTool = NoTool;
}
// if there is an annotation selection rectangle - remove it !
ClearSelectionRect(Annotation_Selection);
pIedit->SetSelectionRectangle (TRUE);
pIedit->SetMousePointer (IMAGE_SELECTION_MOUSEPOINTER);
}
}
//=============================================================================
// Function: OnUpdateEditDrag(CCmdUI* pCmdUI)
//-----------------------------------------------------------------------------
void CIEditDoc::OnUpdateEditDrag(CCmdUI* pCmdUI)
{
if (m_eCurrentAppDocStatus == No_Document || m_eCurrentView == Null_View)
pCmdUI->Enable (FALSE);
else
pCmdUI->Enable (TRUE);
// LDMPERF FOR TEST FOR AWD INBOX PERFORMANCE, could do something here
// allow OnIdle to finish up..
if (!(m_nFinishInit & 2))
m_nFinishInit |= 2;
if (m_eCurrPtrMode == Drag)
pCmdUI->SetCheck (1);
else
pCmdUI->SetCheck (0);
}
//=============================================================================
// Function: OnEditDrag()
// If we are in drag mode -> move to Select mode; else move to drag mode
//-----------------------------------------------------------------------------
void CIEditDoc::OnEditDrag()
{
// if no image is displayed
if (m_eCurrentAppDocStatus == No_Document || m_eCurrentView == Null_View)
return;
// goto state if not there
if (m_eCurrPtrMode != Drag)
{
m_eCurrPtrMode = Drag;
_DImagedit* pIedit = g_pAppOcxs->GetIeditDispatch ();
// if there is a selection rectangle - remove it !
ClearSelectionRect(Both);
// Zap any previous pasted data if its hanging there
// Allow the dirty update
FinishPasteNow(2);
// disable rectangle drawing
pIedit->SetSelectionRectangle (FALSE);
// we know when we select the tool, we'll do the work in the
// event to set it all back...
if (m_nCurrAnnTool != NoTool)
pIedit->SelectTool ((short)NoTool);
else
pIedit->SetMousePointer (HAND_MOUSEPOINTER);
}
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// AMBIENT PROPERTY HELPER FUNCTION SECTION - CIEditDoc
// The following are helper routines for Ambiemt Properties
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
//=============================================================================
// Function: SetUserMode(BOOL bToWhat)
//-----------------------------------------------------------------------------
BOOL CIEditDoc :: SetUserMode(BOOL bToWhat)
{
m_apropStd[0].dispid = DISPID_AMBIENT_USERMODE;
VARIANT FAR* lpVar = &m_apropStd[0].varValue;
V_VT (lpVar) = VT_BOOL;
V_BOOL (lpVar) = ((VARIANT_BOOL)bToWhat);
return (TRUE);
}
//=============================================================================
// Function: SetDefaultAmbientProps()
//-----------------------------------------------------------------------------
BOOL CIEditDoc :: SetDefaultAmbientProps()
{
BOOL bRet = TRUE;
VARIANT FAR * lpVar;
int nStdIdx = 0;
m_apropStd[nStdIdx].dispid = DISPID_AMBIENT_USERMODE;
m_apropStd[nStdIdx].strName.LoadString (IDS_AMODENAME_USERMODE);
lpVar = &m_apropStd[nStdIdx].varValue;
V_VT (lpVar) = VT_BOOL;
V_BOOL (lpVar) = (~(VARIANT_BOOL)0);
m_apropStd[nStdIdx++].idsTypeInterp = IDS_VTBOOL;
m_apropStd[nStdIdx].dispid = DISPID_AMBIENT_UIDEAD;
m_apropStd[nStdIdx].strName.LoadString (IDS_AMODENAME_UIDEAD);
lpVar = &m_apropStd[nStdIdx].varValue;
V_VT (lpVar) = VT_BOOL;
V_BOOL (lpVar) = 0;
m_apropStd[nStdIdx++].idsTypeInterp = IDS_VTBOOL;
m_apropStd[nStdIdx].dispid = DISPID_AMBIENT_SHOWHATCHING;
m_apropStd[nStdIdx].strName.LoadString (IDS_AMODENAME_DISPLAYHATCHING);
lpVar = &m_apropStd[nStdIdx].varValue;
V_VT (lpVar) = VT_BOOL;
V_BOOL (lpVar) = ((VARIANT_BOOL)0);
m_apropStd[nStdIdx++].idsTypeInterp = IDS_VTBOOL;
m_apropStd[nStdIdx].dispid = DISPID_AMBIENT_SHOWGRABHANDLES;
m_apropStd[nStdIdx].strName.LoadString (IDS_AMODENAME_DISPLAYGRABHANDLES);
lpVar = &m_apropStd[nStdIdx].varValue;
V_VT (lpVar) = VT_BOOL;
V_BOOL (lpVar) = ((VARIANT_BOOL)0);
m_apropStd[nStdIdx++].idsTypeInterp = IDS_VTBOOL;
m_apropStd[nStdIdx].dispid = DISPID_AMBIENT_TEXTALIGN;
m_apropStd[nStdIdx].strName.LoadString (IDS_APROPNAME_TEXTALIGN);
lpVar = &m_apropStd[nStdIdx].varValue;
V_VT (lpVar) = VT_I2;
V_I2 (lpVar) = 0;
m_apropStd[nStdIdx++].idsTypeInterp = IDS_VTI2;
m_apropStd[nStdIdx].dispid = DISPID_AMBIENT_BACKCOLOR;
m_apropStd[nStdIdx].strName.LoadString (IDS_APROPNAME_BACKCOLOR);
lpVar = &m_apropStd[nStdIdx].varValue;
V_VT (lpVar) = VT_I4;
V_I4 (lpVar) = GetSysColor (COLOR_WINDOW);
m_apropStd[nStdIdx++].idsTypeInterp = IDS_VTCOLOR;
m_apropStd[nStdIdx].dispid = DISPID_AMBIENT_FONT;
m_apropStd[nStdIdx].strName.LoadString (IDS_APROPNAME_FONT);
lpVar = &m_apropStd[nStdIdx].varValue;
VariantClear (lpVar);
{
m_strFaceName = _T("MS Sans Serif");
m_fntdesc.cbSizeofstruct = sizeof(m_fntdesc);
m_fntdesc.lpstrName = (LPOLESTR) m_strFaceName.GetBuffer(m_strFaceName.GetLength());
m_fntdesc.cySize.Lo = 80000L;
m_fntdesc.cySize.Hi = 0;
m_fntdesc.sWeight = FW_BOLD;
m_fntdesc.fItalic = FALSE;
m_fntdesc.fUnderline = FALSE;
m_fntdesc.fStrikethrough = FALSE;
if (m_lpFontHolder)
m_lpFontHolder->ReleaseFont ();
delete m_lpFontHolder;
m_lpFontHolder = NULL;
m_lpFontHolder = new CFontHolder (NULL);
if (m_lpFontHolder) {
m_lpFontHolder->InitializeFont (&m_fntdesc);
V_VT (lpVar) = VT_DISPATCH;
V_DISPATCH (lpVar) = m_lpFontHolder->GetFontDispatch ();
}
}
m_apropStd[nStdIdx++].idsTypeInterp = IDS_VTFONT;
m_apropStd[nStdIdx].dispid = DISPID_AMBIENT_FORECOLOR;
m_apropStd[nStdIdx].strName.LoadString (IDS_APROPNAME_FORECOLOR);
lpVar = &m_apropStd[nStdIdx].varValue;
V_VT (lpVar) = VT_I4;
V_I4 (lpVar) = GetSysColor (COLOR_WINDOWTEXT);
m_apropStd[nStdIdx++].idsTypeInterp = IDS_VTCOLOR;
m_apropStd[nStdIdx].dispid = DISPID_AMBIENT_SCALEUNITS;
m_apropStd[nStdIdx].strName.LoadString (IDS_APROPNAME_SCALEUNITS);
lpVar = &m_apropStd[nStdIdx].varValue;
V_VT (lpVar) = VT_BSTR;
V_BSTR (lpVar) = SysAllocStringLen ( (OLECHAR FAR*) _T(""), 32);
m_apropStd[nStdIdx++].idsTypeInterp = IDS_VTBSTR;
m_apropStd[nStdIdx].dispid = DISPID_AMBIENT_DISPLAYNAME;
m_apropStd[nStdIdx].strName.LoadString (IDS_APROPNAME_DISPLAYNAME);
lpVar = &m_apropStd[nStdIdx].varValue;
V_VT (lpVar) = VT_BSTR;
V_BSTR (lpVar) = SysAllocStringLen ( (OLECHAR FAR*) _T(""), 32);
m_apropStd[nStdIdx++].idsTypeInterp = IDS_VTBSTR;
m_apropStd[nStdIdx].dispid = DISPID_AMBIENT_LOCALEID;
m_apropStd[nStdIdx].strName.LoadString (IDS_APROPNAME_LOCALEID);
lpVar = &m_apropStd[nStdIdx].varValue;
V_VT (lpVar) = VT_I4;
V_I4 (lpVar) = GetUserDefaultLCID ();
m_apropStd[nStdIdx++].idsTypeInterp = IDS_VTI4;
m_apropStd[nStdIdx].dispid = DISPID_AMBIENT_MESSAGEREFLECT;
m_apropStd[nStdIdx].strName.LoadString (IDS_APROPNAME_MESSAGEREFLECT);
lpVar = &m_apropStd[nStdIdx].varValue;
V_VT (lpVar) = VT_BOOL;
V_BOOL (lpVar) = 0;
m_apropStd[nStdIdx++].idsTypeInterp = IDS_VTBOOL;
m_apropStd[nStdIdx].dispid = DISPID_AMBIENT_AUTOCLIP;
m_apropStd[nStdIdx].strName.LoadString (IDS_APROPNAME_AUTOCLIP);
lpVar = &m_apropStd[nStdIdx].varValue;
V_VT (lpVar) = VT_BOOL;
V_BOOL (lpVar) = 0;
m_apropStd[nStdIdx++].idsTypeInterp = IDS_VTBOOL;
m_nStdApropCt = nStdIdx;
// by default, no non-standard properties
return (bRet);
}
//=============================================================================
// Function: DestroyAmbientProps(BOOL bInitializing)
//-----------------------------------------------------------------------------
void CIEditDoc :: DestroyAmbientProps(BOOL bInitializing)
{
int nApropIdx = 0;
VARIANT FAR * lpVar;
while (nApropIdx < MAX_STD_APROP_CT)
{
lpVar = &m_apropStd[nApropIdx].varValue;
if ((! bInitializing) && (nApropIdx < m_nStdApropCt))
VariantClear(lpVar);
else
VariantInit(lpVar);
m_apropStd[nApropIdx].idsTypeInterp = IDS_VTOTHER;
nApropIdx++;
}
m_nStdApropCt = 0;
}
//=============================================================================
// Function: FindAprop (DISPID dispid)
//-----------------------------------------------------------------------------
LPAPROP CIEditDoc :: FindAprop (DISPID dispid)
{
LPAPROP papropRet = NULL;
LPAPROP papropCand = m_apropStd;
int nTryCt = m_nStdApropCt;
while ((papropRet == NULL) && (nTryCt--))
{
if ((papropCand->dispid == dispid)
&& (V_VT (&papropCand->varValue) != VT_EMPTY))
{
papropRet = papropCand;
}
papropCand++;
}
return (papropRet);
}
//=============================================================================
// Function: FindAprop (const TCHAR * pszName)
//-----------------------------------------------------------------------------
LPAPROP CIEditDoc :: FindAprop (OLECHAR FAR* FAR* pszName)
{
CString strTarget = *pszName;
LPAPROP papropRet = NULL;
LPAPROP papropCand = m_apropStd;
int nTryCt = m_nStdApropCt;
while ((papropRet == NULL) && (nTryCt--))
{
if ((papropCand->strName == strTarget)
&& (V_VT (&papropCand->varValue) != VT_EMPTY))
papropRet = papropCand;
papropCand++;
}
return (papropRet);
}
//=============================================================================
// Function: HRESULT TFVarCopy (VARIANT * pvarDest, VARIANT * pvarSrc)
//-----------------------------------------------------------------------------
HRESULT TFVarCopy (VARIANT * pvarDest, VARIANT * pvarSrc)
{
HRESULT hr = NOERROR;
VARTYPE vt = V_VT (pvarSrc);
if(
(
(V_ISBYREF (pvarSrc)) || (V_ISARRAY (pvarSrc))
||
(vt == VT_VARIANT) || (vt == VT_DISPATCH) || (vt == VT_UNKNOWN)
||
(vt == VT_PTR) || (vt == VT_SAFEARRAY) || (vt == VT_CARRAY)
||
(vt == VT_BSTR) || (vt == VT_LPSTR) || (vt == VT_LPWSTR)
)
&&
(V_I2REF (pvarSrc) == NULL)
)
{
VariantClear (pvarDest);
V_VT (pvarDest) = V_VT (pvarSrc);
V_I2REF (pvarDest) = NULL;
}
else
{
if ((vt == VT_BSTR) && (SysStringLen( V_BSTR (pvarSrc)) == 0) )
{
VariantClear (pvarDest);
V_VT (pvarDest) = V_VT (pvarSrc);
V_BSTR (pvarDest) = SysAllocStringLen ( (OLECHAR FAR*) _T(""), 32);
}
else
{
hr = VariantCopy (pvarDest, pvarSrc);
}
}
return (hr);
}