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.
2130 lines
51 KiB
2130 lines
51 KiB
/*
|
|
* SCCVIEW.CPP
|
|
* Copyright 1994 Systems Compatibility Corp.
|
|
*
|
|
* This is the implementation of the SCC QuickView FileViewer Object
|
|
* Author: Scott Norder
|
|
* Date: 2/24/94
|
|
*/
|
|
|
|
//#define DEBUG
|
|
|
|
#include "fileview.h"
|
|
|
|
#ifndef FVSIF_ZOOMED
|
|
#define FVSIF_ZOOMED 0x00000004 // It's maximized!
|
|
#endif
|
|
|
|
/*
|
|
* CFileViewer::CFileViewer
|
|
* CFileViewer::~CFileViewer
|
|
*
|
|
* Parameters (Constructor):
|
|
* pUnkOuter LPUNKNOWN of a controlling unknown.
|
|
* hInst HINSTANCE of the module we're in
|
|
* pfnDestroy LPFNDESTROYED to call when an object
|
|
* is destroyed.
|
|
*/
|
|
|
|
CFileViewer::CFileViewer(LPUNKNOWN pUnkOuter, HINSTANCE hInst
|
|
, PFNDESTROYED pfnDestroy)
|
|
{
|
|
m_cRef = 0;
|
|
m_pUnkOuter = pUnkOuter;
|
|
m_hInst = hInst;
|
|
m_pfnDestroy = pfnDestroy;
|
|
|
|
m_clsID = CLSID_SCCFileViewer;
|
|
|
|
m_pszPath = NULL;
|
|
m_pszAppName = NULL;
|
|
m_grfMode = 0L;
|
|
m_fLoadCalled = FALSE;
|
|
m_fShowInit = FALSE;
|
|
m_fPostQuitMsg = TRUE;
|
|
m_lpfsi = NULL;
|
|
|
|
//NULL any contained interfaces initially.
|
|
m_pIPersistFile= NULL;
|
|
m_pIFileViewer = NULL;
|
|
|
|
m_pST = NULL;
|
|
m_pSH = NULL;
|
|
m_fClassReg = FALSE;
|
|
|
|
m_hWnd = NULL;
|
|
m_hWndOld = NULL;
|
|
m_hWndToolbar = NULL;
|
|
m_hTBitmap = NULL;
|
|
m_hWndStatus = NULL;
|
|
|
|
//MODIFY: Initalize viewer-specific values
|
|
m_hSCCViewWnd = NULL;
|
|
m_hSCCPageWnd = NULL;
|
|
|
|
m_hProgIcon = NULL;
|
|
|
|
m_fOrientation = 0;
|
|
m_Rotation = 0;
|
|
m_fPageView = 0;
|
|
m_fMultiSection = FALSE;
|
|
m_wTimerCount = 0;
|
|
m_fUseOEMcharset = 0;
|
|
|
|
m_hMemText = NULL;
|
|
m_xPos = 0;
|
|
m_yPos = 0;
|
|
}
|
|
|
|
|
|
CFileViewer::~CFileViewer(void)
|
|
{
|
|
//MODIFY: m_hMemText and m_hFont are viewer-specific.
|
|
if (NULL!=m_hMemText)
|
|
GlobalFree(m_hMemText);
|
|
|
|
//MODIFY: Do any other viewer-specific cleanup
|
|
|
|
|
|
//Destroying the parent destroys the children as well
|
|
if (NULL!=m_hWnd)
|
|
{
|
|
m_fPostQuitMsg = FALSE; // Destroy from here implies not from our loop
|
|
if ( IsWindow (m_hWnd) )
|
|
DestroyWindow(m_hWnd);
|
|
}
|
|
|
|
if (m_hTBitmap != NULL)
|
|
DeleteObject(m_hTBitmap);
|
|
|
|
|
|
/*
|
|
* Unregistering the classes is important for DLL's because we
|
|
* should not assume that whoever loaded us (the task) is going
|
|
* to quit anytime soon and unregister the class. Normally
|
|
* QVStub is going to quit, but a test app like TestFV does not
|
|
* which can cause some development headaches.
|
|
*/
|
|
if (m_fClassReg)
|
|
{
|
|
UnregisterClass(String(IDS_CLASSFRAME), m_hInst);
|
|
UnregisterClass(String(IDS_CLASSVIEWPORT), m_hInst);
|
|
}
|
|
|
|
if (NULL!=m_pSH)
|
|
delete m_pSH;
|
|
|
|
if (NULL!=m_pST)
|
|
delete m_pST;
|
|
|
|
//Free the pathname string from IPersistFile::Load if we got one
|
|
if (NULL != m_pszPath)
|
|
MemFree(m_pszPath);
|
|
|
|
//Free the App Name string retrieved from the Registry.
|
|
if (NULL != m_pszAppName)
|
|
MemFree(m_pszAppName);
|
|
|
|
//Free contained interfaces.
|
|
if (NULL!=m_pIPersistFile)
|
|
delete m_pIPersistFile;
|
|
|
|
if (NULL!=m_pIFileViewer)
|
|
delete m_pIFileViewer;
|
|
|
|
if (NULL != m_hSCCVWDLL)
|
|
FreeLibrary(m_hSCCVWDLL);
|
|
|
|
// if (NULL != m_hSCCPageDLL)
|
|
// FreeLibrary(m_hSCCPageDLL);
|
|
|
|
|
|
if (NULL != m_lpfsi)
|
|
m_lpfsi->Release();
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
* CFileViewer::FileShowInit
|
|
*
|
|
* Purpose:
|
|
* Provides the implementation of IFileViewer::ShowInitialize
|
|
* that performs anything subject to failure.
|
|
*
|
|
* Parameters:
|
|
* None
|
|
*
|
|
* Return Value:
|
|
* HRESULT NOERROR or an appropriate error code.
|
|
*/
|
|
|
|
STDMETHODIMP CFileViewer::FileShowInit(LPFILEVIEWERSITE lpfsi)
|
|
{
|
|
HRESULT hr;
|
|
SCCVWFONTSPEC locFontSpec;
|
|
SCCVWOPTIONSPEC locOptionSpec;
|
|
LPSTR pTemp;
|
|
DWORD locCount = 0;
|
|
DWORD locFlags;
|
|
|
|
if (lpfsi != NULL)
|
|
// Save away the client site.
|
|
if (m_lpfsi != lpfsi)
|
|
{
|
|
if (NULL != m_lpfsi)
|
|
m_lpfsi->Release();
|
|
|
|
m_lpfsi = lpfsi;
|
|
m_lpfsi->AddRef();
|
|
}
|
|
|
|
//MODIFY: Do pre-show initialization here.
|
|
GetViewerSettings();
|
|
|
|
//Default error code
|
|
hr=ResultFromScode(E_OUTOFMEMORY);
|
|
|
|
//Create the main window passing "this" to it
|
|
// If m_hwnd is NULL we may have iterated a couple of times here
|
|
// with invalid files so don't overwrite the previous old hwnd
|
|
if (m_hWnd != NULL)
|
|
m_hWndOld = m_hWnd;
|
|
|
|
m_hWnd=CreateWindow(
|
|
String(IDS_CLASSFRAME)
|
|
, String(IDS_CAPTION)
|
|
, WS_SIZEBOX | WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN
|
|
, CW_USEDEFAULT , CW_USEDEFAULT, 350, 450
|
|
, NULL, NULL, m_hInst, (LPVOID)this);
|
|
|
|
if (NULL==m_hWnd)
|
|
{
|
|
ODS("CFileViewer::FileShow failed to create main window.");
|
|
return hr;
|
|
}
|
|
|
|
DragAcceptFiles(m_hWnd, TRUE);
|
|
|
|
if (!FInitFrameControls())
|
|
{
|
|
ODS("CFileViewer::FileShow failed to create frame tools.");
|
|
return hr;
|
|
}
|
|
|
|
m_pSH->MessageDisplay(ID_MSGREADY);
|
|
|
|
/*
|
|
* ViewportResize puts the viewport window created here
|
|
* in the right location, so we don't have to worry
|
|
* about initial position.
|
|
*/
|
|
|
|
// CHECK: Not getting proportional thumbs here-change to all DE's
|
|
// Let sccviewerclass window handle the scroll bars
|
|
|
|
|
|
if (NULL==m_hSCCPageDLL)
|
|
{
|
|
ODS("CFileViewer::FileShow failed to get page view window's DLL.");
|
|
return hr;
|
|
}
|
|
|
|
// pulled WS_BORDER SDN
|
|
|
|
m_hSCCViewWnd=CreateWindowEx(WS_EX_CLIENTEDGE
|
|
, String(IDS_CLASSVIEWPORT), "SCCViewer"
|
|
, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
|
|
, 0, 0, 100, 100, m_hWnd, (HMENU)ID_VIEWPORT
|
|
, m_hInst, (LPVOID) this);
|
|
|
|
|
|
m_hSCCPageWnd=CreateWindowEx(WS_EX_CLIENTEDGE
|
|
, String(IDS_CLASSVIEWTHUMB), "PageView"
|
|
, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
|
|
, 0, 0, 100, 100, m_hWnd, (HMENU)(ID_VIEWPORT+1)
|
|
, m_hInst, (LPVOID) this);
|
|
|
|
if (NULL==m_hSCCPageWnd)
|
|
{
|
|
ODS("CFileViewer::FileShow failed to create page view window.");
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
if (NULL==m_hSCCViewWnd)
|
|
{
|
|
ODS("CFileViewer::FileShow failed to create view window.");
|
|
return hr;
|
|
}
|
|
|
|
|
|
SendMessage ( m_hSCCViewWnd, SCCVW_SETUSERFLAGS,
|
|
SCCVW_SELFBACKGROUND, 0L);
|
|
|
|
if ( m_fPageView )
|
|
{
|
|
ShowWindow (m_hSCCViewWnd, SW_HIDE);
|
|
ShowWindow (m_hSCCPageWnd, SW_SHOW);
|
|
}
|
|
else
|
|
{
|
|
ShowWindow (m_hSCCViewWnd, SW_SHOW);
|
|
ShowWindow (m_hSCCPageWnd, SW_HIDE);
|
|
}
|
|
|
|
locFontSpec.wHeight = MulDiv(-m_LogFont.lfHeight, 72, m_cyPPI) * 2;
|
|
lstrcpy((char *)locFontSpec.szFace,m_LogFont.lfFaceName);
|
|
locFontSpec.wAttr = 0;
|
|
|
|
// OS Char set saved in registry, MAP to scc charset
|
|
locFontSpec.wType = GetSCCCharSet ( m_LogFont.lfCharSet );
|
|
|
|
locOptionSpec.dwId = SCCID_DEFAULTDISPLAYFONT;
|
|
locOptionSpec.dwFlags = SCCVWOPTION_CURRENT;
|
|
locOptionSpec.pData = &locFontSpec;
|
|
|
|
SendMessage(m_hSCCViewWnd,SCCVW_SETOPTION,0,(DWORD)(VOID FAR *)&locOptionSpec);
|
|
|
|
/*
|
|
| Go load the file. This means pulling into memory whatever
|
|
| is necessary for the initial display.
|
|
*/
|
|
|
|
hr=FileLoad();
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
ODS("CFileViewer::FileShow failed to load file.");
|
|
return hr;
|
|
}
|
|
|
|
m_hAccel=LoadAccelerators(m_hInst
|
|
, MAKEINTRESOURCE(IDR_ACCELERATORS));
|
|
|
|
/*
|
|
| Retrieve the application name from the registry
|
|
| Add the app name to the Open as strings, tooltips, and menu items
|
|
*/
|
|
|
|
// Allocate some storage
|
|
m_pszAppName = (LPSTR) MemAlloc (APPNAMESIZE);
|
|
pTemp = (LPSTR) MemAlloc ( 3*APPNAMESIZE );
|
|
|
|
if ( (NULL==pTemp) || (NULL==m_pszAppName) )
|
|
{
|
|
// This is very BAD if it happens
|
|
return hr;
|
|
}
|
|
|
|
// Get the string from the Registry
|
|
GetAppName ( m_pszPath, m_pszAppName, sizeof (m_pszAppName) );
|
|
|
|
FSetWindowTitle();
|
|
|
|
// Get the orientation right
|
|
DisplayOrientation ();
|
|
|
|
ViewportResize();
|
|
|
|
// Free the temporary storage
|
|
MemFree (pTemp);
|
|
|
|
//Tell IFileViewer::Show it's OK to call it
|
|
m_fShowInit=TRUE;
|
|
if (IsWindow(m_hSCCViewWnd))
|
|
SendMessage (m_hSCCViewWnd, SCCVW_GETSECTIONCOUNT, 0, (LPARAM) &locCount);
|
|
|
|
m_fMultiSection = (locCount > 1) ? TRUE : FALSE;
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* CFileViewer::FileShow
|
|
*
|
|
* Purpose:
|
|
* Displays the viewing window and enters a message loop. This
|
|
* function must not fail.
|
|
*
|
|
* Parameters:
|
|
* nCmdShow int indicating how to initially show the
|
|
* FileViewer window.
|
|
*
|
|
* Return Value:
|
|
* HRESULT NOERROR always
|
|
*/
|
|
|
|
STDMETHODIMP CFileViewer::FileShow(LPFVSHOWINFO pvsi)
|
|
{
|
|
MSG msg;
|
|
|
|
//
|
|
// We need to handle the case where the ShowInitialize may have
|
|
// failed and we set the hwnd to NULL and the hwndOld is not NULL.
|
|
// and the FVSIF_NEWFAILED is set. In this case set the hwnd Back
|
|
// to the old hwnd...
|
|
//
|
|
if ((pvsi->dwFlags & FVSIF_NEWFAILED) && (m_hWnd == NULL))
|
|
{
|
|
m_hWnd = m_hWndOld;
|
|
}
|
|
|
|
if (!IsWindow (m_hWnd))
|
|
return ResultFromScode(E_UNEXPECTED);
|
|
m_pvsi = pvsi; // Save away pointer to this information to use later
|
|
|
|
|
|
// If the new failed flag was passed to us we know that we got here
|
|
// because we tried to view a file and it failed, so simply go back
|
|
// to message loop...
|
|
if ((pvsi->dwFlags & FVSIF_NEWFAILED) == 0)
|
|
{
|
|
if (pvsi->dwFlags & FVSIF_RECT)
|
|
SetWindowPos(m_hWnd, NULL, pvsi->rect.left, pvsi->rect.top,
|
|
pvsi->rect.right - pvsi->rect.left, pvsi->rect.bottom - pvsi->rect.top,
|
|
SWP_NOZORDER | SWP_NOACTIVATE);
|
|
|
|
if (pvsi->dwFlags & FVSIF_ZOOMED) // #18312
|
|
ShowWindow(m_hWnd, SW_SHOWMAXIMIZED);
|
|
|
|
else if ((pvsi->iShow==SW_MINIMIZE) ||
|
|
(pvsi->iShow==SW_SHOWMINIMIZED) ||
|
|
(pvsi->iShow==SW_SHOWMINNOACTIVE))
|
|
{
|
|
pvsi->iShow= SW_SHOWNORMAL;
|
|
ShowWindow(m_hWnd, pvsi->iShow);
|
|
}
|
|
else
|
|
ShowWindow(m_hWnd, pvsi->iShow);
|
|
|
|
|
|
if (SW_HIDE!=pvsi->iShow)
|
|
{
|
|
SetForegroundWindow(m_hWnd);
|
|
SetActiveWindow(m_hWnd);
|
|
UpdateWindow(m_hWnd);
|
|
}
|
|
|
|
// If there is an Old window destroy it now
|
|
// It would be nicer to reuse the window!
|
|
if (pvsi->dwFlags & FVSIF_PINNED)
|
|
{
|
|
if (NULL != m_lpfsi)
|
|
{
|
|
m_lpfsi->SetPinnedWindow(NULL);
|
|
m_lpfsi->SetPinnedWindow(m_hWnd);
|
|
}
|
|
}
|
|
|
|
if ((NULL!=m_hWndOld) && IsWindow(m_hWndOld))
|
|
{
|
|
ODS("CFileViewer::FileShow Destroy Previous hwnd");
|
|
m_fPostQuitMsg = FALSE; // Don't destroy the queue for this one.
|
|
DestroyWindow(m_hWndOld);
|
|
m_hWndOld = NULL;
|
|
}
|
|
|
|
// See if there is someone else to release...
|
|
if (NULL!=pvsi->punkRel)
|
|
{
|
|
ODSlu("CFileViewer::FileShow Release of previous viewers punkRel(%x)", pvsi->punkRel);
|
|
pvsi->punkRel->Release();
|
|
pvsi->punkRel = NULL;
|
|
}
|
|
}
|
|
|
|
if (pvsi->dwFlags & FVSIF_ZOOMED) // #18312
|
|
ShowWindow(m_hWnd, SW_SHOWMAXIMIZED);
|
|
|
|
while (GetMessage(&msg, NULL, 0,0 ))
|
|
{
|
|
/*
|
|
| Since the view windows trap the mouse movements and don't pass
|
|
| them back up, we'll watch for them going down....
|
|
*/
|
|
|
|
if ( (msg.message == WM_RBUTTONDOWN) ||
|
|
(msg.message == WM_MOUSEMOVE) )
|
|
{
|
|
if ( (msg.hwnd == m_hSCCViewWnd) ||
|
|
( IsChild (m_hSCCViewWnd,msg.hwnd) ) ||
|
|
(msg.hwnd == m_hSCCPageWnd) ||
|
|
( IsChild (m_hSCCPageWnd, msg.hwnd) ) )
|
|
|
|
MouseHandler (msg.message, msg.wParam, msg.lParam );
|
|
|
|
}
|
|
|
|
if (!TranslateAccelerator(m_hWnd, m_hAccel, &msg))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
|
|
// If there is a new file bail out now.
|
|
if (m_pvsi->dwFlags & FVSIF_NEWFILE)
|
|
break;
|
|
}
|
|
|
|
//MODIFY: Perform cleanup here.
|
|
|
|
SaveViewerSettings();
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
* CFileViewer::PrintTo
|
|
*
|
|
* Purpose:
|
|
* Provides the implementation of IFileViewer::PrintTo that
|
|
* prints the file to a given printer driver, suppressing UI
|
|
* if necessary.
|
|
*
|
|
* Parameters:
|
|
* pszDriver LPSTR with the path of the driver to use.
|
|
* If NULL, use the default driver.
|
|
* fSuppressUI BOOL indicating if this function is to show any
|
|
* UI or not.
|
|
*
|
|
* Return Value:
|
|
* HRESULT NOERROR on success, error code otherwise.
|
|
*/
|
|
|
|
STDMETHODIMP CFileViewer::PrintTo(LPSTR pszDriver
|
|
, BOOL fSuppressUI)
|
|
{
|
|
//Printing not implemented in this sample
|
|
//MODIFY: Add your printing code here.
|
|
return ResultFromScode(E_NOTIMPL);
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// CFileViewer::MemSet
|
|
//
|
|
//
|
|
//
|
|
void CFileViewer::MemSet (char *pData, char cSet, SHORT size)
|
|
{
|
|
SHORT i;
|
|
|
|
for (i=0; i<size; i++)
|
|
*(pData+i) = cSet;
|
|
|
|
}
|
|
|
|
/*
|
|
* CFileViewer::FileLoad
|
|
*
|
|
* Purpose:
|
|
* Loads the file with the path in m_pszPath and places the
|
|
* contents into the m_hWndViewport window.
|
|
*/
|
|
|
|
HRESULT CFileViewer::FileLoad(void)
|
|
{
|
|
SCCVWVIEWFILE ViewFile;
|
|
DWORD dwRet;
|
|
|
|
if (NULL==m_pszPath)
|
|
return ResultFromScode(E_UNEXPECTED);
|
|
|
|
// CHECK_ME If the I/F says view as hex then change wParam
|
|
|
|
MemSet ( (char *)&ViewFile, 0, sizeof (SCCVWVIEWFILE) );
|
|
ViewFile.dwSize = sizeof (SCCVWVIEWFILE);
|
|
ViewFile.dwSpecType = IOTYPE_ANSIPATH;
|
|
ViewFile.pSpec = m_pszPath;
|
|
|
|
dwRet = (DWORD)SendMessage (m_hSCCViewWnd, SCCVW_VIEWFILE,
|
|
NULL, (LPARAM) &ViewFile);
|
|
|
|
if (IsWindow (m_hSCCPageWnd) )
|
|
SendMessage(m_hSCCPageWnd, SCCPG_SETVIEWWND, (WPARAM)m_hSCCViewWnd, 0);
|
|
|
|
if (dwRet != SCCVWERR_OK)
|
|
{
|
|
PostMessage(m_hWnd, WM_CLOSE, 0, 0L);
|
|
|
|
switch (dwRet)
|
|
{
|
|
case SCCVWERR_FILEOPENFAILED:
|
|
return FV_E_FILEOPENFAILED;
|
|
|
|
case SCCVWERR_EMPTYFILE:
|
|
return FV_E_EMPTYFILE;
|
|
|
|
case SCCVWERR_NOFILTER:
|
|
return FV_E_NOFILTER;
|
|
|
|
case SCCVWERR_FILTERLOADFAILED:
|
|
case SCCVWERR_FILTERALLOCFAILED:
|
|
case SCCVWERR_CHUNKERINITFAILED:
|
|
case SCCVWERR_DISPLAYINITFAILED:
|
|
case SCCVWERR_ALLOCFAILED:
|
|
return FV_E_OUTOFMEMORY;
|
|
|
|
case SCCVWERR_BADFILE:
|
|
return FV_E_BADFILE;
|
|
|
|
case SCCVWERR_SUPFILEOPENFAILED:
|
|
return FV_E_MISSINGFILES;
|
|
|
|
case SCCVWERR_UNSUPPORTEDFORMAT:
|
|
return FV_E_NONSUPPORTEDTYPE;
|
|
|
|
case SCCVWERR_NODISPLAYENGINE:
|
|
return FV_E_NOVIEWER;
|
|
|
|
case SCCVWERR_PROTECTEDFILE:
|
|
return FV_E_PROTECTEDFILE;
|
|
|
|
case SCCVWERR_UNKNOWNFAILURE:
|
|
case SCCVWERR_BADPARAM:
|
|
case SCCVWERR_INVALIDID:
|
|
return FV_E_UNEXPECTED;
|
|
|
|
default:
|
|
return FV_E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
OptionsChange ( NULL );
|
|
|
|
SetTimer (m_hWnd, MULTISECTIONCHECK, 4000, (TIMERPROC) NULL); // 4 seconds
|
|
|
|
return ResultFromScode (S_OK);
|
|
}
|
|
|
|
/*
|
|
* CFileViewer::CloseWindow
|
|
*
|
|
* Purpose:
|
|
* Called when the window is destroyed to do any cleanup
|
|
*/
|
|
|
|
void CFileViewer::CloseWindow(void)
|
|
{
|
|
HWND hwndPinned;
|
|
if (NULL != m_lpfsi)
|
|
{
|
|
m_lpfsi->GetPinnedWindow(&hwndPinned);
|
|
if (hwndPinned == m_hWnd)
|
|
m_lpfsi->SetPinnedWindow(NULL);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
* CFileViewer::OnCommand
|
|
*
|
|
* Purpose:
|
|
* WM_COMMAND message handler for a FileViewer window.
|
|
*
|
|
* Parameters:
|
|
* wID WORD ID of the command.
|
|
* wCode WORD notification code with the command
|
|
* hWndCtl HWND sending the message (if a control)
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*/
|
|
|
|
void CFileViewer::OnCommand(WORD wID, WORD wCode, HWND hWndCtl)
|
|
{
|
|
|
|
switch (wID)
|
|
{
|
|
case IDM_FILEOPENAS:
|
|
if (FOpenAs())
|
|
PostMessage(m_hWnd, WM_CLOSE, 0, 0L);
|
|
break;
|
|
|
|
case IDM_FILEPAGESETUP:
|
|
//Not implemented
|
|
break;
|
|
|
|
case IDM_FILEPRINT:
|
|
//Not implemented
|
|
break;
|
|
|
|
case IDM_FILEEXIT:
|
|
PostMessage(m_hWnd, WM_CLOSE, 0, 0L);
|
|
break;
|
|
|
|
case IDM_VIEWTOOLBAR:
|
|
m_fToolsVisible=!m_fToolsVisible;
|
|
OptionsChange (NULL);
|
|
//Resize the viewport window
|
|
ViewportResize();
|
|
break;
|
|
|
|
case IDM_VIEWSTATUSBAR:
|
|
m_fStatusVisible=!m_fStatusVisible;
|
|
OptionsChange (NULL);
|
|
//Resize the viewport window
|
|
ViewportResize();
|
|
break;
|
|
|
|
case IDM_VIEWFONT:
|
|
FontChange(VIEWFONT_SELECT);
|
|
break;
|
|
|
|
case IDM_VIEWFONTINCREASE:
|
|
FontChange(VIEWFONT_INCREASESIZE);
|
|
break;
|
|
|
|
case IDM_VIEWFONTDECREASE:
|
|
FontChange(VIEWFONT_DECREASESIZE);
|
|
break;
|
|
|
|
case IDM_VIEWSMALLVIEW:
|
|
SwitchView();
|
|
OptionsChange(NULL);
|
|
break;
|
|
|
|
case IDM_VIEWREPLACE:
|
|
// Switch the Replace mode
|
|
ReplaceWindowModeChange();
|
|
OptionsChange(NULL);
|
|
break;
|
|
|
|
case IDM_VIEWROTATE:
|
|
RotateView();
|
|
break;
|
|
|
|
case IDM_VIEWLANDSCAPE:
|
|
SwitchOrientation();
|
|
OptionsChange (NULL);
|
|
break;
|
|
|
|
case IDM_HELPCONTENTS:
|
|
//WinHelp (m_hWnd, String(IDS_HELPFILE), HELP_FINDER,(DWORD)0);
|
|
{
|
|
char helpFile[20];
|
|
|
|
wsprintf( helpFile, "%s%s", String(IDS_HELPFILE), ">proc4" );
|
|
WinHelp (m_hWnd, helpFile, HELP_CONTEXT, IDH_FILEVIEWERPREVIEW);
|
|
}
|
|
break;
|
|
|
|
case IDM_HELPINFO:
|
|
WinHelp (m_hWnd, String(IDS_HELPFILE), HELP_CONTEXTPOPUP, IDH_FILEVIEWERPREVIEW);
|
|
break;
|
|
|
|
case IDM_WHATSTHIS:
|
|
WinHelp (m_hWnd, String(IDS_HELPFILE), HELP_CONTEXTPOPUP, IDH_QVIEW_DISPLAY);
|
|
break;
|
|
|
|
case IDM_HELPABOUT:
|
|
OnAppAbout ();
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
* CFileViewer::ChildrenResize
|
|
*
|
|
* Purpose:
|
|
* Handles the situation when the FileViewer frame window was
|
|
* resized in which case we have to resize the toolbar and
|
|
* the status bar to match as well as the viewport. We use
|
|
* the ViewportResize function to update the viewport size and
|
|
* position depending on the state of the tools.
|
|
*
|
|
* Note that the toolbar and status bar are resized even when
|
|
* they are not visible so we can just reshow them again when
|
|
* necessary.
|
|
*
|
|
* Parameters:
|
|
* None
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*/
|
|
|
|
void CFileViewer::ChildrenResize(void)
|
|
{
|
|
RECT rc;
|
|
DWORD locCount = 0;
|
|
|
|
// Check whether this is a multisection image
|
|
if (IsWindow(m_hSCCViewWnd))
|
|
SendMessage (m_hSCCViewWnd, SCCVW_GETSECTIONCOUNT, 0, (LPARAM) &locCount);
|
|
m_fMultiSection = (locCount > 1) ? TRUE : FALSE;
|
|
|
|
GetClientRect(m_hWnd, &rc);
|
|
|
|
//We resize toolbar and status bar regardless of visibility
|
|
SetWindowPos(m_hWndToolbar, NULL, 0, 0,
|
|
rc.right-rc.left, m_cyTools,
|
|
SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
|
|
|
|
SetWindowPos(m_hWndStatus, NULL, 0, rc.bottom-m_cyStatus,
|
|
rc.right-rc.left, m_cyStatus,
|
|
SWP_NOZORDER | SWP_NOACTIVATE);
|
|
|
|
ViewportResize();
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
* CFileViewer::ViewportResize
|
|
*
|
|
* Purpose:
|
|
* Updates the size and position of the viewport window
|
|
* depending on visibility of the toolbar and status bar.
|
|
*
|
|
* Parameters:
|
|
* None
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*/
|
|
|
|
void CFileViewer::ViewportResize(void)
|
|
{
|
|
RECT rc;
|
|
UINT dy1, dy2;
|
|
int locViewTop;
|
|
int locViewLeft;
|
|
int locViewWidth;
|
|
int locViewHeight;
|
|
|
|
GetClientRect(m_hWnd, &rc);
|
|
|
|
dy1=m_fToolsVisible ? m_cyTools : 0;
|
|
dy2=m_fStatusVisible ? m_cyStatus : 0;
|
|
|
|
locViewTop = dy1;
|
|
locViewLeft = 0;
|
|
locViewWidth = rc.right-rc.left;
|
|
locViewHeight = rc.bottom-rc.top-dy1-dy2;
|
|
|
|
SetWindowPos(m_hSCCViewWnd, NULL, 0, dy1,
|
|
rc.right-rc.left, rc.bottom-rc.top-dy1-dy2,
|
|
SWP_NOZORDER | SWP_NOACTIVATE);
|
|
|
|
ShowWindow(m_hWndSizeGrip, (m_fStatusVisible || m_fPageView) ? SW_HIDE : SW_SHOW);
|
|
SetWindowPos(m_hWndSizeGrip, HWND_TOP, locViewLeft+locViewWidth-GetSystemMetrics(SM_CXVSCROLL)-2, locViewTop+locViewHeight-GetSystemMetrics(SM_CYHSCROLL)-2, GetSystemMetrics(SM_CXVSCROLL), GetSystemMetrics(SM_CYHSCROLL),
|
|
SWP_NOACTIVATE);
|
|
|
|
if (IsWindow ( m_hSCCPageWnd ) )
|
|
SetWindowPos(m_hSCCPageWnd, NULL, 0, dy1,
|
|
rc.right-rc.left, rc.bottom-rc.top-dy1-dy2,
|
|
SWP_NOZORDER | SWP_NOACTIVATE);
|
|
|
|
ShowWindow(m_hWndStatus, m_fStatusVisible ? SW_SHOW : SW_HIDE);
|
|
|
|
ShowWindow(m_hWndToolbar, m_fToolsVisible ? SW_SHOW : SW_HIDE);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef NEVER
|
|
/*
|
|
* CFileViewer::ViewportScrollSet
|
|
*
|
|
* Purpose:
|
|
* Updates the scrollbar ranges in the viewport depending on
|
|
* the current font in use and the size of the window.
|
|
*
|
|
* Parameters:
|
|
* None
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*/
|
|
|
|
void CFileViewer::ViewportScrollSet(void)
|
|
{
|
|
RECT rc, rcFmt;
|
|
LPSTR psz;
|
|
HDC hDC;
|
|
HFONT hFont;
|
|
|
|
if (NULL==m_hMemText)
|
|
return;
|
|
|
|
psz=(LPSTR)GlobalLock(m_hMemText);
|
|
hDC=GetDC(m_hWndViewport);
|
|
hFont=(HFONT)SelectObject(hDC, m_hFont);
|
|
|
|
/*
|
|
* Set initially large formatting rectangle, and let
|
|
* DrawText walk all over it.
|
|
*/
|
|
SetRect(&rcFmt, 0, 0, 32767, 32767);
|
|
DrawText(hDC, psz, -1, &rcFmt, DT_LEFT | DT_CALCRECT
|
|
| DT_EXPANDTABS);
|
|
|
|
SelectObject(hDC, hFont);
|
|
ReleaseDC(m_hWndViewport, hDC);
|
|
|
|
GetClientRect(m_hWndViewport, &rc);
|
|
|
|
//Scroll ranges are draw rect minus visible rect, +1 for buffer
|
|
SetScrollRange(m_hWndViewport, SB_HORZ, 0
|
|
, ((rcFmt.right-rcFmt.left)-(rc.right-rc.left))+1, FALSE);
|
|
SetScrollPos(m_hWndViewport, SB_HORZ, 0, TRUE);
|
|
m_xPos=0;
|
|
|
|
SetScrollRange(m_hWndViewport, SB_VERT, 0
|
|
, ((rcFmt.bottom-rcFmt.top)-(rc.bottom-rc.top))+1, FALSE);
|
|
SetScrollPos(m_hWndViewport, SB_VERT, 0, TRUE);
|
|
m_yPos=0;
|
|
|
|
GlobalUnlock(m_hMemText);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
* CFileViewer::FOpenAs
|
|
*
|
|
* Purpose:
|
|
* Attempts to launch an application to open the file for
|
|
* editing.
|
|
*
|
|
* Parameters:
|
|
* None
|
|
*
|
|
* Return Value:
|
|
* BOOL TRUE if the application is opened in which case
|
|
* the FileViewer can shut down. Otherwise FALSE
|
|
* meaning launching failed.
|
|
*/
|
|
|
|
BOOL CFileViewer::FOpenAs(void)
|
|
{
|
|
DWORD locRet;
|
|
SHELLEXECUTEINFO shinfo;
|
|
|
|
MemSet ( (char *)&shinfo, 0, sizeof (SHELLEXECUTEINFO) );
|
|
shinfo.cbSize = sizeof(SHELLEXECUTEINFO);
|
|
shinfo.hwnd = m_hWnd;
|
|
shinfo.lpVerb = "EDIT";
|
|
shinfo.lpFile = m_pszPath;
|
|
shinfo.lpParameters = NULL;
|
|
shinfo.lpDirectory = NULL;
|
|
shinfo.nShow = SW_SHOWNORMAL;
|
|
shinfo.hInstApp= m_hInst;
|
|
shinfo.fMask = SEE_MASK_FLAG_NO_UI;
|
|
|
|
SendMessage ( m_hSCCViewWnd, SCCVW_CLOSEFILE, (WPARAM) 0, (LPARAM) 0L);
|
|
|
|
locRet = ShellExecuteEx(&shinfo);
|
|
|
|
// if SHell ex fails, reopen the document... positioning?
|
|
if (locRet==0)
|
|
{
|
|
shinfo.lpVerb = NULL;
|
|
locRet = ShellExecuteEx(&shinfo);
|
|
|
|
if (locRet==0)
|
|
{
|
|
FileLoad ();
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
/*
|
|
* CFileViewer::FontChange
|
|
*
|
|
* Purpose:
|
|
* Either allows the user to choose a font or increments or
|
|
* decrements the font size depending on uOpt. This is all
|
|
* handled in one function here because each operation
|
|
* involves obtaining the current viewport font, messing with
|
|
* it in some way, and setting a new font again.
|
|
*
|
|
* Parameters:
|
|
* uOpt VIEWFONTOPTION of the way to change the font:
|
|
* VIEWFONT_SELECT Display dialog
|
|
* VIEWFONT_INCREASE Increase size by 2pt
|
|
* VIEWFONT_DECREASE Decreate size by 2pt
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*/
|
|
|
|
#ifndef CF_NOVERTFONTS
|
|
#define CF_NOVERTFONTS 0x01000000L
|
|
#endif
|
|
|
|
void CFileViewer::FontChange(VIEWFONTOPTION uOpt)
|
|
{
|
|
LOGFONT lf;
|
|
CHOOSEFONT cf;
|
|
BOOL fChange=TRUE;
|
|
int z;
|
|
SCCVWFONTSPEC locFontSpec;
|
|
SCCVWOPTIONSPEC locOptionSpec;
|
|
|
|
/*
|
|
* We have a system font from the constructor, so m_hFont
|
|
* will never be NULL, but assert it anyway.
|
|
*/
|
|
// D(if (NULL==m_hFont) ODS("Assertion Failed: m_hFont is NULL"););
|
|
// GetObject(m_hFont, sizeof(lf), &lf);
|
|
|
|
lf = m_LogFont;
|
|
|
|
/*
|
|
* Each option is responsible for manipulating
|
|
* the LOGFONT structure in some way. If there
|
|
* is nothing to do, they set fChange to FALSE
|
|
*/
|
|
|
|
switch (uOpt)
|
|
{
|
|
case VIEWFONT_SELECT:
|
|
MemSet((char *)&cf, 0, sizeof(CHOOSEFONT));
|
|
cf.lStructSize=sizeof(CHOOSEFONT);
|
|
cf.hwndOwner =m_hWnd;
|
|
cf.lpLogFont =&lf;
|
|
cf.nSizeMin =FONTSIZETHRESHOLDMIN;
|
|
cf.nSizeMax =FONTSIZETHRESHOLDMAX;
|
|
cf.lpfnHook = NULL; // FileViewerFontHookProc;
|
|
cf.lpTemplateName = "SCCCHOOSEFONT";
|
|
cf.hInstance = m_hInst;
|
|
|
|
cf.Flags=CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT
|
|
| CF_NOVERTFONTS
|
|
| CF_FORCEFONTEXIST | CF_ENABLETEMPLATE;
|
|
// | CF_ENABLEHOOK;
|
|
|
|
if (!ChooseFont(&cf))
|
|
{
|
|
D(DWORD dwErr=CommDlgExtendedError();
|
|
ODSlu("SCCVIEW.DLL: ChooseFont failed with %lu", dwErr););
|
|
|
|
fChange=FALSE;
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
case VIEWFONT_INCREASESIZE:
|
|
//Convert logical size to point size.
|
|
z=MulDiv(-lf.lfHeight, 72, m_cyPPI);
|
|
|
|
//Vary the size increase depending on point size.
|
|
if (z < FONTSIZETHRESHOLDMAX)
|
|
{
|
|
if (z < FONTSIZETHRESHOLDLOW)
|
|
z+=FONTSIZEDELTASMALL;
|
|
else
|
|
{
|
|
if (z < FONTSIZETHRESHOLDMID)
|
|
z+=FONTSIZEDELTAMEDIUM;
|
|
else
|
|
z+=FONTSIZEDELTALARGE;
|
|
}
|
|
|
|
//Convert point size to logical size.
|
|
lf.lfHeight=MulDiv(-z, m_cyPPI, 72);
|
|
}
|
|
else
|
|
fChange=FALSE;
|
|
|
|
break;
|
|
|
|
|
|
case VIEWFONT_DECREASESIZE:
|
|
//Convert logical size to point size.
|
|
z=MulDiv(-lf.lfHeight, 72, m_cyPPI);
|
|
|
|
//Vary the size decrease depending on point size.
|
|
if (z > FONTSIZETHRESHOLDMIN)
|
|
{
|
|
if (z > FONTSIZETHRESHOLDMID)
|
|
z-=FONTSIZEDELTALARGE;
|
|
else
|
|
{
|
|
if (z > FONTSIZETHRESHOLDLOW)
|
|
z-=FONTSIZEDELTAMEDIUM;
|
|
else
|
|
z-=FONTSIZEDELTASMALL;
|
|
}
|
|
|
|
//Convert point size to logical size.
|
|
lf.lfHeight=MulDiv(-z, m_cyPPI, 72);
|
|
}
|
|
else
|
|
fChange=FALSE;
|
|
|
|
break;
|
|
|
|
default:
|
|
fChange=FALSE;
|
|
}
|
|
|
|
//Return now if we didn't change anything.
|
|
if (!fChange)
|
|
return;
|
|
|
|
locFontSpec.wHeight = MulDiv(-lf.lfHeight, 72, m_cyPPI) * 2;
|
|
|
|
lstrcpy((char *)locFontSpec.szFace,lf.lfFaceName);
|
|
locFontSpec.wAttr = 0;
|
|
|
|
locFontSpec.wType = GetSCCCharSet ( lf.lfCharSet );
|
|
|
|
locOptionSpec.dwId = SCCID_DEFAULTDISPLAYFONT;
|
|
locOptionSpec.dwFlags = SCCVWOPTION_CURRENT;
|
|
locOptionSpec.pData = &locFontSpec;
|
|
|
|
SendMessage(m_hSCCViewWnd,SCCVW_SETOPTION,0,(DWORD)(VOID FAR *)&locOptionSpec);
|
|
SendMessage(m_hSCCPageWnd,SCCPG_RESTART, 0, 0L);
|
|
|
|
ODSu ( "The Character set return in the logfont is : %u", lf.lfCharSet);
|
|
|
|
m_LogFont = lf;
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* CFileViewer::ReplaceWindowModeChange
|
|
*
|
|
* Purpose:
|
|
* Sets the window to be pinned or not to be pinned. When the
|
|
* window is pinned, the caller of the viewers will attempt
|
|
* to replace the contents of the window instead of creating
|
|
* new windows.
|
|
*
|
|
* Parameters:
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*/
|
|
|
|
void CFileViewer::ReplaceWindowModeChange(void)
|
|
{
|
|
HWND hwnd;
|
|
|
|
if (m_lpfsi)
|
|
{
|
|
m_lpfsi->GetPinnedWindow(&hwnd);
|
|
if ((HWND)NULL==hwnd)
|
|
{
|
|
m_lpfsi->SetPinnedWindow(m_hWnd);
|
|
SendMessage (m_hWndToolbar, TB_CHECKBUTTON, (WPARAM)IDM_VIEWREPLACE,
|
|
MAKELONG ( TRUE, 0 ) );
|
|
}
|
|
else
|
|
{
|
|
if (hwnd==m_hWnd)
|
|
{
|
|
m_lpfsi->SetPinnedWindow(NULL);
|
|
SendMessage (m_hWndToolbar, TB_CHECKBUTTON, (WPARAM)IDM_VIEWREPLACE,
|
|
MAKELONG ( FALSE, 0 ) );
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
* CFileViewer::PszToolTip
|
|
*
|
|
* Purpose:
|
|
* Returns a string pointer to a tool tip for the given command
|
|
* ID value. When asked for a string we also display a similar
|
|
* one in the status bar.
|
|
*
|
|
* Parameters:
|
|
* uID UINT of the toolbar button command.
|
|
*
|
|
* Return Value:
|
|
* LPSTR Pointer to the string to display.
|
|
*/
|
|
|
|
LPSTR CFileViewer::PszToolTip(UINT uID)
|
|
{
|
|
UINT iString, iStatusMsg;
|
|
|
|
switch (uID)
|
|
{
|
|
case IDM_FILEOPENAS:
|
|
iString=IDS_TOOLTIPOPENAS;
|
|
iStatusMsg=IDM_FILEOPENAS;
|
|
break;
|
|
|
|
case IDM_VIEWFONTINCREASE:
|
|
iString=IDS_TOOLTIPFONTINC;
|
|
iStatusMsg=ID_TIPFONTINC;
|
|
break;
|
|
|
|
case IDM_VIEWFONTDECREASE:
|
|
iString=IDS_TOOLTIPFONTDEC;
|
|
iStatusMsg=ID_TIPFONTDEC;
|
|
break;
|
|
|
|
case IDM_VIEWREPLACE:
|
|
iString=IDS_TIPREPLACE;
|
|
iStatusMsg=IDM_VIEWREPLACE;
|
|
break;
|
|
|
|
case 0:
|
|
// The separator bitmap
|
|
return NULL;
|
|
|
|
default:
|
|
return NULL;
|
|
}
|
|
|
|
m_pSH->MessageDisplay(iStatusMsg);
|
|
return String(iString);
|
|
}
|
|
|
|
/*
|
|
|
|
|
| CFileViewer::SwitchView
|
|
|
|
|
*/
|
|
|
|
void CFileViewer::SwitchView (void)
|
|
{
|
|
m_fPageView = 1 - m_fPageView;
|
|
|
|
if ( m_fPageView )
|
|
{
|
|
ShowWindow (m_hSCCViewWnd, SW_HIDE);
|
|
ShowWindow (m_hSCCPageWnd, SW_SHOW);
|
|
SetFocus(m_hSCCPageWnd);
|
|
}
|
|
else
|
|
{
|
|
SetFocus(m_hSCCViewWnd);
|
|
ShowWindow (m_hSCCViewWnd, SW_SHOW);
|
|
ShowWindow (m_hSCCPageWnd, SW_HIDE);
|
|
}
|
|
|
|
ChildrenResize ();
|
|
|
|
// CHECK - We need to reset the file to beginning on this switch.
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
|
|
|
| CFileViewer::RotateView
|
|
|
|
|
*/
|
|
|
|
void CFileViewer::RotateView (void)
|
|
{
|
|
SCCVWOPTIONSPEC locOptionSpec;
|
|
DWORD dwRotation;
|
|
|
|
m_Rotation++;
|
|
|
|
if (m_Rotation > 3)
|
|
m_Rotation = 0;
|
|
|
|
// CHECK - Need spec for message to set rotation
|
|
|
|
switch (m_Rotation)
|
|
{
|
|
case 1:
|
|
dwRotation = SCCID_BMPROTATION_90;
|
|
break;
|
|
case 2:
|
|
dwRotation = SCCID_BMPROTATION_180;
|
|
break;
|
|
case 3:
|
|
dwRotation = SCCID_BMPROTATION_270;
|
|
break;
|
|
case 0:
|
|
default:
|
|
dwRotation = SCCID_BMPROTATION_0;
|
|
break;
|
|
}
|
|
|
|
locOptionSpec.dwId = SCCID_BMPROTATION;
|
|
locOptionSpec.dwFlags = SCCVWOPTION_CURRENT;
|
|
locOptionSpec.pData = &dwRotation;
|
|
|
|
if (IsWindow (m_hSCCViewWnd))
|
|
SendMessage(m_hSCCViewWnd,SCCVW_SETOPTION,0,(DWORD)(VOID FAR *)&locOptionSpec);
|
|
if (IsWindow (m_hSCCPageWnd))
|
|
SendMessage(m_hSCCPageWnd,SCCVW_SETOPTION,0,(DWORD)(VOID FAR *)&locOptionSpec);
|
|
|
|
return;
|
|
}
|
|
|
|
/*
|
|
|
|
|
| CFileViewer::SwitchOrientation
|
|
|
|
|
*/
|
|
|
|
void CFileViewer::SwitchOrientation (void)
|
|
{
|
|
m_fOrientation = 1 - m_fOrientation;
|
|
|
|
DisplayOrientation ();
|
|
|
|
ChildrenResize ();
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
|
|
|
| CFileViewer::GetViewerSettings
|
|
|
|
|
*/
|
|
UINT CFileViewer::GetViewerSettings(void)
|
|
{
|
|
char szKey[256];
|
|
char szValue[128];
|
|
HKEY locKey;
|
|
LONG lRet;
|
|
DWORD locType;
|
|
DWORD locSize;
|
|
LPDWORD locReserved=NULL;
|
|
LONG locHeight;
|
|
|
|
/*
|
|
| The registry entry looks like:
|
|
| HKEY_CURRENT_USER\Software\SCC\QuickViewer\1.0\...
|
|
| Let's use the version resource to handle some of the text?
|
|
*/
|
|
|
|
strcpy ( szKey, "Software\\SCC\\QuickViewer\\1.00" );
|
|
lRet = RegOpenKeyEx ( HKEY_CURRENT_USER, szKey,
|
|
0, KEY_READ, &locKey );
|
|
|
|
if (lRet == ERROR_SUCCESS)
|
|
{
|
|
strcpy (szValue, "CurrentFontName");
|
|
locSize = sizeof (szKey);
|
|
lRet = RegQueryValueEx ( locKey, szValue, locReserved,
|
|
&locType, (unsigned char *)szKey, &locSize );
|
|
|
|
// Just got the font name, copy to the logfont structure
|
|
if (lRet == ERROR_SUCCESS)
|
|
strcpy (m_LogFont.lfFaceName, szKey);
|
|
|
|
|
|
strcpy (szValue, "CurrentFontSize");
|
|
locSize = sizeof (locHeight);
|
|
lRet = RegQueryValueEx ( locKey, szValue, locReserved,
|
|
&locType, (unsigned char *)&locHeight, &locSize );
|
|
|
|
// Just got the font size, copy to the logfont structure
|
|
if (lRet == ERROR_SUCCESS)
|
|
m_LogFont.lfHeight = locHeight;
|
|
|
|
|
|
|
|
strcpy (szValue, "UseOEMCharSet");
|
|
locSize = sizeof (locHeight);
|
|
lRet = RegQueryValueEx ( locKey, szValue, locReserved,
|
|
&locType, (unsigned char *)&locHeight, &locSize );
|
|
|
|
// Just got the charset flag for font dlg, copy to the member
|
|
if (lRet == ERROR_SUCCESS)
|
|
m_fUseOEMcharset = locHeight;
|
|
|
|
|
|
|
|
strcpy (szValue, "CurrentFontCharSet");
|
|
locSize = sizeof (locHeight);
|
|
lRet = RegQueryValueEx ( locKey, szValue, locReserved,
|
|
&locType, (unsigned char *)&locHeight, &locSize );
|
|
|
|
// Just got the font size, copy to the logfont structure
|
|
if (lRet == ERROR_SUCCESS)
|
|
m_LogFont.lfCharSet = (char)(locHeight & 0xFF) ;
|
|
else
|
|
m_LogFont.lfCharSet = ANSI_CHARSET;
|
|
|
|
|
|
strcpy (szValue, "Orientation");
|
|
locSize = sizeof (locHeight);
|
|
lRet = RegQueryValueEx ( locKey, szValue, locReserved,
|
|
&locType, (unsigned char *)&locHeight, &locSize );
|
|
|
|
// Just got the orientation, copy to the object member variable
|
|
if (lRet == ERROR_SUCCESS)
|
|
m_fOrientation = locHeight;
|
|
|
|
|
|
strcpy (szValue, "PageView");
|
|
locSize = sizeof (locHeight);
|
|
lRet = RegQueryValueEx ( locKey, szValue, locReserved,
|
|
&locType, (unsigned char *)&locHeight, &locSize );
|
|
|
|
// Just got the flag for PageView
|
|
if (lRet == ERROR_SUCCESS)
|
|
m_fPageView = locHeight;
|
|
|
|
strcpy (szValue, "Toolbar");
|
|
locSize = sizeof (locHeight);
|
|
lRet = RegQueryValueEx ( locKey, szValue, locReserved,
|
|
&locType, (unsigned char *)&locHeight, &locSize );
|
|
|
|
// Just got the flag for Toolbar
|
|
// If not set yet, initialize to VISIBLE>>>
|
|
if (lRet == ERROR_SUCCESS)
|
|
m_fToolsVisible = locHeight;
|
|
else
|
|
m_fToolsVisible = TRUE;
|
|
|
|
strcpy (szValue, "Statusbar");
|
|
locSize = sizeof (locHeight);
|
|
lRet = RegQueryValueEx ( locKey, szValue, locReserved,
|
|
&locType, (unsigned char *)&locHeight, &locSize );
|
|
|
|
// Just got the flag for StatusBar
|
|
// If not set yet, initialize to VISIBLE>>>
|
|
if (lRet == ERROR_SUCCESS)
|
|
m_fStatusVisible = locHeight;
|
|
else
|
|
m_fStatusVisible = TRUE;
|
|
|
|
RegCloseKey (locKey);
|
|
}
|
|
else
|
|
{
|
|
// DO a little initialization since registry wasn't set
|
|
m_fStatusVisible=TRUE;
|
|
m_fToolsVisible=TRUE;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
|
|
|
| CFileViewer::SaveViewerSettings
|
|
|
|
|
*/
|
|
UINT CFileViewer::SaveViewerSettings(void)
|
|
{
|
|
char szKey[256];
|
|
char szValue[128];
|
|
HKEY locKey;
|
|
LONG lRet;
|
|
DWORD locType;
|
|
DWORD locSize;
|
|
DWORD locReserved;
|
|
LONG locHeight;
|
|
DWORD locDisp;
|
|
|
|
/*
|
|
| The registry entry looks like:
|
|
| HKEY_CURRENT_USER\Software\SCC\QuickViewer\1.0\...
|
|
| Let's use the version resource to handle some of the text?
|
|
*/
|
|
|
|
locReserved = 0;
|
|
strcpy ( szKey, "Software\\SCC\\QuickViewer\\1.00" );
|
|
lRet = RegOpenKeyEx ( HKEY_CURRENT_USER, szKey,
|
|
0, KEY_ALL_ACCESS, &locKey );
|
|
|
|
if (lRet != ERROR_SUCCESS)
|
|
{
|
|
lRet = RegCreateKeyEx ( HKEY_CURRENT_USER, szKey, locReserved,
|
|
"SCCStorage", REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS, NULL, &locKey, &locDisp );
|
|
}
|
|
|
|
if (lRet == ERROR_SUCCESS)
|
|
{
|
|
strcpy (szValue, "CurrentFontName");
|
|
strcpy (szKey, m_LogFont.lfFaceName);
|
|
locSize = strlen (szKey) + 1;
|
|
locType = REG_SZ;
|
|
locReserved = 0;
|
|
lRet = RegSetValueEx ( locKey, szValue, locReserved,
|
|
locType, (unsigned char *)szKey, locSize );
|
|
|
|
|
|
strcpy (szValue, "CurrentFontSize");
|
|
locSize = sizeof (locHeight);
|
|
locType = REG_DWORD;
|
|
locHeight = m_LogFont.lfHeight;
|
|
locReserved = 0;
|
|
lRet = RegSetValueEx ( locKey, szValue, locReserved,
|
|
locType, (unsigned char *)&locHeight, locSize );
|
|
|
|
strcpy (szValue, "CurrentFontCharSet");
|
|
locSize = sizeof (locHeight);
|
|
locType = REG_DWORD;
|
|
locHeight = m_LogFont.lfCharSet;
|
|
locReserved = 0;
|
|
lRet = RegSetValueEx ( locKey, szValue, locReserved,
|
|
locType, (unsigned char *)&locHeight, locSize );
|
|
|
|
strcpy (szValue, "UseOEMCharSet");
|
|
locSize = sizeof (locHeight);
|
|
locType = REG_DWORD;
|
|
locHeight = m_fUseOEMcharset;
|
|
locReserved = 0;
|
|
lRet = RegSetValueEx ( locKey, szValue, locReserved,
|
|
locType, (unsigned char *)&locHeight, locSize );
|
|
|
|
|
|
strcpy (szValue, "Orientation");
|
|
locSize = sizeof (locHeight);
|
|
locType = REG_DWORD;
|
|
locHeight = m_fOrientation;
|
|
locReserved = 0;
|
|
lRet = RegSetValueEx ( locKey, szValue, locReserved,
|
|
locType, (unsigned char *)&locHeight, locSize );
|
|
|
|
|
|
strcpy (szValue, "PageView");
|
|
locSize = sizeof (locHeight);
|
|
locType = REG_DWORD;
|
|
locHeight = m_fPageView;
|
|
locReserved = 0;
|
|
lRet = RegSetValueEx ( locKey, szValue, locReserved,
|
|
locType, (unsigned char *)&locHeight, locSize );
|
|
|
|
strcpy (szValue, "Toolbar");
|
|
locSize = sizeof (locHeight);
|
|
locType = REG_DWORD;
|
|
locHeight = m_fToolsVisible;
|
|
locReserved = 0;
|
|
lRet = RegSetValueEx ( locKey, szValue, locReserved,
|
|
locType, (unsigned char *)&locHeight, locSize );
|
|
|
|
strcpy (szValue, "Statusbar");
|
|
locSize = sizeof (locHeight);
|
|
locType = REG_DWORD;
|
|
locHeight = m_fStatusVisible;
|
|
locReserved = 0;
|
|
lRet = RegSetValueEx ( locKey, szValue, locReserved,
|
|
locType, (unsigned char *)&locHeight, locSize );
|
|
|
|
RegCloseKey (locKey);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void CFileViewer::OptionsChange( HMENU hMenu )
|
|
{
|
|
DWORD dwType;
|
|
UINT Action;
|
|
SCCVWDISPLAYINFO locDisplayInfo;
|
|
HMENU locMenu;
|
|
DWORD locCount = 0;
|
|
|
|
|
|
if (hMenu == NULL)
|
|
locMenu = GetMenu (m_hWnd);
|
|
else
|
|
locMenu = hMenu;
|
|
|
|
// Check whether this is a multisection image
|
|
if (IsWindow(m_hSCCViewWnd))
|
|
SendMessage (m_hSCCViewWnd, SCCVW_GETSECTIONCOUNT, 0, (LPARAM) &locCount);
|
|
m_fMultiSection = (locCount > 1) ? TRUE : FALSE;
|
|
|
|
/* Only IMAGE can be rotated */
|
|
|
|
MemSet ( (char *)&locDisplayInfo, 0, sizeof (LPSCCVWDISPLAYINFO) );
|
|
//locDisplayInfo.dwSize = sizeof (LPSCCVWDISPLAYINFO);
|
|
|
|
SendMessage (m_hSCCViewWnd, SCCVW_GETDISPLAYINFO,
|
|
0, (LPARAM) &locDisplayInfo );
|
|
|
|
dwType = locDisplayInfo.dwType;
|
|
|
|
if (m_fPageView==0)
|
|
{
|
|
EnableMenuItem (locMenu, IDM_VIEWROTATE,
|
|
MF_BYCOMMAND | ( (dwType == SCCVWTYPE_IMAGE) ?
|
|
MF_ENABLED : MF_GRAYED) );
|
|
}
|
|
else
|
|
EnableMenuItem (locMenu, IDM_VIEWROTATE, MF_BYCOMMAND | MF_GRAYED );
|
|
|
|
if ( (dwType == SCCVWTYPE_VECTOR) ||
|
|
(dwType == SCCVWTYPE_IMAGE ) )
|
|
Action = MF_GRAYED;
|
|
else
|
|
Action = MF_ENABLED;
|
|
|
|
EnableMenuItem (locMenu, IDM_VIEWFONT,
|
|
MF_BYCOMMAND | Action );
|
|
EnableMenuItem (locMenu, IDM_VIEWFONTINCREASE,
|
|
MF_BYCOMMAND | Action );
|
|
EnableMenuItem (locMenu, IDM_VIEWFONTDECREASE,
|
|
MF_BYCOMMAND | Action );
|
|
|
|
if ( (dwType == SCCVWTYPE_VECTOR) ||
|
|
(dwType == SCCVWTYPE_IMAGE ) )
|
|
Action = FALSE;
|
|
else
|
|
Action = TRUE;
|
|
|
|
SendMessage (m_hWndToolbar, TB_ENABLEBUTTON, (WPARAM)IDM_VIEWFONTINCREASE,
|
|
MAKELONG ( Action, 0 ) );
|
|
SendMessage (m_hWndToolbar, TB_ENABLEBUTTON, (WPARAM)IDM_VIEWFONTDECREASE,
|
|
MAKELONG ( Action, 0 ) );
|
|
|
|
EnableMenuItem (locMenu, IDM_VIEWLANDSCAPE,
|
|
MF_BYCOMMAND | (m_fPageView ? MF_ENABLED : MF_GRAYED) );
|
|
CheckMenuItem( locMenu, IDM_VIEWLANDSCAPE,
|
|
MF_BYCOMMAND | ((m_fOrientation & m_fPageView) ?
|
|
MF_CHECKED : MF_UNCHECKED));
|
|
|
|
CheckMenuItem( locMenu, IDM_VIEWSMALLVIEW,
|
|
MF_BYCOMMAND | (m_fPageView ? MF_CHECKED : MF_UNCHECKED));
|
|
|
|
CheckMenuItem(locMenu, IDM_VIEWTOOLBAR,
|
|
MF_BYCOMMAND | (m_fToolsVisible ? MF_CHECKED : MF_UNCHECKED));
|
|
CheckMenuItem(locMenu, IDM_VIEWSTATUSBAR,
|
|
MF_BYCOMMAND | (m_fStatusVisible ? MF_CHECKED : MF_UNCHECKED));
|
|
|
|
HWND hwndPinned;
|
|
|
|
if (m_lpfsi)
|
|
m_lpfsi->GetPinnedWindow(&hwndPinned);
|
|
else
|
|
hwndPinned = NULL;
|
|
|
|
CheckMenuItem(locMenu, IDM_VIEWREPLACE,
|
|
MF_BYCOMMAND | ((hwndPinned==m_hWnd)? MF_CHECKED : MF_UNCHECKED));
|
|
|
|
SendMessage (m_hWndToolbar, TB_CHECKBUTTON, (WPARAM)IDM_VIEWREPLACE,
|
|
MAKELONG ( ((hwndPinned==m_hWnd)? TRUE : FALSE), 0 ) );
|
|
|
|
return;
|
|
}
|
|
|
|
DWORD CFileViewer::MouseHandler (UINT iMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
|
|
switch (iMsg)
|
|
{
|
|
case WM_MOUSEMOVE:
|
|
/*
|
|
* If this message is already displayed, CStatusHelper
|
|
* will just ignore this call and return very fast.
|
|
*/
|
|
if (m_fMultiSection)
|
|
m_pSH->MessageDisplay(ID_MSGSHEETPAGING);
|
|
else
|
|
m_pSH->MessageDisplay(ID_MSGCHOOSEOPEN);
|
|
|
|
break;
|
|
|
|
|
|
case WM_RBUTTONDOWN:
|
|
{
|
|
HMENU hMenu, hMenuRes;
|
|
POINT pt;
|
|
UINT i, cItems;
|
|
|
|
//Load our context menu.
|
|
hMenuRes=LoadMenu(m_hInst,
|
|
MAKEINTRESOURCE(IDR_MENUVIEWPORT));
|
|
|
|
if (NULL==hMenuRes)
|
|
break;
|
|
|
|
/*
|
|
* Make a copy popup menu because you cannot
|
|
* use a resource-loaded menu with TrackPopupMenu.
|
|
*/
|
|
|
|
cItems=GetMenuItemCount(hMenuRes);
|
|
hMenu=CreatePopupMenu();
|
|
|
|
for (i=0; i < cItems; i++)
|
|
{
|
|
char szItem[80];
|
|
int id, uFlags;
|
|
// MENUITEMINFO locMenuItem;
|
|
|
|
GetMenuString(hMenuRes, i, szItem, sizeof(szItem),
|
|
MF_BYPOSITION);
|
|
id=GetMenuItemID(hMenuRes, i);
|
|
|
|
uFlags=(0==id) ? MF_SEPARATOR : MF_STRING | MF_ENABLED;
|
|
|
|
// Better not overflow!
|
|
// if (id==IDM_FILEOPENAS)
|
|
// strcat (szItem, m_pszAppName);
|
|
|
|
AppendMenu(hMenu, uFlags, id, szItem);
|
|
//locMenuItem.fState = MFS_ENABLED;
|
|
//locMenuItem.fType = (0==id | -1==id) ? MFT_SEPARATOR : MFT_STRING;
|
|
//locMenuItem.dwMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
|
|
//locMenuItem.wID = id;
|
|
//AppendMenuItem ( hmenu, (LPMENUITEMINFO)&locMenuItem );
|
|
}
|
|
|
|
DestroyMenu(hMenuRes);
|
|
|
|
pt.x=LOWORD(lParam);
|
|
pt.y=HIWORD(lParam);
|
|
ClientToScreen(m_hSCCViewWnd, &pt);
|
|
|
|
// Make sure only items that should be enabled are:
|
|
OptionsChange( hMenu );
|
|
|
|
//Messages sent to frame window from this menu.
|
|
TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON,
|
|
pt.x, pt.y, 0, m_hWnd, NULL);
|
|
|
|
DestroyMenu(hMenu);
|
|
}
|
|
break;
|
|
|
|
}
|
|
return 0L;
|
|
}
|
|
|
|
|
|
LPSTR inline CFileViewer::String(UINT uID)
|
|
{
|
|
return (*m_pST)[uID];
|
|
}
|
|
|
|
|
|
#ifdef INCLUDING_SHELL
|
|
UINT CFileViewer::GetAppName ( LPSTR lpFile, LPSTR lpApp, UINT ccMax )
|
|
{
|
|
/*
|
|
| Using the filename, attack the registry for the application
|
|
| name to be used for launching. CHECK
|
|
| Can't link with the SHELL LIBS so can't test this!
|
|
*/
|
|
|
|
HRESULT hr;
|
|
HKEY hKey;
|
|
CLSID clsID;
|
|
char szKey[128];
|
|
OLECHAR szw[512];
|
|
LPWSTR pszw;
|
|
BOOL fUseCLSID=FALSE;
|
|
BOOL fCLSIDReg=FALSE; //Assume CLSID not registered
|
|
LONG cb;
|
|
|
|
mbstowcs(szw, lpFile, sizeof(szw));
|
|
// hr=GetClassFile(szw, &clsID);
|
|
|
|
hr = ResultFromScode (E_UNEXPECTED);
|
|
|
|
// To get rid of OLE2 linking, we must replace this GetClassFile with
|
|
// an open, then check bytes, then load ole32, init ole,
|
|
// then call getclass file!
|
|
//
|
|
// Then deinit ole32 later....
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
/*
|
|
| File has CLSID, now try to find it in the registry.
|
|
| StringFromCLSID gives us a Unicode CLSID string with
|
|
| the {}'s already, as we need to look in the registry.
|
|
*/
|
|
if (FAILED(StringFromCLSID(clsID, &pszw)))
|
|
{
|
|
//If this happens, we're out of memory.
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
| pszw comes out Unicode. Using szw as a char array
|
|
| instead of a OLECHAR array is safe with the typecast.
|
|
*/
|
|
wcstombs((LPSTR)szw, pszw, sizeof(szw));
|
|
wsprintf(szKey, "CLSID\\%s", (LPSTR)szw);
|
|
MemFree(pszw);
|
|
|
|
/*
|
|
| Try to open the key. If it works, return hKey, otherwise
|
|
| continue to try with the extension.
|
|
*/
|
|
if (ERROR_SUCCESS==RegOpenKey(HKEY_CLASSES_ROOT, szKey, &hKey))
|
|
fCLSIDReg=TRUE;
|
|
}
|
|
|
|
if (fCLSIDReg)
|
|
{
|
|
//Get the file type string for use in error messages
|
|
cb=sizeof(lpApp);
|
|
RegQueryValue(hKey, NULL, lpApp, &cb);
|
|
|
|
/* Open the key indirection */
|
|
}
|
|
|
|
/*
|
|
| Now try to open \<EXT> for the file's extension.
|
|
| If we fail this, then there's nothing in the registry for
|
|
| this type of file.
|
|
*/
|
|
szKey[0] = '.';
|
|
psz=PathGetExtension(lpFile, &szKey[1], 3);
|
|
|
|
if (szKey[1]=='\0')
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if (ERROR_SUCCESS!=RegOpenKey(HKEY_CLASSES_ROOT, szKey, &hKey))
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
//Get the file type string for use in error messages
|
|
cb=sizeof(lpApp);
|
|
RegQueryValue(hKey, NULL, lpApp, &cb);
|
|
//#else
|
|
//
|
|
// strcpy ( lpApp, "a File" );
|
|
//
|
|
//#endif
|
|
|
|
return S_OK;
|
|
}
|
|
#else
|
|
#if 1
|
|
// Shell is not going to export this anymore!
|
|
LPSTR WINAPI PathGetExtension(LPCSTR lpszPath, LPSTR lpszExtension, int cchExt)
|
|
{
|
|
LPCSTR lpDot, lp;
|
|
|
|
for (lpDot = NULL, lp = lpszPath; *lp; lp = AnsiNext(lp)) {
|
|
switch (*lp) {
|
|
case '.':
|
|
lpDot = lp; // remember the last dot
|
|
break;
|
|
case '\\':
|
|
lpDot = NULL; // forget last dot, it was in a directory
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!lpDot)
|
|
{
|
|
if (lpszExtension)
|
|
*lpszExtension = '\0';
|
|
return (LPSTR)lp; // NULL extension (cast->non const)
|
|
}
|
|
else
|
|
{
|
|
if (lpszExtension)
|
|
{
|
|
// Caller asked for proper extension to be returned.
|
|
int ichExt = cchExt;
|
|
lp = lpDot+1;
|
|
|
|
while (*lp)
|
|
{
|
|
if (!IsDBCSLeadByte(*lp))
|
|
{
|
|
if (*lp != ' ')
|
|
{
|
|
{
|
|
*lpszExtension++ = *lp;
|
|
ichExt--;
|
|
if (ichExt == 0)
|
|
break;
|
|
}
|
|
}
|
|
lp++;
|
|
}
|
|
else
|
|
{
|
|
if (ichExt <= 1)
|
|
break; // Dont want to end on a dbcs lead byte
|
|
|
|
*lpszExtension++ = *lp++;
|
|
*lpszExtension++ = *lp++;
|
|
ichExt -= 2;
|
|
if (ichExt == 0)
|
|
break;
|
|
}
|
|
}
|
|
|
|
*lpszExtension = '\0';
|
|
}
|
|
|
|
return (LPSTR)lpDot + 1; // here is the extension (cast->non const)
|
|
}
|
|
}
|
|
|
|
#endif
|
|
UINT CFileViewer::GetAppName ( LPSTR lpFile, LPSTR lpApp, UINT ccMax )
|
|
{
|
|
/*
|
|
| Using the filename, attack the registry for the application
|
|
| name to be used for launching. CHECK
|
|
| Can't link with the SHELL LIBS so laod dynamic
|
|
*/
|
|
// char locPath[MAX_PATH];
|
|
// char *pLocPath;
|
|
HKEY hKey;
|
|
char szKey[128];
|
|
LONG cb;
|
|
LONG locRet;
|
|
|
|
// Parse the file name, add the separator and application name
|
|
// Strip Path
|
|
szKey[0]='.';
|
|
PathGetExtension(m_pszPath, &szKey[1], 3);
|
|
/*
|
|
| Now try to open \<EXT> for the file's extension.
|
|
| If we fail this, then there's nothing in the registry for
|
|
| this type of file.
|
|
*/
|
|
|
|
if (ERROR_SUCCESS!=RegOpenKey(HKEY_CLASSES_ROOT, szKey, &hKey))
|
|
{
|
|
strcpy ( lpApp, String(IDS_DEFAULTFILE) );
|
|
return (UINT)-1;
|
|
}
|
|
|
|
//Get the file type string for use in error messages
|
|
cb=sizeof(lpApp);
|
|
locRet = RegQueryValue(hKey, NULL, lpApp, &cb);
|
|
if (locRet != ERROR_SUCCESS)
|
|
{
|
|
strcpy ( lpApp, String(IDS_DEFAULTFILE) );
|
|
}
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
|
|
|
| CFileViewer::DropFiles
|
|
|
|
|
*/
|
|
|
|
BOOL CFileViewer::DropFiles (HDROP hdrop)
|
|
{
|
|
// We should now proces the files that were dropped on us
|
|
char szPath[MAX_PATH];
|
|
int cb;
|
|
WINDOWPLACEMENT wndplace;
|
|
|
|
// For now only process the first file.
|
|
if (DragQueryFile(hdrop, 0, szPath, sizeof(szPath)) > 0)
|
|
{
|
|
ODSsz("CFileViewer::DropFiles filename=%s", szPath);
|
|
|
|
// Need to convert the string to ole string...
|
|
cb = (lstrlen(szPath)+1) * sizeof(OLECHAR);
|
|
mbstowcs(m_pvsi->strNewFile, szPath, cb);
|
|
|
|
// KJE used GetWInRect - BAD move : replace with GetWindowPlacement
|
|
// Now get the window rectangle to use to display this in...
|
|
// GetWindowRect(m_hWnd, &m_pvsi->rect);
|
|
// SDN 8/25/94
|
|
wndplace.length = sizeof (WINDOWPLACEMENT);
|
|
GetWindowPlacement (m_hWnd, &wndplace );
|
|
|
|
if ( (IsIconic(m_hWnd) || IsZoomed(m_hWnd) )
|
|
&& (wndplace.showCmd != SW_HIDE) )
|
|
{
|
|
POINT locpt;
|
|
// Convert from Screen to Desktop Coordinates
|
|
locpt.x=wndplace.rcNormalPosition.left;
|
|
locpt.y=wndplace.rcNormalPosition.top;
|
|
ScreenToClient ( GetDesktopWindow(), &locpt );
|
|
m_pvsi->rect.left=locpt.x;
|
|
m_pvsi->rect.top=locpt.y;
|
|
locpt.x=wndplace.rcNormalPosition.right;
|
|
locpt.y=wndplace.rcNormalPosition.bottom;
|
|
ScreenToClient ( GetDesktopWindow(), &locpt );
|
|
m_pvsi->rect.right=locpt.x;
|
|
m_pvsi->rect.bottom=locpt.y;
|
|
m_pvsi->dwFlags |= (FVSIF_RECT | FVSIF_NEWFILE);
|
|
}
|
|
else
|
|
{
|
|
GetWindowRect(m_hWnd, &m_pvsi->rect);
|
|
m_pvsi->dwFlags |= (FVSIF_RECT | FVSIF_NEWFILE);
|
|
}
|
|
|
|
if(IsZoomed (m_hWnd) )
|
|
m_pvsi->dwFlags |= FVSIF_ZOOMED; // sdn 18312 3/95
|
|
else
|
|
m_pvsi->dwFlags &= ~FVSIF_ZOOMED; // sdn 18312 3/95
|
|
|
|
// Should check for failure but not sure what to do with it anyway
|
|
QueryInterface(IID_IUnknown, (LPVOID *)&m_pvsi->punkRel);
|
|
ODSlu("CFileViewer::DropFiles Query Interface(%x)", m_pvsi->punkRel);
|
|
}
|
|
|
|
DragFinish(hdrop);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
|
|
|
| CFileViewer::DisplayOrientation
|
|
|
|
|
*/
|
|
|
|
void CFileViewer::DisplayOrientation (void)
|
|
{
|
|
SCCPGPAGESIZE locPageSize;
|
|
|
|
// Defaulting until we find out about locale's
|
|
locPageSize.dwHeightInTwips = (m_fOrientation ? 0x2FD0 : 0x3DE0 );
|
|
locPageSize.dwWidthInTwips = (m_fOrientation ? 0x3DE0 : 0x2FD0 );
|
|
|
|
SendMessage (m_hSCCPageWnd, SCCPG_SETPAGESIZE, 0,
|
|
(LPARAM)(LPVOID)&locPageSize);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
|
|
|
| CFileViewer::OnAppAbout
|
|
|
|
|
*/
|
|
|
|
void CFileViewer::OnAppAbout (void)
|
|
{
|
|
HINSTANCE hShellInst;
|
|
LPFNSHELLABOUTA lpfnShellAboutA;
|
|
HICON hViewIcon;
|
|
|
|
hShellInst = LoadLibrary ("SHELL32");
|
|
|
|
if (hShellInst >= (HINSTANCE) 32)
|
|
{
|
|
lpfnShellAboutA = (LPFNSHELLABOUTA) GetProcAddress (
|
|
(HMODULE) hShellInst,
|
|
"ShellAboutA" );
|
|
|
|
if (lpfnShellAboutA != NULL)
|
|
{
|
|
// SDN VISIT THIS
|
|
hViewIcon = LoadIcon ( m_hInst, "Icon" );
|
|
(*lpfnShellAboutA) (m_hWnd, String(IDS_APPNAME),
|
|
String(IDS_ABOUTSTRING), hViewIcon);
|
|
|
|
if (hViewIcon != NULL)
|
|
DestroyIcon (hViewIcon);
|
|
}
|
|
FreeLibrary ( hShellInst );
|
|
}
|
|
else
|
|
DialogBox(m_hInst, MAKEINTRESOURCE(IDD_ABOUT), m_hWnd,
|
|
(DLGPROC) AboutProc);
|
|
}
|
|
|
|
/*
|
|
|
|
|
| CFileViewer::GetSCCCharSet ()
|
|
|
|
|
*/
|
|
|
|
|
|
typedef struct sccsetmap
|
|
{
|
|
WORD wOSSet;
|
|
BYTE cvwSet;
|
|
} SCCSETMAP;
|
|
|
|
#define SCC_NUM_SETMAPS 16
|
|
static SCCSETMAP locSetMap[SCC_NUM_SETMAPS]=
|
|
{
|
|
{SHIFTJIS_CHARSET, SCCVW_CHARSET_SHIFTJIS },
|
|
{HANGEUL_CHARSET, SCCVW_CHARSET_HANGEUL },
|
|
{CHINESEBIG5_CHARSET, SCCVW_CHARSET_CHINESEBIG5},
|
|
{ANSI_CHARSET, SCCVW_CHARSET_ANSI },
|
|
{OEM_CHARSET, SCCVW_CHARSET_OEM },
|
|
{MAC_CHARSET, SCCVW_CHARSET_MAC },
|
|
{SYMBOL_CHARSET, SCCVW_CHARSET_SYMBOL },
|
|
{GB2312_CHARSET, SCCVW_CHARSET_GB2312 },
|
|
{HEBREW_CHARSET, SCCVW_CHARSET_HEBREW },
|
|
{ARABIC_CHARSET, SCCVW_CHARSET_ARABIC },
|
|
{GREEK_CHARSET, SCCVW_CHARSET_GREEK },
|
|
{TURKISH_CHARSET, SCCVW_CHARSET_TURKISH },
|
|
{THAI_CHARSET, SCCVW_CHARSET_THAI },
|
|
{EASTEUROPE_CHARSET, SCCVW_CHARSET_EASTEUROPE },
|
|
{RUSSIAN_CHARSET, SCCVW_CHARSET_RUSSIAN },
|
|
{BALTIC_CHARSET, SCCVW_CHARSET_BALTIC },
|
|
};
|
|
|
|
WORD CFileViewer::GetSCCCharSet (WORD wOSSet)
|
|
{
|
|
WORD wRet=0;
|
|
INT i;
|
|
|
|
for (i=0; i<SCC_NUM_SETMAPS; i++)
|
|
{
|
|
if (locSetMap[i].wOSSet == wOSSet)
|
|
{
|
|
wRet = (WORD)locSetMap[i].cvwSet;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (i==SCC_NUM_SETMAPS)
|
|
wRet = 0;
|
|
|
|
return wRet;
|
|
}
|
|
|