//  Source File Name: PluginEx.java  1.2
//  
//   Licensed Materials -- Property of IBM 
//  
//   (c) Copyright International Business Machines Corporation, 1999. 
//       All Rights Reserved. 
//  
//   US Government Users Restricted Rights - 
//   Use, duplication or disclosure restricted by 
//   GSA ADP Schedule Contract with IBM Corp. 
//  
//   Sample Program PluginEx - Client program to add new menu items and toolbar 
//                             buttons to the Control Center 
//  
//   Steps to run the sample: 
//   (1) you must have the "DB2" instance cataloged on the client 
//   (2) you must have the "sample" database cataloged on the client 
//   (3) replace "XXXXX" string in this file with your system name. 
//   (4) compile this java file (javac PluginEx.java).  
//       On Windows 32-bit and the OS/2 operating systems,  
//       your CLASSPATH must include the DRIVE:\sqllib\java\swingall.jar 
//       file, the DRIVE:\sqllib\cc\db2cc.jar file, and the  
//       DRIVE:\sqllib\cc directory to compile this sample  
//       (where DRIVE: represents the drive on which DB2 is installed). 
//       On UNIX platforms, CLASSPATH must include  
//       /u/db2inst1/sqllib/cc, /u/db2inst1/sqllib/cc/db2cc.jar, and  
//       /u/db2inst1/sqllib/java/swingall.jar, where /u/db2inst1  
//       represents the directory on which DB2 is installed. 
//   (5) create db2plug.zip (zip -0 db2plug.zip PluginEx.class) 
//   (6) put db2plug.zip in where the Control Center is run. 
//   (7) Run the Control Center. 
//  
//   NOTES: (1) The jdk11_path database manager configuration parameter must 
//              be set 
//          (2) The CLASSPATH and shared library path environment variables 
//              must be set.  
//          (3) Visit http://www.software.ibm.com/data/db2/java 
//              for current DB2 Java information 

//  For more information about this sample, refer to the README file. 

//  For more information about the Control Center  
//  For more information on Programming in Java, refer to the  
//  "Programming in Java" section of the Application Development Guide. 

//  For more information on building and running Java programs for DB2, 
//  refer to the "Building Java Applets and Applications" section of the  
//  Application Building Guide. 

//  For more information on the SQL language, refer to the SQL Reference. 

import navigator.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * This CCExtension interface allows user to extend the Control Center user
 * interface by adding new toolbar buttons, new menu items and
 * remove some predefined set of existing menu actions.
 * <p>
 * To do so, create a java file which imports the com.ibm.db2.tool.navigator package and
 * implements this interface.  The new file provides the implementation
 * of the getObjects() and getToolbarActions() function.
 * <p>
 * The getObjects() function returns an array of CCObjects which defines
 * the existing
 * objects which the user would like to add new menu actions or remove
 * the alter or configure menu actions.
 * <p>
 * The getToolbarActions() function returns an array of CCToolbarActions which is
 * added to the Control Center main toolbar.
 * <p>
 * This CCExtension subclass file will define a sample Control Center extensions.
 * In order for the Control Center to make use of these extensions, use the following
 * setup procedures:
 * (1) Create a "db2plug.zip" file which contains all this CCExtension subclass file.
 *     The file should not be compressed. For example, issues
 *        zip -r0 db2plug.zip PluginEx.class
 *     This command will put all the class files into the db2plug.zip
 *     file and preserve the relative path information.
 * (2) To run WEBCC as an applet, put the db2plug.zip file in where the <codebase>
 *     tag points to in the WEBCC html file. To run WEBCC as an application, put
 *     the db2plug.zip in a directory pointed to by the CLASSPATH envirnoment variable.
 * <p>
 * For browsers that support multiple archives, just add "db2plug.zip" to the archive list
 * of the WEBCC html page. Otherwise, all the CCExtension, CCObject, CCToolbarAction, CCMenuAction subclass
 * files will have to be in their relative path depending on which package they belong to.
 * In this case, this extension does not belong to any package.
 */
public class PluginEx implements CCExtension
{
   /**
    * Return an array of CCObject subclass objects which define
    * a list of Control Center objects to override
    */
   public CCObject[] getObjects()
   {
      CCObject[] objs = new CCObject[14];
      objs[0] = new MySample();
      objs[1] = new MyDatabaseActions();
      objs[2] = new MyDB2();
      objs[3] = new MyDatabasesFolder();
      objs[4] = new MySYSPLAN();
      objs[5] = new MyDBUsersFolder();
      objs[6] = new MyPackagesFolder();
      objs[7] = new MySQLE28N6();
      objs[8] = new MyUserGroupObjectsFolder();
      objs[9] = new MyDataTypeActions();
      objs[10]= new MyInstancesFolder();
      objs[11]= new MySystemsFolder();
      objs[12]= new MyXXXXX();
      objs[13]= new MyIndexActions();
      return objs;
   }

   public CCToolbarAction[] getToolbarActions()
   {
      CCToolbarAction[] actions = new CCToolbarAction[1];
      actions[0] = new MyToolbarAction();
      return actions;
   }

   /**
    * The class defines the menu items to be added to
    * popup menu of the XXXXX - DB2 - SAMPLE packages foler.
    */
   class MyPackagesFolder implements CCObject
   {
      public String getName()
      {
         return "XXXXX - DB2 - SAMPLE";
      }

      public int getType()
      {
         return UDB_PACKAGES_FOLDER;
      }

      public CCMenuAction[] getMenuActions()
      {
         CCMenuAction[] acts = new CCMenuAction[1];
         acts[0] = new MyCreateAction();
         return acts;
      }

      public boolean isEditable() { return true; }
      public boolean isConfigurable() { return true; }
   }

   /**
    * The class defines the menu items to be added to
    * popup menu of the XXXXX-DB2-SAMPLE database
    * and remove the Alter/Change and Configure menu items.
    */
   class MySample implements CCObject
   {
      public String getName()
      {
         return "XXXXX - DB2 - SAMPLE";
      }

      public int getType()
      {
         return UDB_DATABASE;
      }

      public CCMenuAction[] getMenuActions()
      {
         CCMenuAction[] acts = new CCMenuAction[2];
         acts[0] = new MyAlterAction();
         acts[1] = new MyAction();
         return acts;
      }

      public boolean isEditable() { return false; }
      public boolean isConfigurable() { return false; }
   }

   /**
    * The class defines the menu items to be added to
    * popup menu of the XXXXX-DB2-SAMPLE-NULLID.SQLE28N6 package.
    */
   class MySQLE28N6 implements CCObject
   {
      public String getName()
      {
         return "XXXXX - DB2 - SAMPLE-NULLID.SQLE28N6";
      }

      public int getType()
      {
         return UDB_PACKAGE;
      }

      public CCMenuAction[] getMenuActions()
      {
         CCMenuAction[] acts = new CCMenuAction[1];
         acts[0] = new MyAlterAction();
         return acts;
      }

      public boolean isEditable() { return true; }
      public boolean isConfigurable() { return true; }
   }

   /**
    * The class defines the menu items to be added to
    * popup menu of the XXXXX-DB2-SAMPLE-SYSIBM.SYSPLAN table
    * and remove the Alter/Change menu items.
    */
   class MySYSPLAN implements CCObject
   {
      public String getName()
      {
         return "XXXXX - DB2 - SAMPLE - SYSIBM.SYSPLAN";
      }

      public int getType()
      {
         return UDB_TABLE;
      }

      public CCMenuAction[] getMenuActions()
      {
         CCMenuAction[] acts = new CCMenuAction[2];
         acts[0] = new MyAlterAction();
         acts[1] = new MyAction();
         return acts;
      }

      public boolean isEditable() { return false; }
      public boolean isConfigurable() { return true; }
   }

   /**
    * The class defines the button to be added to
    * the Control Center toolbar.
    */
   class MyToolbarAction implements CCToolbarAction
   {
      public String getHoverHelpText()
      {
         return "MyToolbarAction";
      }

      public ImageIcon getIcon()
      {
         // Return your ImageIcon here 
         return null;
      }

      public void actionPerformed(ActionEvent e)
      {
         System.out.println( "My toolbar action performed, object name = " + e.getActionCommand() );
      }
   }

   /**
    * The class defines the menu items to be added to
    * popup menu of the XXXXX-DB2-SAMPLE user and group objects folder.
    */
   class MyUserGroupObjectsFolder implements CCObject
   {
      public String getName()
      {
         return "XXXXX - DB2 - SAMPLE";
      }

      public int getType()
      {
         return UDB_USER_AND_GROUP_OBJECTS_FOLDER;
      }

      public CCMenuAction[] getMenuActions()
      {
         CCMenuAction[] acts = new CCMenuAction[2];
         acts[0] = new MyAlterAction();
         acts[1] = new MyAction();
         return acts;
      }

      public boolean isEditable() { return true; }
      public boolean isConfigurable() { return true; }
   }

   /**
    * The class defines the menu items to be added to
    * popup menu of the XXXXX instances folder.
    */
   class MyInstancesFolder implements CCObject
   {
      public String getName()
      {
         return "XXXXX";
      }

      public int getType()
      {
         return UDB_INSTANCES_FOLDER;
      }

      public CCMenuAction[] getMenuActions()
      {
         CCMenuAction[] acts = new CCMenuAction[1];
         acts[0] = new MyCreateAction();
         return acts;
      }

      public boolean isEditable() { return true; }
      public boolean isConfigurable() { return true; }
   }

   /**
    * The class defines the menu items to be added to
    * popup menu of the systems folder.
    */
   class MySystemsFolder implements CCObject
   {
      public String getName()
      {
         return null;
      }

      public int getType()
      {
         return UDB_SYSTEMS_FOLDER;
      }

      public CCMenuAction[] getMenuActions()
      {
         CCMenuAction[] acts = new CCMenuAction[1];
         acts[0] = new MyCreateAction();
         return acts;
      }

      public boolean isEditable() { return true; }
      public boolean isConfigurable() { return true; }
   }

   /**
    * The class defines the menu items to be added to
    * popup menu of the XXXXX system.
    */
   class MyXXXXX implements CCObject
   {
      public String getName()
      {
         return "XXXXX";
      }

      public int getType()
      {
         return UDB_SYSTEM;
      }

      public CCMenuAction[] getMenuActions()
      {
         CCMenuAction[] acts = new CCMenuAction[2];
         acts[0] = new MyAlterAction();
         acts[1] = new MyAction();
         return acts;
      }

      public boolean isEditable() { return true; }
      public boolean isConfigurable() { return true; }
   }

   /**
    * The class defines the menu items to be added to
    * popup menu of all the UDB index objects
    * and remove the Alter/Change menu item.
    */
   class MyIndexActions implements CCObject
   {
      public String getName()
      {
         return null;
      }

      public int getType()
      {
         return UDB_INDEX;
      }

      public CCMenuAction[] getMenuActions()
      {
         CCMenuAction[] acts = new CCMenuAction[1];
         acts[0] = new MyCreateAction();
         return acts;
      }

      public boolean isEditable() { return false; }
      public boolean isConfigurable() { return true; }
   }

   /**
    * The class defines the MyAction menu items.
    */
   class MyAction implements CCMenuAction
   {
      public String getMenuText()
      {
         return "MyAction";
      }

      public void actionPerformed(ActionEvent e)
      {
         System.out.println( "My action performed, object name = " + e.getActionCommand() );
      }
   }

   /**
    * The class defines the MyAlterAction menu items.
    */
   class MyAlterAction implements CCMenuAction
   {
      public String getMenuText()
      {
         return "My Alter";
      }

      public void actionPerformed(ActionEvent e)
      {
         System.out.println( "My alter action performed, object name = " + e.getActionCommand() );
      }
   }

   /**
    * The class defines the MyCreateAction menu items.
    */
   class MyCreateAction implements CCMenuAction
   {
      public String getMenuText()
      {
         return "My create";
      }

      public void actionPerformed(ActionEvent e)
      {
         System.out.println( "My create action performed, object name = " + e.getActionCommand() );
      }
   }

   /**
    * The class defines the menu items to be added to
    * popup menu of all the UDB database objects.
    */
   class MyDatabaseActions implements CCObject
   {
      public String getName()
      {
         return null;
      }

      public int getType()
      {
         return UDB_DATABASE;
      }

      public CCMenuAction[] getMenuActions()
      {
         CCMenuAction[] acts = new CCMenuAction[2];
         acts[0] = new MyDropAction();
         acts[1] = new MyAction();
         return acts;
      }

      public boolean isEditable() { return true; }
      public boolean isConfigurable() { return true; }
   }

   /**
    * The class defines the MyDropAction menu items.
    */
   class MyDropAction implements CCMenuAction
   {
      public String getMenuText()
      {
         return "MyDrop";
      }

      public void actionPerformed(ActionEvent e)
      {
         System.out.println( "My drop action performed, object name = " + e.getActionCommand() );
      }
   }

   /**
    * The class defines the menu items to be added to
    * popup menu of the XXXXX-DB2 UDB databases folder.
    */
   class MyDatabasesFolder implements CCObject
   {
      public String getName()
      {
         return "XXXXX - DB2";
      }

      public int getType()
      {
         return UDB_DATABASES_FOLDER;
      }

      public CCMenuAction[] getMenuActions()
      {
         CCMenuAction[] acts = new CCMenuAction[1];
         acts[0] = new MyCreateAction();
         return acts;
      }

      public boolean isEditable() { return true; }
      public boolean isConfigurable() { return true; }
   }

   /**
    * The class defines the menu items to be added to
    * popup menu of all the UDB data type objects.
    */
   class MyDataTypeActions implements CCObject
   {
      public String getName()
      {
         return null;
      }

      public int getType()
      {
         return UDB_USER_DEFINED_DISTINCT_DATATYPE;
      }

      public CCMenuAction[] getMenuActions()
      {
         CCMenuAction[] acts = new CCMenuAction[2];
         acts[0] = new MyDropAction();
         acts[1] = new MyAction();
         return acts;
      }

      public boolean isEditable() { return true; }
      public boolean isConfigurable() { return true; }
   }

   /**
    * The class defines the menu items to be added to
    * popup menu of the XXXXX-DB2 instance and
    * and remove the Alter/Change and Configure menu items.
    */
   class MyDB2 implements CCObject
   {
      public String getName()
      {
         return "XXXXX - DB2";
      }

      public int getType()
      {
         return UDB_INSTANCE;
      }

      public CCMenuAction[] getMenuActions()
      {
         CCMenuAction[] acts = new CCMenuAction[2];
         acts[0] = new MyAlterAction();
         acts[1] = new MyAction();
         return acts;
      }

      public boolean isEditable() { return false; }
      public boolean isConfigurable() { return false; }
   }

   /**
    * The class defines the menu items to be added to
    * popup menu of the XXXXX-DB2-SAMPLE DB Users folder.
    */
   class MyDBUsersFolder implements CCObject
   {
      public String getName()
      {
         return "XXXXX - DB2 - SAMPLE";
      }

      public int getType()
      {
         return UDB_DB_USERS_FOLDER;
      }

      public CCMenuAction[] getMenuActions()
      {
         CCMenuAction[] acts = new CCMenuAction[2];
         acts[0] = new MyAlterAction();
         acts[1] = new MyAction();
         return acts;
      }

      public boolean isEditable() { return true; }
      public boolean isConfigurable() { return true; }
   }

}