home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2000 April
/
VPR0004A.BIN
/
OLS
/
SADKT100
/
sadkt100.lzh
/
SrcFiles.lzh
/
SariAddin.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1999-12-31
|
10KB
|
315 lines
/*======================================================================/
SariAddin.cpp
CSariAddinクラスはSARIとの接続および切断を実現します。
SariはこのクラスのOnConnection関数を呼び出すことにより、アドインプログ
ラムとの接続をはかります。
アドインプログラムの作成者は、このOnConnection関数の中で、SARIに付加し
たいコマンドを登録し、望むなら独自のツールバーを作成することができま
す。
コマンドの登録で重要な変数が三つあります。
まずOnConnection関数によってSARIから渡されるlCookieです。これはアドイン
プログラムそれぞれに対して発行される独自の正数値です。
次はコマンドの内部番号です。これはアドインプログラムの作成者が、SARIに
登録したいコマンドごとに正の整数値を割り振ってください。
SARIから渡されたlCookieとDLL内部での番号を使い、下記のように、
AddCommandメソッドをよぶと、実際SARI内部で使用される一意なコマンド番号
が第5引数に格納されて返ります。
pMyApl->AddCommand(m_dwCookie, 1, bszCommand,bMenu, &lCommand[0]);
このコマンド番号は、ツールバーの作成時に使います。
ユーザーがメニューやツールバーなどから、アドインのコマンドを実行した場
合には、OnAddinCommandがシンクを通して呼び出されますが、この
OnAddinCommandの引数はlCookie番号と、登録時に使った内部番号です。したが
って、lCookieが違っていたらなにもせず、lCookieが同じなら、その内部番号
によるswitchで、それに見合った処理をしてください。
=======================================================================*/
#include "stdafx.h"
#include "AD_Files.h"
#include "Sari_i.h"
#include "SariAddin.h"
#define ADDIN_FIRSTTIME 0x00000001
#define ADDIN_INSERT_MENU 0x00000002
#define ADDIN_TOOLBAR 0x00000004
#define STKEY_SHIFT 0x00000001
#define STKEY_CTRL 0x00000002
#define STKEY_ALT 0x00000004
#define STKEY_2STKEY_A 1
#define STKEY_2STKEY_B 2
#define STKEY_2STKEY_C 3
#define STKEY_2STKEY_D 4
///////////////////////////////////////////////////////////////////////////
//
// CSariAddin
STDMETHODIMP CSariAddin::OnConnection(ISRAPL *pApl, long lFlag, long lCookie, VARIANT_BOOL *pbResult)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: この位置にインプリメント用のコードを追加してください
ISRAPL *pMyApl=NULL;
if(FAILED(pApl->QueryInterface(IID_ISRAPL, (void**)&pMyApl))
|| pMyApl==NULL){
*pbResult=VARIANT_FALSE;
return S_OK;
}
m_dwCookie=lCookie;
//-----------------------------------------------------
ASSERT(m_pSink==NULL);
HRESULT hr=CComObject< CCommandSink >::CreateInstance(&m_pSink);
if(FAILED(hr)){
pMyApl->Release();
*pbResult=VARIANT_FALSE;
return S_OK;
}
m_pSink->AddRef();
if(!m_pSink->SetObjectInfo(pMyApl, m_dwCookie)) {
m_pSink->Release();
m_pSink=NULL;
*pbResult=VARIANT_FALSE;
return S_OK;
}
/*------------------------------------------------------------
コマンドをSARIに登録します。
下記の例では、コマンド全体をまとめてポップアップメニューにしますの
で、コマンド名の末尾にメニューのアクセラレーターを付加しています。
-------------------------------------------------------------*/
long lCommand[12];
CComBSTR bszCommand=_T("対応するファイルをオープン(&M)");
hr=pMyApl->AddCommand(m_dwCookie, 1, bszCommand, FALSE, &lCommand[0]);
if(FAILED(hr)) goto EXIT;
lCommand[1]=0x0800; // コマンド値としてこの値を与えると、後の
// SetAddinMenuGroupメソッドでメニューを作るとき
// セパレーターになります。
bszCommand=_T("このディレクトリ内のファイルを開くときは編集禁止で(&U)");
hr=pMyApl->AddCommand(m_dwCookie, 2, bszCommand,FALSE, &lCommand[2]);
if(FAILED(hr)) goto EXIT;
bszCommand=_T("ディレクトリの「編集禁止」をやめる(&E)");
hr=pMyApl->AddCommand(m_dwCookie, 3, bszCommand,FALSE, &lCommand[3]);
if(FAILED(hr)) goto EXIT;
bszCommand=_T("この拡張子のファイルを開くときは編集禁止で(&X)");
hr=pMyApl->AddCommand(m_dwCookie, 4, bszCommand,FALSE, &lCommand[4]);
if(FAILED(hr)) goto EXIT;
bszCommand=_T("拡張子の「編集禁止」をやめる(&T)");
hr=pMyApl->AddCommand(m_dwCookie, 5, bszCommand,FALSE, &lCommand[5]);
if(FAILED(hr)) goto EXIT;
bszCommand=_T("ファイルをReadOnlyにする(&R)");
hr=pMyApl->AddCommand(m_dwCookie, 6, bszCommand,FALSE, &lCommand[6]);
if(FAILED(hr)) goto EXIT;
bszCommand=_T("ファイルのReadOnlyを解除(&Q)");
hr=pMyApl->AddCommand(m_dwCookie, 7, bszCommand,FALSE, &lCommand[7]);
if(FAILED(hr)) goto EXIT;
bszCommand=_T("ディレクトリ内の全ファイルをReadOnlyに(&L)");
hr=pMyApl->AddCommand(m_dwCookie, 8, bszCommand,FALSE, &lCommand[8]);
if(FAILED(hr)) goto EXIT;
bszCommand=_T("ディレクトリ内のファイルのReadOnly属性を解除(&Y)");
hr=pMyApl->AddCommand(m_dwCookie, 9, bszCommand,FALSE, &lCommand[9]);
if(FAILED(hr)) goto EXIT;
lCommand[10]=0x0800; // コマンド値としてこの値を与えると、後の
// SetAddinMenuGroupメソッドでメニューを作るとき
// セパレーターになります。
bszCommand=_T("このアドインに関する設定(&S)");
hr=pMyApl->AddCommand(m_dwCookie, 10, bszCommand,FALSE, &lCommand[11]);
if(FAILED(hr)) goto EXIT;
// ショートカットキーを設定する場合は,AddCommandメソッド
// でメニュー作成をFALSEにし、グループ化してメニューを作るSetAddinMenuGroup
// を呼び出す前にショートカットキーを作成してください。メニューに
// ショートカットキーを表示するためです。
//「対応するファイルをオープン」にショートカットキーを設定します。
// まずユーザーがそのコマンドに対してショートカットキーを設定していないか
// を調べます。
{
CComVariant vrState, vrVKey;
pMyApl->FindShortcutKey(lCommand[0], &vrState, &vrVKey);
SAFEARRAY *psa=vrVKey.parray;
if(psa->rgsabound->cElements==0)
{ // ユーザーがショートカットキーを設定していないので、プログラムで設定します。
// 候補としてCtrl + Alt + M はどうでしょうか?
// このショートカットキーにユーザーが別のコマンドを割り当てていないか調べます。
long lCmd;
long lState =(STKEY_CTRL| STKEY_ALT);
short stVKey=(short)'M';
pMyApl->GetCommandWithShortcutKey(lState, stVKey, &lCmd);
if(lCmd!=0){ // そのキーにはすでにコマンドが割り当てられています。
// あいているキーを無差別に探します。
stVKey=(short)'A';
for(int i=0; i<26; i++){
pMyApl->GetCommandWithShortcutKey(lState, stVKey, &lCmd);
if(lCmd==0)
break;
stVKey++;
}
}
// あきが見つからなければ、設定をあきらめます。
if(lCmd==0) {
pMyApl->SetShortcutKey(lCommand[0], lState, stVKey);
}
}
}
// --------------------------------------------------------------
//メニューをグループ化して作成します。
//---------------------------------------------------------------
bszCommand=_T("ファイル系");
if(lFlag & ADDIN_INSERT_MENU){
CComVariant vrMenuCmd;
vrMenuCmd.vt=(VT_ARRAY|VT_I4);
SAFEARRAYBOUND bounds={12, 0};
SAFEARRAY *psa=SafeArrayCreate(VT_I4, 1, &bounds);
long *lCmds=NULL;
SafeArrayAccessData(psa, (void**)&lCmds);
for(int i=0; i<12; i++)
lCmds[i]=lCommand[i];
SafeArrayUnaccessData(psa);
vrMenuCmd.parray=psa;
pMyApl->SetAddinMenuGroup(bszCommand, vrMenuCmd);
}
//--------------------------------------------------------------
//ツールバーを作成します。
//一本のツールバーでもいいのですが、いくつかに分割し、ユーザーが
//任意のツールバーだけを表示できるようにします。
//---------------------------------------------------------------
if(lFlag & ADDIN_TOOLBAR){
CComVariant vrTBCmd;
SAFEARRAYBOUND bounds;
bounds.lLbound=0;
long *lCmds=NULL;
SAFEARRAY *psa;
int i, k;
if(m_pSink->m_dwFlag & F_10){
vrTBCmd.vt=VT_ARRAY | VT_I4;
bounds.cElements=1;
psa=SafeArrayCreate(VT_I4, 1, &bounds);
SafeArrayAccessData(psa, (void**)&lCmds);
for( i=0, k=0; i<1; i++, k++)
lCmds[i]=lCommand[k];
SafeArrayUnaccessData(psa);
vrTBCmd.parray=psa;
bszCommand=_T("対応ファイル");
hr=pMyApl->CreateToolBar(m_dwCookie, bszCommand, IDR_TB_MATCHFILE, vrTBCmd);
if(SUCCEEDED(hr))
m_pSink->m_dwFlag |=F_20;
vrTBCmd.Clear();
}
if(m_pSink->m_dwFlag & F_11){
vrTBCmd.vt=VT_ARRAY | VT_I4;
bounds.cElements=2;
psa=SafeArrayCreate(VT_I4, 1, &bounds);
SafeArrayAccessData(psa, (void**)&lCmds);
for( i=0, k=2; i<2; i++, k++)
lCmds[i]=lCommand[k];
SafeArrayUnaccessData(psa);
vrTBCmd.parray=psa;
bszCommand=_T("ディレクトリの編集禁止");
hr=pMyApl->CreateToolBar(m_dwCookie, bszCommand, IDR_TB_UEDIR, vrTBCmd);
if(SUCCEEDED(hr))
m_pSink->m_dwFlag |=F_21;
vrTBCmd.Clear();
}
if(m_pSink->m_dwFlag & F_12){
vrTBCmd.vt=VT_ARRAY | VT_I4;
bounds.cElements=2;
psa=SafeArrayCreate(VT_I4, 1, &bounds);
SafeArrayAccessData(psa, (void**)&lCmds);
for( i=0, k=4; i<2; i++, k++)
lCmds[i]=lCommand[k];
SafeArrayUnaccessData(psa);
vrTBCmd.parray=psa;
bszCommand=_T("拡張子の編集禁止");
hr=pMyApl->CreateToolBar(m_dwCookie, bszCommand, IDR_TB_UEEXT, vrTBCmd);
if(SUCCEEDED(hr))
m_pSink->m_dwFlag |=F_22;
vrTBCmd.Clear();
}
if(m_pSink->m_dwFlag & F_13){
vrTBCmd.vt=VT_ARRAY | VT_I4;
bounds.cElements=4;
psa=SafeArrayCreate(VT_I4, 1, &bounds);
SafeArrayAccessData(psa, (void**)&lCmds);
for( i=0, k=6; i<4; i++, k++)
lCmds[i]=lCommand[k];
SafeArrayUnaccessData(psa);
vrTBCmd.parray=psa;
bszCommand=_T("ReadOnly属性の設定");
hr=pMyApl->CreateToolBar(m_dwCookie, bszCommand, IDR_TB_READONLY, vrTBCmd);
if(SUCCEEDED(hr))
m_pSink->m_dwFlag |=F_23;
vrTBCmd.Clear();
}
}
EXIT:
*pbResult=VARIANT_TRUE;
// 接続が成功したら、コマンド登録に失敗しても、VARIANT_TRUEを返して
// ください。
return S_OK;
}
STDMETHODIMP CSariAddin::OnDisconnection(VARIANT_BOOL bLastTime)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: この位置にインプリメント用のコードを追加してください
ASSERT(m_pSink!=NULL);
m_pSink->Unadvise();
m_pSink->Release();
m_pSink=NULL;
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CSariAddin::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_ISariAddin
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
/////////////////////////////////////////////////////////////////////////////////
extern "C"
__declspec(dllexport) void GetCLSIDofSariAddin(CLSID *pID)
{
*pID=CLSID_SariAddin;
}