|
|
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000, Microsoft Corp. All rights reserved.
//
// FILE
//
// proxypolicies.cpp
//
// SYNOPSIS
//
// Defines the classes ProxyPolicy and ProxyPolicies.
//
// MODIFICATION HISTORY
//
// 02/10/2000 Original version.
// 04/19/2000 SdoScopeItem::getSelf returns by value, not reference.
//
///////////////////////////////////////////////////////////////////////////////
#include <proxypch.h>
#include <proxypolicies.h>
#include <policypage.h>
#include <policywiz.h>
#include <proxynode.h>
ProxyPolicy::ProxyPolicy( SdoScopeItem& owner, ISdo* sdo ) : SdoResultItem(owner, sdo) { // Cache an integer ...
self.getValue(PROPERTY_POLICY_MERIT, merit); // ... and string version of our merit.
_ltow(merit, szMerit, 10); }
Sdo& ProxyPolicy::getProfile() { if (!profile) { profile = getParent().getCxn().getProxyProfiles().find(name); }
return profile; }
ULONG ProxyPolicy::getToolbarFlags(const SnapInView& view) throw () { // Is the order reversed ?
BOOL reversed = (view.getSortColumn() == 1) && (view.getSortOption() & RSI_DESCENDING); ULONG flags = reversed ? ORDER_REVERSED : 0;
// Are we the highest priority policy?
if (merit != 1) { flags |= reversed ? MOVE_DN_ALLOWED : MOVE_UP_ALLOWED; }
// Are we the lowest priority policy?
if (merit != parent.getNumItems()) { flags |= reversed ? MOVE_UP_ALLOWED : MOVE_DN_ALLOWED; }
return flags; }
void ProxyPolicy::setMerit(LONG newMerit) { // Check if it's dirty to save excessive writes to the SDOs.
if (newMerit != merit) { merit = newMerit; _ltow(merit, szMerit, 10); self.setValue(PROPERTY_POLICY_MERIT, merit); self.apply(); } }
PCWSTR ProxyPolicy::getDisplayName(int column) const throw () { return column ? szMerit : name; }
HRESULT ProxyPolicy::addMenuItems( SnapInView& view, LPCONTEXTMENUCALLBACK callback, long insertionAllowed ) { static ResourceString moveUp(IDS_POLICY_MOVE_UP); static ResourceString moveDown(IDS_POLICY_MOVE_DOWN); static ResourceString moveUpStatusBar(IDS_POLICY_MOVE_UP_STATUS_BAR); static ResourceString moveDownStatusBar(IDS_POLICY_MOVE_DOWN_STATUS_BAR);
if (insertionAllowed & CCM_INSERTIONALLOWED_TOP) { ULONG flags = getToolbarFlags(view);
CONTEXTMENUITEM cmi; memset(&cmi, 0, sizeof(cmi)); cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP;
cmi.strName = moveUp; cmi.strStatusBarText = moveUpStatusBar; cmi.lCommandID = 0; cmi.fFlags = (flags & MOVE_UP_ALLOWED) ? MF_ENABLED : MF_GRAYED; callback->AddItem(&cmi);
cmi.strName = moveDown; cmi.strStatusBarText = moveDownStatusBar; cmi.lCommandID = 1; cmi.fFlags = (flags & MOVE_DN_ALLOWED) ? MF_ENABLED : MF_GRAYED; callback->AddItem(&cmi); }
return S_OK; }
int ProxyPolicy::compare( SnapInDataItem& item, int column ) throw () { if (column == 0) { return wcscmp(name, static_cast<ProxyPolicy&>(item).name); } else { LONG merit2 = static_cast<ProxyPolicy&>(item).merit;
if (merit < merit2) { return -1; } if (merit > merit2) { return +1; } return 0; } }
HRESULT ProxyPolicy::createPropertyPages( SnapInView& view, LPPROPERTYSHEETCALLBACK provider, LONG_PTR handle ) { AFX_MANAGE_STATE(AfxGetStaticModuleState());
ProxyPolicyPage* page = new ProxyPolicyPage( handle, (LPARAM)this, self, getProfile(), getParent().getCxn() ); page->addToMMCSheet(provider);
return S_OK; }
HRESULT ProxyPolicy::onDelete( SnapInView& view ) { HRESULT hr = SdoResultItem::onDelete(view);
if (hr == S_OK) { getParent().getCxn().getProxyProfiles().remove(getProfile());
// We have to renumber the policies to refresh the view.
view.updateAllViews(parent); }
return hr; }
HRESULT ProxyPolicy::onMenuCommand( SnapInView& view, long commandId ) { return getParent().movePolicy(view, *this, commandId); }
HRESULT ProxyPolicy::onRename( SnapInView& view, LPCOLESTR newName ) { // Make sure we have the profile before we rename otherwise, we won't be
// able to find it.
getProfile();
HRESULT hr = SdoResultItem::onRename(view, newName);
if (hr == S_OK) { self.setValue(PROPERTY_POLICY_PROFILE_NAME, name); self.apply(); profile.setName(name); profile.apply(); }
return hr; }
HRESULT ProxyPolicy::onToolbarButtonClick( SnapInView& view, int buttonId ) { return getParent().movePolicy(view, *this, buttonId); }
HRESULT ProxyPolicy::onToolbarSelect( SnapInView& view, BOOL scopeItem, BOOL selected ) { if (selected) { // Attach the toolbar ...
IToolbar* toolbar = view.attachToolbar(TOOLBAR_POLICY);
// ... and set button state according to the toolbar flags.
ULONG flags = getToolbarFlags(view); toolbar->SetButtonState( 0, ENABLED, ((flags & MOVE_UP_ALLOWED) ? TRUE : FALSE) ); toolbar->SetButtonState( 1, ENABLED, ((flags & MOVE_DN_ALLOWED) ? TRUE : FALSE) ); } else { // We're going away so detach.
view.detachToolbar(TOOLBAR_POLICY); }
return S_OK; }
HRESULT ProxyPolicy::onContextHelp(SnapInView& view) throw () { return view.displayHelp(L"ias_ops.chm::/sag_ias_crp_policies.htm"); }
int __cdecl ProxyPolicy::SortByMerit( const SdoResultItem* const* t1, const SdoResultItem* const* t2 ) throw () { return ((const ProxyPolicy*)*t1)->merit - ((const ProxyPolicy*)*t2)->merit; }
UINT ProxyPolicy::mapResourceId(ResourceId id) const throw () { static UINT resourceIds[] = { IMAGE_PROXY_POLICY, IDS_POLICY_DELETE_CAPTION, IDS_POLICY_DELETE_LOCAL, IDS_POLICY_DELETE_REMOTE, IDS_POLICY_DELETE_LAST_LOCAL, IDS_POLICY_DELETE_LAST_REMOTE, IDS_POLICY_E_CAPTION, IDS_POLICY_E_RENAME, IDS_POLICY_E_NAME_EMPTY };
return resourceIds[id]; }
ProxyPolicies::ProxyPolicies(SdoConnection& connection) : SdoScopeItem( connection, IDS_POLICY_NODE, IDS_POLICY_E_CAPTION, IDS_POLICY_MENU_TOP, IDS_POLICY_MENU_NEW, IDS_POLICY_MENU_STATUS_BAR ), nameColumn(IDS_POLICY_COLUMN_NAME), orderColumn(IDS_POLICY_COLUMN_ORDER) { }
ProxyPolicies::~ProxyPolicies() throw () { }
HRESULT ProxyPolicies::movePolicy( SnapInView& view, ProxyPolicy& policy, LONG commandId ) { // Get the current toolbar flags.
ULONG flags = policy.getToolbarFlags(view);
// Use the current merit as the starting point ...
LONG newMerit = policy.getMerit();
// ... and adjust depending on the the button clicked.
switch (commandId) { case 0: { if (!(flags & ProxyPolicy::MOVE_UP_ALLOWED)) { return S_FALSE; } (flags & ProxyPolicy::ORDER_REVERSED) ? ++newMerit : --newMerit; break; }
case 1: { if (!(flags & ProxyPolicy::MOVE_DN_ALLOWED)) { return S_FALSE; } (flags & ProxyPolicy::ORDER_REVERSED) ? --newMerit : ++newMerit; break; }
default: return S_FALSE; }
// Swap their merits.
ProxyPolicy& policy2 = getPolicyByMerit(newMerit); policy2.setMerit(policy.getMerit()); policy.setMerit(newMerit);
// Re-sort our vector.
items.sort(ProxyPolicy::SortByMerit);
// If the view isn't sorted, ...
if (view.getSortOption() & RSI_NOSORTICON) { // ... we'll sort by merit anyway.
view.getResultData()->Sort(1, RSI_NOSORTICON, 0); } else { view.reSort(); }
// Update the toolbar buttons based on the new state.
policy.onToolbarSelect(view, FALSE, TRUE);
// The configuration has changed, so tell IAS to reload.
cxn.resetService();
return S_OK; }
HRESULT ProxyPolicies::onContextHelp(SnapInView& view) throw () { return view.displayHelp(L"ias_ops.chm::/sag_ias_crp_policies.htm"); }
SdoCollection ProxyPolicies::getSelf() { return cxn.getProxyPolicies(); }
void ProxyPolicies::getResultItems(SdoEnum& src, ResultItems& dst) { // Convert the SDOs to ProxyPolicy objects.
Sdo itemSdo; while (src.next(itemSdo)) { CComPtr<ProxyPolicy> newItem(new (AfxThrow) ProxyPolicy( *this, itemSdo ));
dst.push_back(newItem); }
// Sort by merit.
dst.sort(ProxyPolicy::SortByMerit);
// Normalize.
LONG merit = 0; for (ResultIterator i = dst.begin(); i != dst.end(); ++i) { ((ProxyPolicy*)*i)->setMerit(++merit); } }
void ProxyPolicies::insertColumns(IHeaderCtrl2* headerCtrl) { CheckError(headerCtrl->InsertColumn(0, nameColumn, LVCFMT_LEFT, 235)); CheckError(headerCtrl->InsertColumn(1, orderColumn, LVCFMT_LEFT, 100)); }
HRESULT ProxyPolicies::onMenuCommand( SnapInView& view, long commandId ) { AFX_MANAGE_STATE(AfxGetStaticModuleState());
// Fire up the wizard.
NewPolicyWizard wizard(cxn, &view); if (wizard.DoModal() != IDCANCEL) { // We've changed every policy, so refresh the view.
view.updateAllViews(*this);
// Tell the service to reload
cxn.resetService(); }
return S_OK; }
void ProxyPolicies::propertyChanged(SnapInView& view, IASPROPERTIES id) { if (id == PROPERTY_IAS_PROXYPOLICIES_COLLECTION) { view.updateAllViews(*this); } }
|