|
|
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000, Microsoft Corp. All rights reserved.
//
// FILE
//
// sdonode.cpp
//
// SYNOPSIS
//
// Defines the classes SdoResultItem and SdoScopeItem.
//
// MODIFICATION HISTORY
//
// 02/10/2000 Original version.
// 04/25/2000 Don't add result item unless pane is active.
//
///////////////////////////////////////////////////////////////////////////////
#include <proxypch.h>
#include <sdonode.h>
#include <proxynode.h>
SdoResultItem::SdoResultItem( SdoScopeItem& owner, ISdo* sdo ) : parent(owner), self(sdo) { self.getName(name); }
HRESULT SdoResultItem::queryPagesFor() throw () { return S_OK; }
HRESULT SdoResultItem::onDelete( SnapInView& view ) { // Can't delete it with the properties open.
if (view.isPropertySheetOpen(*this)) { int retval; view.formatMessageBox( mapResourceId(ERROR_CAPTION), IDS_PROXY_E_CLOSE_SHEET, TRUE, MB_OK | MB_ICONWARNING, &retval ); return S_FALSE; }
// Confirm the delete operation.
int retval;
bool isLast = (parent.getNumItems() == 1);
if (parent.getCxn().isLocal()) { view.formatMessageBox( mapResourceId(DELETE_TITLE), isLast?mapResourceId(DELETE_LAST_LOCAL) :mapResourceId(DELETE_LOCAL), FALSE, MB_YESNO | MB_ICONQUESTION, &retval, name ); } else { view.formatMessageBox( mapResourceId(DELETE_TITLE), isLast?mapResourceId(DELETE_LAST_REMOTE) :mapResourceId(DELETE_REMOTE), FALSE, MB_YESNO | MB_ICONQUESTION, &retval, name, parent.getCxn().getMachineName() ); }
if (retval != IDYES) { return S_FALSE; }
// It passed the tests, so ask our parent to delete us.
parent.deleteResultItem(view, *this); // Tell the service to reload
parent.getCxn().resetService();
return S_OK; }
HRESULT SdoResultItem::onPropertyChange( SnapInView& view, BOOL scopeItem ) { // Reload our name.
self.getName(name); // Update the result pane.
view.updateResultItem(*this); // Tell the service to reload
parent.getCxn().resetService(); return S_OK; }
HRESULT SdoResultItem::onRename( SnapInView& view, LPCOLESTR newName ) { // Can't rename with the properties open.
if (view.isPropertySheetOpen(*this)) { int retval; view.formatMessageBox( mapResourceId(ERROR_CAPTION), IDS_PROXY_E_CLOSE_SHEET, TRUE, MB_OK | MB_ICONWARNING, &retval ); return S_FALSE; }
// Turn newName into a BSTR ...
CComBSTR bstrNewName(newName); if (!bstrNewName) { AfxThrowOleException(E_OUTOFMEMORY); } // ... and trim off the fat.
SdoTrimBSTR(bstrNewName);
// Names can't be empty.
if (bstrNewName.Length() == 0) { int retval; view.formatMessageBox( mapResourceId(ERROR_CAPTION), mapResourceId(ERROR_NAME_EMPTY), TRUE, MB_OK | MB_ICONWARNING, &retval ); return S_FALSE; }
// This will fail if the name isn't unique.
if (!self.setName(bstrNewName)) { int retval; view.formatMessageBox( mapResourceId(ERROR_CAPTION), mapResourceId(ERROR_NOT_UNIQUE), FALSE, MB_OK | MB_ICONWARNING, &retval, (BSTR)name ); return S_FALSE; }
// Write the result to the datastore.
self.apply(); // Update our cached value.
name.Attach(bstrNewName.Detach()); // Tell the service to reload
parent.getCxn().resetService();
return S_OK; }
HRESULT SdoResultItem::onSelect( SnapInView& view, BOOL scopeItem, BOOL selected ) { if (!selected) { return S_FALSE; }
// Get IConsoleVerb ...
CComPtr<IConsoleVerb> consoleVerb; CheckError(view.getConsole()->QueryConsoleVerb(&consoleVerb));
// ... and turn on our verbs. Don't care if this fails.
consoleVerb->SetVerbState(MMC_VERB_DELETE, ENABLED, TRUE); consoleVerb->SetVerbState(MMC_VERB_PROPERTIES, ENABLED, TRUE); consoleVerb->SetVerbState(MMC_VERB_RENAME, ENABLED, TRUE); consoleVerb->SetDefaultVerb(MMC_VERB_PROPERTIES);
return S_OK; }
HRESULT SdoResultItem::onViewChange( SnapInView& view, LPARAM data, LPARAM hint ) { // Currently, this is only called when a new object is added.
RESULTDATAITEM rdi; memset(&rdi, 0, sizeof(rdi)); rdi.mask = RDI_STR | RDI_IMAGE | RDI_PARAM; rdi.str = MMC_CALLBACK; rdi.nImage = getImageIndex(); rdi.lParam = (LPARAM)this;
CheckError(view.getResultData()->InsertItem(&rdi));
return S_OK; }
SdoScopeItem::SdoScopeItem( SdoConnection& connection, int nameId, int errorTitleId, int topMenuItemId, int newMenuItemId, int menuItemStatusBarId ) throw () : SnapInPreNamedItem(nameId), cxn(connection), loaded(false), errorTitle(errorTitleId), topMenuItem(topMenuItemId), newMenuItem(newMenuItemId), menuItemStatusBar(menuItemStatusBarId), scopeId(0)
{ cxn.advise(*this); }
SdoScopeItem::~SdoScopeItem() throw () { cxn.unadvise(*this); }
void SdoScopeItem::addResultItem(SnapInView& view, SdoResultItem& item) { items.push_back(&item);
if (active) { // We can't add it directly, since this may be called from a scope item.
view.updateAllViews(item); } }
void SdoScopeItem::deleteResultItem(SnapInView& view, SdoResultItem& item) { // Remove from the SDO collection,
getSelf().remove(item.getSelf()); // the result pane, and
view.deleteResultItem(item); // our cached copy.
items.erase(&item); }
HRESULT SdoScopeItem::addMenuItems( SnapInView& view, LPCONTEXTMENUCALLBACK callback, long insertionAllowed ) { CONTEXTMENUITEM cmi; memset(&cmi, 0, sizeof(cmi));
if (insertionAllowed & CCM_INSERTIONALLOWED_NEW) { cmi.strName = newMenuItem; cmi.strStatusBarText = menuItemStatusBar; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_NEW; callback->AddItem(&cmi); }
if (insertionAllowed & CCM_INSERTIONALLOWED_TOP) { cmi.strName = topMenuItem; cmi.strStatusBarText = menuItemStatusBar; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP; callback->AddItem(&cmi); }
return S_OK; }
HRESULT SdoScopeItem::onRefresh( SnapInView& view ) { // Refresh the connection.
cxn.refresh(view); return S_OK; }
HRESULT SdoScopeItem::onSelect( SnapInView& view, BOOL scopeItem, BOOL selected ) { if (!selected) { return S_FALSE; }
// Get IConsoleVerb ...
CComPtr<IConsoleVerb> consoleVerb; CheckError(view.getConsole()->QueryConsoleVerb(&consoleVerb)); // ... and turn on refresh.
consoleVerb->SetVerbState(MMC_VERB_REFRESH, ENABLED, TRUE); return S_OK; }
HRESULT SdoScopeItem::onShow( SnapInView& view, HSCOPEITEM itemId, BOOL selected ) { if (selected) { // Set the icon strip.
view.setImageStrip(IDB_PROXY_SMALL_ICONS, IDB_PROXY_LARGE_ICONS, FALSE);
// Let the derived class update the column headers.
insertColumns(view.getHeaderCtrl());
// Populate the result pane.
insertResultItems(view);
// Our node is active.
active = true; } else { active = false; }
return S_OK; }
HRESULT SdoScopeItem::onViewChange( SnapInView& view, LPARAM data, LPARAM hint ) { loaded = false;
if (active) { CheckError(view.getConsole()->SelectScopeItem(getScopeId())); }
return S_OK; }
bool SdoScopeItem::queryRefresh(SnapInView& view) { // Make sure no properties are open.
for (ResultIterator i = items.begin(); i != items.end(); ++i) { if (view.isPropertySheetOpen(**i)) { int retval; view.formatMessageBox( errorTitle, IDS_PROXY_E_CLOSE_ALL_SHEETS, TRUE, MB_OK | MB_ICONWARNING, &retval ); return false; } } return true; }
void SdoScopeItem::refreshComplete(SnapInView& view) { view.updateAllViews(*this); }
void SdoScopeItem::insertResultItems(SnapInView& view) { // Delete any existing items.
view.getResultData()->DeleteAllRsltItems();
// Have we loaded everything from the SDO's yet?
if (!loaded) { // Get ourself.
SdoCollection self = getSelf();
// Get the source iterator ...
SdoEnum src(self.getNewEnum());
// ... and the destination vector.
ObjectVector<SdoResultItem> dst; dst.reserve(self.count());
// Ask the derived class to get the result items.
getResultItems(src, dst);
// Swap them in.
items.swap(dst); loaded = true; }
RESULTDATAITEM rdi; memset(&rdi, 0, sizeof(rdi)); rdi.mask = RDI_STR | RDI_IMAGE | RDI_PARAM; rdi.str = MMC_CALLBACK;
for (ResultIterator i = items.begin(); i != items.end(); ++i) { rdi.nImage = (*i)->getImageIndex(); rdi.lParam = (LPARAM)*i; CheckError(view.getResultData()->InsertItem(&rdi)); } }
|