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 >
C/C++ Source or Header  |  1999-12-31  |  10KB  |  315 lines

  1. /*======================================================================/
  2.  
  3.      SariAddin.cpp
  4.      
  5.     CSariAddinクラスはSARIとの接続および切断を実現します。
  6.     SariはこのクラスのOnConnection関数を呼び出すことにより、アドインプログ 
  7.     ラムとの接続をはかります。
  8.     アドインプログラムの作成者は、このOnConnection関数の中で、SARIに付加し 
  9.     たいコマンドを登録し、望むなら独自のツールバーを作成することができま 
  10.     す。
  11.     コマンドの登録で重要な変数が三つあります。
  12.     まずOnConnection関数によってSARIから渡されるlCookieです。これはアドイン 
  13.     プログラムそれぞれに対して発行される独自の正数値です。
  14.     次はコマンドの内部番号です。これはアドインプログラムの作成者が、SARIに 
  15.     登録したいコマンドごとに正の整数値を割り振ってください。
  16.     SARIから渡されたlCookieとDLL内部での番号を使い、下記のように、 
  17.     AddCommandメソッドをよぶと、実際SARI内部で使用される一意なコマンド番号 
  18.     が第5引数に格納されて返ります。    
  19.  
  20.     pMyApl->AddCommand(m_dwCookie, 1, bszCommand,bMenu, &lCommand[0]);
  21.  
  22.     このコマンド番号は、ツールバーの作成時に使います。
  23.     ユーザーがメニューやツールバーなどから、アドインのコマンドを実行した場 
  24.     合には、OnAddinCommandがシンクを通して呼び出されますが、この 
  25.     OnAddinCommandの引数はlCookie番号と、登録時に使った内部番号です。したが 
  26.     って、lCookieが違っていたらなにもせず、lCookieが同じなら、その内部番号 
  27.     によるswitchで、それに見合った処理をしてください。
  28.  
  29.  
  30. =======================================================================*/
  31.      
  32. #include "stdafx.h"
  33. #include "AD_Files.h"
  34. #include "Sari_i.h"
  35. #include "SariAddin.h"
  36.  
  37.  
  38. #define ADDIN_FIRSTTIME        0x00000001
  39. #define ADDIN_INSERT_MENU    0x00000002
  40. #define ADDIN_TOOLBAR       0x00000004
  41.  
  42. #define STKEY_SHIFT            0x00000001
  43. #define STKEY_CTRL            0x00000002
  44. #define    STKEY_ALT           0x00000004
  45.  
  46. #define STKEY_2STKEY_A                 1
  47. #define STKEY_2STKEY_B                 2
  48. #define STKEY_2STKEY_C                 3
  49. #define STKEY_2STKEY_D                 4
  50.  
  51.  
  52. /////////////////////////////////////////////////////////////////////////// 
  53. //
  54. // CSariAddin
  55.  
  56. STDMETHODIMP CSariAddin::OnConnection(ISRAPL *pApl, long lFlag, long lCookie, VARIANT_BOOL *pbResult)
  57. {
  58.     AFX_MANAGE_STATE(AfxGetStaticModuleState())
  59.  
  60.     // TODO: この位置にインプリメント用のコードを追加してください
  61.     ISRAPL *pMyApl=NULL;
  62.     if(FAILED(pApl->QueryInterface(IID_ISRAPL, (void**)&pMyApl))
  63.         || pMyApl==NULL){
  64.         *pbResult=VARIANT_FALSE;
  65.         return S_OK;
  66.     }
  67.     m_dwCookie=lCookie;
  68.  
  69.     //-----------------------------------------------------
  70.     ASSERT(m_pSink==NULL);
  71.     HRESULT hr=CComObject< CCommandSink >::CreateInstance(&m_pSink);
  72.     if(FAILED(hr)){
  73.         pMyApl->Release();
  74.         *pbResult=VARIANT_FALSE;
  75.         return S_OK;
  76.     }
  77.     m_pSink->AddRef();
  78.     if(!m_pSink->SetObjectInfo(pMyApl, m_dwCookie)) {
  79.         m_pSink->Release();
  80.         m_pSink=NULL;
  81.         *pbResult=VARIANT_FALSE;
  82.         return S_OK;
  83.     }
  84.     
  85.     /*------------------------------------------------------------
  86.     コマンドをSARIに登録します。
  87.     下記の例では、コマンド全体をまとめてポップアップメニューにしますの 
  88.     で、コマンド名の末尾にメニューのアクセラレーターを付加しています。
  89.     -------------------------------------------------------------*/
  90.     long lCommand[12];
  91.     CComBSTR bszCommand=_T("対応するファイルをオープン(&M)");
  92.     hr=pMyApl->AddCommand(m_dwCookie, 1, bszCommand, FALSE, &lCommand[0]);
  93.     if(FAILED(hr)) goto EXIT;
  94.  
  95.     lCommand[1]=0x0800; // コマンド値としてこの値を与えると、後の
  96.                         // SetAddinMenuGroupメソッドでメニューを作るとき
  97.                         // セパレーターになります。
  98.  
  99.     bszCommand=_T("このディレクトリ内のファイルを開くときは編集禁止で(&U)");
  100.     hr=pMyApl->AddCommand(m_dwCookie, 2, bszCommand,FALSE, &lCommand[2]);
  101.     if(FAILED(hr)) goto EXIT;
  102.     bszCommand=_T("ディレクトリの「編集禁止」をやめる(&E)");
  103.     hr=pMyApl->AddCommand(m_dwCookie, 3, bszCommand,FALSE, &lCommand[3]);
  104.     if(FAILED(hr)) goto EXIT;
  105.     bszCommand=_T("この拡張子のファイルを開くときは編集禁止で(&X)");
  106.     hr=pMyApl->AddCommand(m_dwCookie, 4, bszCommand,FALSE, &lCommand[4]);
  107.     if(FAILED(hr)) goto EXIT;
  108.     bszCommand=_T("拡張子の「編集禁止」をやめる(&T)");
  109.     hr=pMyApl->AddCommand(m_dwCookie, 5, bszCommand,FALSE, &lCommand[5]);
  110.     if(FAILED(hr)) goto EXIT;
  111.     bszCommand=_T("ファイルをReadOnlyにする(&R)");
  112.     hr=pMyApl->AddCommand(m_dwCookie, 6, bszCommand,FALSE, &lCommand[6]);
  113.     if(FAILED(hr)) goto EXIT;
  114.     bszCommand=_T("ファイルのReadOnlyを解除(&Q)");
  115.     hr=pMyApl->AddCommand(m_dwCookie, 7, bszCommand,FALSE, &lCommand[7]);
  116.     if(FAILED(hr)) goto EXIT;
  117.     bszCommand=_T("ディレクトリ内の全ファイルをReadOnlyに(&L)");
  118.     hr=pMyApl->AddCommand(m_dwCookie, 8, bszCommand,FALSE, &lCommand[8]);
  119.     if(FAILED(hr)) goto EXIT;
  120.     bszCommand=_T("ディレクトリ内のファイルのReadOnly属性を解除(&Y)");
  121.     hr=pMyApl->AddCommand(m_dwCookie, 9, bszCommand,FALSE, &lCommand[9]);
  122.     if(FAILED(hr)) goto EXIT;
  123.  
  124.     lCommand[10]=0x0800; // コマンド値としてこの値を与えると、後の
  125.                         // SetAddinMenuGroupメソッドでメニューを作るとき
  126.                         // セパレーターになります。
  127.     
  128.     bszCommand=_T("このアドインに関する設定(&S)");
  129.     hr=pMyApl->AddCommand(m_dwCookie, 10, bszCommand,FALSE, &lCommand[11]);
  130.     if(FAILED(hr)) goto EXIT;
  131.  
  132.     // ショートカットキーを設定する場合は,AddCommandメソッド
  133.     // でメニュー作成をFALSEにし、グループ化してメニューを作るSetAddinMenuGroup
  134.     // を呼び出す前にショートカットキーを作成してください。メニューに
  135.     // ショートカットキーを表示するためです。
  136.  
  137.     //「対応するファイルをオープン」にショートカットキーを設定します。
  138.     // まずユーザーがそのコマンドに対してショートカットキーを設定していないか
  139.     // を調べます。
  140.  
  141.     {
  142.     CComVariant vrState, vrVKey;
  143.     pMyApl->FindShortcutKey(lCommand[0], &vrState, &vrVKey);
  144.     SAFEARRAY *psa=vrVKey.parray;
  145.     if(psa->rgsabound->cElements==0)
  146.     {    // ユーザーがショートカットキーを設定していないので、プログラムで設定します。
  147.         // 候補としてCtrl + Alt + M はどうでしょうか?
  148.         // このショートカットキーにユーザーが別のコマンドを割り当てていないか調べます。
  149.         long lCmd;
  150.         long lState =(STKEY_CTRL| STKEY_ALT); 
  151.         short stVKey=(short)'M';    
  152.         pMyApl->GetCommandWithShortcutKey(lState, stVKey, &lCmd);
  153.         if(lCmd!=0){ // そのキーにはすでにコマンドが割り当てられています。
  154.                         // あいているキーを無差別に探します。
  155.             stVKey=(short)'A';
  156.             for(int i=0; i<26; i++){
  157.                 pMyApl->GetCommandWithShortcutKey(lState, stVKey, &lCmd);
  158.                 if(lCmd==0)
  159.                     break;        
  160.                 stVKey++;
  161.             }
  162.         }
  163.         // あきが見つからなければ、設定をあきらめます。            
  164.         if(lCmd==0) {
  165.             pMyApl->SetShortcutKey(lCommand[0], lState, stVKey);
  166.         }
  167.     }
  168.     }
  169.  
  170.     // --------------------------------------------------------------
  171.     //メニューをグループ化して作成します。
  172.     //---------------------------------------------------------------
  173.     bszCommand=_T("ファイル系");
  174.     if(lFlag & ADDIN_INSERT_MENU){
  175.         CComVariant vrMenuCmd;
  176.         vrMenuCmd.vt=(VT_ARRAY|VT_I4);
  177.         SAFEARRAYBOUND bounds={12, 0};        
  178.         SAFEARRAY *psa=SafeArrayCreate(VT_I4, 1, &bounds);
  179.         long *lCmds=NULL;
  180.         SafeArrayAccessData(psa, (void**)&lCmds);
  181.         for(int i=0; i<12; i++)
  182.             lCmds[i]=lCommand[i];
  183.         SafeArrayUnaccessData(psa);    
  184.         vrMenuCmd.parray=psa;
  185.         pMyApl->SetAddinMenuGroup(bszCommand, vrMenuCmd);
  186.  
  187.     }
  188.  
  189.     //--------------------------------------------------------------
  190.     //ツールバーを作成します。
  191.     //一本のツールバーでもいいのですが、いくつかに分割し、ユーザーが
  192.     //任意のツールバーだけを表示できるようにします。
  193.     //---------------------------------------------------------------
  194.     if(lFlag & ADDIN_TOOLBAR){
  195.         CComVariant vrTBCmd;
  196.         SAFEARRAYBOUND bounds;
  197.         bounds.lLbound=0;        
  198.         long *lCmds=NULL;
  199.         SAFEARRAY *psa;
  200.         int i, k;
  201.         if(m_pSink->m_dwFlag & F_10){
  202.             vrTBCmd.vt=VT_ARRAY | VT_I4;
  203.             bounds.cElements=1;            
  204.             psa=SafeArrayCreate(VT_I4, 1, &bounds);
  205.             SafeArrayAccessData(psa, (void**)&lCmds);
  206.             for( i=0, k=0; i<1; i++, k++)
  207.                 lCmds[i]=lCommand[k];
  208.             SafeArrayUnaccessData(psa);    
  209.             vrTBCmd.parray=psa;
  210.             bszCommand=_T("対応ファイル");
  211.             hr=pMyApl->CreateToolBar(m_dwCookie, bszCommand, IDR_TB_MATCHFILE, vrTBCmd);
  212.             if(SUCCEEDED(hr))
  213.                 m_pSink->m_dwFlag |=F_20;
  214.             vrTBCmd.Clear();
  215.         }
  216.         if(m_pSink->m_dwFlag & F_11){
  217.             vrTBCmd.vt=VT_ARRAY | VT_I4;
  218.             bounds.cElements=2;            
  219.             psa=SafeArrayCreate(VT_I4, 1, &bounds);
  220.             SafeArrayAccessData(psa, (void**)&lCmds);
  221.             for( i=0, k=2; i<2; i++, k++)
  222.                 lCmds[i]=lCommand[k];
  223.             SafeArrayUnaccessData(psa);    
  224.             vrTBCmd.parray=psa;
  225.             bszCommand=_T("ディレクトリの編集禁止");
  226.             hr=pMyApl->CreateToolBar(m_dwCookie, bszCommand, IDR_TB_UEDIR, vrTBCmd);
  227.             if(SUCCEEDED(hr))
  228.                 m_pSink->m_dwFlag |=F_21;
  229.             vrTBCmd.Clear();
  230.         }
  231.         if(m_pSink->m_dwFlag & F_12){
  232.             vrTBCmd.vt=VT_ARRAY | VT_I4;
  233.             bounds.cElements=2;            
  234.             psa=SafeArrayCreate(VT_I4, 1, &bounds);
  235.             SafeArrayAccessData(psa, (void**)&lCmds);
  236.             for( i=0, k=4; i<2; i++, k++)
  237.                 lCmds[i]=lCommand[k];
  238.             SafeArrayUnaccessData(psa);    
  239.             vrTBCmd.parray=psa;
  240.             bszCommand=_T("拡張子の編集禁止");
  241.             hr=pMyApl->CreateToolBar(m_dwCookie, bszCommand, IDR_TB_UEEXT, vrTBCmd);
  242.             if(SUCCEEDED(hr))
  243.                 m_pSink->m_dwFlag |=F_22;
  244.             vrTBCmd.Clear();
  245.         }
  246.         if(m_pSink->m_dwFlag & F_13){
  247.             vrTBCmd.vt=VT_ARRAY | VT_I4;
  248.             bounds.cElements=4;            
  249.             psa=SafeArrayCreate(VT_I4, 1, &bounds);
  250.             SafeArrayAccessData(psa, (void**)&lCmds);
  251.             for( i=0, k=6; i<4; i++, k++)
  252.                 lCmds[i]=lCommand[k];
  253.             SafeArrayUnaccessData(psa);    
  254.             vrTBCmd.parray=psa;
  255.             bszCommand=_T("ReadOnly属性の設定");
  256.             hr=pMyApl->CreateToolBar(m_dwCookie, bszCommand, IDR_TB_READONLY, vrTBCmd);
  257.             if(SUCCEEDED(hr))
  258.                 m_pSink->m_dwFlag |=F_23;
  259.             vrTBCmd.Clear();
  260.         }
  261.  
  262.     }
  263.  
  264.  
  265. EXIT:    
  266.     *pbResult=VARIANT_TRUE;
  267.         // 接続が成功したら、コマンド登録に失敗しても、VARIANT_TRUEを返して
  268.         // ください。
  269.  
  270.     return S_OK;
  271.  
  272.  
  273. }
  274.  
  275. STDMETHODIMP CSariAddin::OnDisconnection(VARIANT_BOOL bLastTime)
  276. {
  277.     AFX_MANAGE_STATE(AfxGetStaticModuleState())
  278.  
  279.     // TODO: この位置にインプリメント用のコードを追加してください
  280.     ASSERT(m_pSink!=NULL);
  281.     
  282.     m_pSink->Unadvise();
  283.     m_pSink->Release();
  284.     m_pSink=NULL;
  285.  
  286.     return S_OK;
  287. }
  288.  
  289. /////////////////////////////////////////////////////////////////////////////////
  290.  
  291. STDMETHODIMP CSariAddin::InterfaceSupportsErrorInfo(REFIID riid)
  292. {
  293.     static const IID* arr[] = 
  294.     {
  295.         &IID_ISariAddin
  296.     };
  297.     for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
  298.     {
  299.         if (InlineIsEqualGUID(*arr[i],riid))
  300.             return S_OK;
  301.     }
  302.     return S_FALSE;
  303. }
  304.  
  305. /////////////////////////////////////////////////////////////////////////////////
  306.  
  307.  
  308. extern "C"
  309. __declspec(dllexport) void GetCLSIDofSariAddin(CLSID *pID)
  310. {
  311.     *pID=CLSID_SariAddin;
  312. }
  313.  
  314.  
  315.