Componentes.Terceros.DevExp.../internal/x.36/1/ExpressPrinting System/Demos/CBuilder/WindowsShellExtension/dxPSContextMenuImpl.cpp
2008-09-04 11:31:51 +00:00

415 lines
12 KiB
C++

// DXPSCONTEXTMENUIMPL : Implementation of TdxPSContextMenuImpl (CoClass: dxPSContextMenu, Interface: IdxPSContextMenu)
#include <vcl.h>
#pragma hdrstop
#include "DXPSCONTEXTMENUIMPL.H"
#include "dxPSTVLnk.hpp"
/* Helpers */
bool IsComCtrlHandle(HWND AWnd, const String ANativeClassName)
{
char Buffer[255];
GetClassName(AWnd, Buffer, 255);
return ((String)Buffer).Pos(ANativeClassName) == 1;
}
//TdxCustomCommand
void TdxCustomCommand::MenuItemInfo(TMenuItemInfo &AInfo, UINT AnIDOffset)
{
// TMenuItemInfo *AInfo = new TMenuItemInfo;
AInfo.cbSize = sizeof(AInfo) - sizeof(HBITMAP);
AInfo.fMask = MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_TYPE;
AInfo.fType = MFT_STRING;
AInfo.fState = MFS_ENABLED;
AInfo.wID = AnIDOffset + ID;
AInfo.dwTypeData = (Caption + (char)0 + (char)0).c_str();
AInfo.cch = strlen(AInfo.dwTypeData) + 1;
}
void TdxCommandSeparotor::MenuItemInfo(TMenuItemInfo &AInfo, UINT AnIDOffset)
{
TdxCustomCommand::MenuItemInfo(AInfo, AnIDOffset);
AInfo.fType = (AInfo.fType | MFT_SEPARATOR) & ~(MFT_OWNERDRAW | MFT_STRING);
}
/////////////////////////////////////////////////////////////////////////////
// TdxPSContextMenuImpl
TdxPSContextMenuImpl::TdxPSContextMenuImpl()
{
/*dxPSGlbl.*/IsComCtrlVersion600 = /*dxPSGlbl.*/IsWinXP;
/*dxPSCore.*/dxPSRegisterPreviewWindow(__classid(TdxfmExplorerPreviewWindow));
dxPSEngine()->LookAndFeel = pslfFlat;
FComponentPrinter = new TdxComponentPrinter(NULL);
InitializeComponentPrinter();
FExplorer = new TdxPSFileBasedExplorer(NULL);
FExplorer->RootPath = "C:\\";
FCommands = new TList();
CreateCommands();
}
TdxPSContextMenuImpl::~TdxPSContextMenuImpl()
{
ReleaseCommands();
delete FCommands;
delete FExplorer;
delete FComponentPrinter;
/*dxPSCore.*/dxPSUnregisterPreviewWindow(__classid(TdxfmExplorerPreviewWindow));
}
TdxCustomCommand* TdxPSContextMenuImpl::GetCommand(int Index)
{
return (TdxCustomCommand*)FCommands->Items[Index];
}
void TdxPSContextMenuImpl::CreateCommands()
{
FCommands->Add(new TdxPrintCommand((UINT)FCommands->Count));
FCommands->Add(new TdxPreviewCommand((UINT)FCommands->Count));
FCommands->Add(new TdxPageSetupCommand((UINT)FCommands->Count));
FCommands->Add(new TdxCommandSeparotor((UINT)FCommands->Count));
}
TBasedxReportLink* TdxPSContextMenuImpl::CreateReportLink(HWND AWnd)
{
TBasedxReportLink* AReportLink;
IdxPSNativeWin32ControlHandleSupport *NativeHandleSupport;
if (IsComCtrlHandle(AWnd, WC_TREEVIEW)){
(TdxNativeTreeViewReportLink*)AReportLink =
new TdxNativeTreeViewReportLink(NULL);
InitilaizeReportLinkAsTreeView(AReportLink, AWnd);
}
else{
(TdxExplorerListViewReportLink*)AReportLink =
new TdxExplorerListViewReportLink(NULL);
InitilaizeReportLinkAsListView(AReportLink, AWnd);
}
AReportLink->ComponentPrinter = ComponentPrinter;
if (AReportLink->GetInterface(IID_IdxPSNativeWin32ControlHandleSupport, &NativeHandleSupport))
NativeHandleSupport->NativeHandle = (int)AWnd;
else{
delete AReportLink;
AReportLink = NULL;
}
return AReportLink;
}
TdxCustomCommand* TdxPSContextMenuImpl::FindCommandByID(UINT AID)
{
TdxCustomCommand *Result;
for (int I = 0; I < CommandCount; I++){
Result = Commands[I];
if (Result->ID == AID)
return Result;
}
return NULL;
}
void B(int WH)
{
HWND H;
H = (void*)67890;
*(int*)WH = (int)H;
}
int A()
{
HWND H;
H = (void*)12345;
B((int)&H);
return (int)H;
}
BOOL __stdcall EnumFunc(HWND AWnd, LPARAM lParam)
{
bool Found =
(GetFocus() == AWnd);
if (Found)
*(int*)lParam = (int)AWnd;
return !Found;
}
HWND TdxPSContextMenuImpl::GetFocusedControlHandle()
{
HWND Result = GetForegroundWindow();
if (Result != 0)
EnumChildWindows(Result, (WNDENUMPROC)EnumFunc, (Integer)&Result);
return Result;
}
void TdxPSContextMenuImpl::InitializeComponentPrinter()
{
}
void TdxPSContextMenuImpl::InitilaizeReportLinkAsListView(
TBasedxReportLink *AReportLink, HWND AWnd)
{
TdxExplorerListViewReportLink *ALink = (TdxExplorerListViewReportLink*)AReportLink;
ALink->Effects3D = true;
ALink->EndEllipsis = true;
ALink->Font->Name = "Tahoma";
ALink->GridLineColor = clBtnFace;
ALink->HeaderFont->Name = "Tahoma";
ALink->HeaderFont->Style = TFontStyles();
ALink->HeadersOnEveryPage = true;
ALink->IncludeHeaders = true;
ALink->OnlySelected = ListView_GetSelectedCount(AWnd) > 1;
ALink->Options = TdxListViewPaintOptions();
}
void TdxPSContextMenuImpl::InitilaizeReportLinkAsTreeView(
TBasedxReportLink *AReportLink, HWND AWnd)
{
TdxNativeTreeViewReportLink *ALink = (TdxNativeTreeViewReportLink*)AReportLink;
ALink->Font->Name = "Tahoma";
ALink->GridLineColor = clBtnFace;
if (IsComCtrlVersion600)
{
ALink->Options = ALink->Options>>tvpoTreeLines;
ALink->Options = ALink->Options<<tvpoButtons;
}
}
void TdxPSContextMenuImpl::ReleaseCommands()
{
while (FCommands->Count != 0){
delete (TdxCustomCommand*)FCommands->Items[0];
FCommands->Delete(0);
}
}
STDMETHODIMP TdxPSContextMenuImpl::Initialize(LPCITEMIDLIST pidlFolder,
LPDATAOBJECT lpdobj, HKEY hkeyProgID)
{
return NOERROR;
// HDROP hDrop;
//HRESULT hResult;
// FORMATETC fmtEtc;
// STGMEDIUM medium;
/*
fmtEtc.cfFormat = CF_HDROP;
fmtEtc.ptd = NULL;
fmtEtc.dwAspect = DVASPECT_CONTENT;
fmtEtc.lindex = -1;
fmtEtc.tymed = TYMED_HGLOBAL;
medium.tymed = TYMED_HGLOBAL;
// Get the CF_HDROP data
if((hResult = lpdobj->GetData(&fmtEtc,&medium)) < 0)
return E_INVALIDARG;
if((hDrop = (HDROP)GlobalLock(medium.hGlobal))==NULL)
return E_INVALIDARG;
// Get the name of the file
if(DragQueryFile(hDrop,0,FileName,MAX_PATH) == 0)
hResult = E_INVALIDARG;
else
hResult = S_OK;
// Clean up
GlobalUnlock(medium.hGlobal);
ReleaseStgMedium(&medium);
return hResult; */
};
STDMETHODIMP TdxPSContextMenuImpl::GetCommandString(UINT idCmd, UINT uFlags, UINT *pwReserved,
LPSTR pszName, UINT cchMax )
{
TdxCustomCommand *Command = FindCommandByID(idCmd);
if (Command != NULL){
if (uFlags == GCS_HELPTEXT)
StrPCopy(pszName, Command->Hint);
return NOERROR;
}
else
return E_INVALIDARG;
/* HRESULT hResult;
USES_CONVERSION;
// Check idCmd, it must be 0 or 1 for the first and second menu items we added
if (idCmd > 1)
return E_INVALIDARG;
// Why switch when I check only one case, there are others like GCS_VERB
// that uFlags can represent, easier to add other cases later
switch(uFlags)
{
case GCS_HELPTEXT:
{
/*
If you are in the Windows Explorer and you right-click a file which this
object is working on, you will see the help message in the Explorer status
bar on the bottom left.
*/
/* LPCTSTR HelpMessage;
// Since you have two menu items we need two help messages
if(idCmd == 0)
HelpMessage = _T("I am a helpfull message.");
if(idCmd == 1)
HelpMessage = _T("Thanks for the help.");
// We can handle either ASCII and Unicode text.
if (uFlags & GCS_UNICODE )
// Cast to LPWSTR and handle Unicode text
lstrcpynW((LPWSTR)pszName,T2CW(HelpMessage),cchMax);
else
// Handle ANSI text
lstrcpynA(pszName,T2CA(HelpMessage),cchMax);
hResult = S_OK;
}
break;
}
return hResult;*/
};
STDMETHODIMP TdxPSContextMenuImpl::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idFirstCmd,
UINT idLastCmd, UINT uFlags)
{
if (((uFlags & 0x0000000F) == CMF_NORMAL) || ((uFlags & CMF_EXPLORE) != 0)){
for (int I = 0; I < FCommands->Count; I++)
{
TMenuItemInfo AInfo;
((TdxCustomCommand*)FCommands->Items[I])->MenuItemInfo(AInfo, idFirstCmd);
InsertMenuItem(hmenu, indexMenu, true, &AInfo);
}
}
return MAKE_HRESULT(SEVERITY_SUCCESS,FACILITY_NULL, CommandCount);
/* UINT cmd = idFirstCmd;
// Make sure we do nothing if default is in uFlags.
if (uFlags & CMF_DEFAULTONLY)
return MAKE_HRESULT(SEVERITY_SUCCESS,FACILITY_NULL,0);
InsertMenu (hmenu,indexMenu,MF_BYPOSITION,cmd++,"Add File to Source Control");
indexMenu++;
InsertMenu (hmenu,indexMenu,MF_BYPOSITION,cmd++,"Open in Source Control");
*/
};
STDMETHODIMP TdxPSContextMenuImpl::InvokeCommand(LPCMINVOKECOMMANDINFO pCmdInfo)
{
TdxCustomCommand *Command = FindCommandByID(LOWORD(pCmdInfo->lpVerb));
if (Command != NULL){
HWND Wnd = GetFocusedControlHandle();
if (Wnd != 0){
TBasedxReportLink *AReportLink = CreateReportLink(Wnd);
if (AReportLink != NULL)
__try{
__try{
Command->Execute(AReportLink);
}
catch(...){
return E_FAIL;
}
}
__finally{
delete AReportLink;
}
}
}
return NOERROR;
/* HRESULT hResult;
WORD cmdId;
// We want to identify items using IDs and not Verbs.
// So if lpVerb is pointing at a string, lets use the ID.
if(HIWORD(pCmdInfo->lpVerb)==0)
cmdId = LOWORD(pCmdInfo->lpVerb);
if(cmdId > 1)
return E_INVALIDARG;
switch(cmdId)
{
case 0:
case 1:
{
// Find out which item was clicked and call the correct method
// AnsiString Operation = cmdId ? "Open in Source Control" : "Add File to Source Control";
/* if(Operation == "Add File to Source Control")
AddFileToSourceControl(pCmdInfo);
else
OpenFileInSourceControl();*/
/* hResult = S_OK;
}
break;
default:
hResult = E_INVALIDARG;
break;
}
return hResult;*/
}
int TdxPSContextMenuImpl::GetCommandCount()
{
return FCommands->Count;
}
/* TdxfmExplorerPreviewWindow */
void __fastcall TdxfmExplorerPreviewWindow::CreateParams(
Controls::TCreateParams &Params)
{
TdxfmStdPreview::CreateParams(Params);
Params.Style = Params.Style & ~WS_MINIMIZEBOX;
}
/* TdxExplorerListViewReportLink */
void __fastcall TdxExplorerListViewReportLink::Assign(Classes::TPersistent* Source)
{
if (dynamic_cast<TdxExplorerListViewReportLink*>(Source) != 0)
SortedColumnColor = ((TdxExplorerListViewReportLink*)Source)->SortedColumnColor;
TdxNativeListViewReportLink::Assign(Source);
}
Graphics::TColor __fastcall TdxExplorerListViewReportLink::GetCellColor(int ACol, int ARow)
{
if (IsSortedCell(ACol, ARow) && IsComCtrlVersion600)
return SortedColumnColor;
else
return TdxNativeListViewReportLink::GetCellColor(ACol, ARow);
}
bool __fastcall TdxExplorerListViewReportLink::GetCellTransparent(int ACol, int ARow)
{
if (!IsSortedCell(ACol, ARow) || !IsComCtrlVersion600)
return TdxNativeListViewReportLink::GetCellTransparent(ACol, ARow);
else
return false;
}
void __fastcall TdxExplorerListViewReportLink::InternalRestoreDefaults(void)
{
TdxNativeListViewReportLink::InternalRestoreDefaults();
SortedColumnColor = DefaultSortedColumnColor;
}
bool TdxExplorerListViewReportLink::IsSortedCell(int ACol, int ARow)
{
return IsReportStyle() && !IsHeaderRow(ARow) && (GetColSortOrder(ACol) != csoNone);
}
void __fastcall TdxExplorerListViewReportLink::SetSortedColumnColor(TColor Value)
{
if (FSortedColumnColor != Value)
{
FSortedColumnColor = Value;
LinkModified(true);
}
}