windows-kfw-sdk-20060921
[openafs.git] / src / WINNT / kfw / inc / netidmgr / khaction.h
diff --git a/src/WINNT/kfw/inc/netidmgr/khaction.h b/src/WINNT/kfw/inc/netidmgr/khaction.h
new file mode 100644 (file)
index 0000000..34fa35e
--- /dev/null
@@ -0,0 +1,1008 @@
+/*
+ * Copyright (c) 2005 Massachusetts Institute of Technology
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* $Id$ */
+
+#ifndef __KHIMAIRA_ACTION_H
+#define __KHIMAIRA_ACTION_H
+
+/*! \addtogroup khui
+  @{*/
+/*! \defgroup khui_actions Actions
+  @{*/
+
+/*! \brief An action */
+typedef struct tag_khui_action {
+    khm_int32 cmd;            /*!< action identifier */
+    khm_int32 type;           /*!< combination of KHUI_ACTIONTYPE_* */
+    wchar_t * name;           /*!< name for named actions.  NULL if
+                                not named. */
+
+    /* The following fields are only for use by NetIDMgr */
+    khm_int16 ib_normal;      /*!< (internal) normal bitmap (index) (toolbar sized icon) */
+    khm_int16 ib_hot;         /*!< (internal) hot bitmap (index) (toolbar sized icon) */
+    khm_int16 ib_disabled;    /*!< (internal) disabled bitmap (index) (toolbar sized icon) */
+
+    khm_int16 ib_icon;        /*!< (internal) index of small (16x16) icon (for menu) (small icon) */
+    khm_int16 ib_icon_dis;    /*!< (internal) index of disabled (greyed) icon (small icon) */
+
+    khm_int16 is_caption;     /*!< (internal) index of string resource for caption */
+    khm_int16 is_tooltip;     /*!< (internal) same for description / tooltip */
+    khm_int16 ih_topic;       /*!< (internal) help topic */
+
+    /* The following fields are specified for custom actions */
+    wchar_t * caption;        /*!< Caption (localized) (limited by
+                                  KHUI_MAXCCH_SHORT_DESC).  The
+                                  caption is used for representing the
+                                  action in menus and toolbars. */
+    wchar_t * tooltip;        /*!< Tooltip (localized) (limited by
+                                  KHUI_MAXCCH_SHORT_DESC).  If this is
+                                  specified, whenever the user hovers
+                                  over the menu item or toolbar button
+                                  representing the action, the tooltip
+                                  will be displayed either on a
+                                  tooltip window or in the status
+                                  bar. */
+    khm_handle listener;      /*!< Listener of this action.  Should be
+                                  a handle to a message
+                                  subscription. When the action is
+                                  invoked, a message of type
+                                  ::KMSG_ACT and subtype
+                                  ::KMSG_ACT_ACTIVATE will be posted
+                                  to this subscriber. The \a uparam
+                                  parameter of the message will have
+                                  the identifier of the action. */
+    void *    data;           /*!< User data for custom action.  This
+                                  field is not used by the UI library.
+                                  It is reserved for plugins to store
+                                  data that is specific for this
+                                  action.  The data that's passed in
+                                  in the \a userdata parameter to
+                                  khui_action_create() will be stored
+                                  here and can be retrieved by calling
+                                  khui_action_get_data(). */
+    void *    reserved1;      /*!< Reserved. */
+    void *    reserved2;      /*!< Reserved. */
+    void *    reserved3;      /*!< Reserved. */
+
+    /* For all actions */
+    int state;                /*!< current state. combination of
+                                  KHUI_ACTIONSTATE_* */
+} khui_action;
+
+/*! \brief Unknown action type
+
+    Unknown action type.
+ */
+#define KHUI_ACTIONTYPE_NONE    0
+
+/*! \brief A trigger type action
+
+    A trigger action usually triggers some event, which is what pretty
+    much every action does.
+*/
+#define KHUI_ACTIONTYPE_TRIGGER 1
+
+/*! \brief A toggle type action
+
+    A toggle type action typically changes the CHECKED state of the
+    action each time it is invoked.
+ */
+#define KHUI_ACTIONTYPE_TOGGLE  2
+
+/*! \brief The action is enabled
+
+    This is the default if no other state is specified.  Just means
+    not-disabled.
+*/
+#define KHUI_ACTIONSTATE_ENABLED    0
+
+/*! \brief The action is diabled */
+#define KHUI_ACTIONSTATE_DISABLED   1
+
+/*! \brief For toggle type actions, the action is checked */
+#define KHUI_ACTIONSTATE_CHECKED    2
+
+/*! \brief The action is hot
+
+    Typically this means that the user is hovering the pointing device
+    over a UI element representing the action.
+ */
+#define KHUI_ACTIONSTATE_HOT        4
+
+/*! \brief The action has been marked for deletion
+
+    For custom actions, this means that the custom action was deleted.
+    The contents of the custom action fields are no longer valid.
+ */
+#define KHUI_ACTIONSTATE_DELETED    8
+
+#ifdef NOEXPORT
+#define ACTION_SIMPLE(c,cap,des,top) \
+    {c,KHUI_ACTIONTYPE_TRIGGER,NULL,0,0,0,0,0,cap,des,top,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0}
+
+#define ACTION_FULL(cmd,type,name,inormal,ihot,idis,isml,ismld,capt,toolt,topic,state) \
+    {cmd,type,name,inormal,ihot,idis,isml,ismld,capt,toolt,topic,NULL,NULL,NULL,NULL,NULL,NULL,NULL,state}
+
+#define ACTION_SIMPLE_IMAGE(c,inormal, ihot, idis, isml, ismld,cap, des, top) \
+    {c,KHUI_ACTIONTYPE_TRIGGER,NULL,inormal,ihot,idis,isml,ismld,cap,des,top,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0}
+#endif
+
+/*! \brief A reference to an action
+
+    If the \a flags member has the KHUI_ACTIONREF_PACTION bit set,
+    then the action is referenced by the \a p_action member of the
+    union.  Otherwise the identifier for the action is specified by \a
+    action member.
+*/
+typedef struct tag_khui_action_ref {
+    int flags;                  /*!< A combination of KHUI_ACTIONREF_* */
+    union {
+        khm_int32     action;   /*!< The action identifier for the
+                                  action that is being referrred to.
+                                  Only valid if
+                                  ::KHUI_ACTIONREF_PACTION is not set
+                                  in \a flags. */
+        khui_action * p_action; /*!< A pointer to the ::khui_action
+                                  structure that describes the action
+                                  that is being referred to.  Only
+                                  valid if ::KHUI_ACTIONREF_PACTION is
+                                  set. */
+    };
+} khui_action_ref;
+
+/*! \brief A submenu
+
+    There should exist a menu associated with the action that is being
+    referred.  When displaying this action in a menu, the contents of
+    the associated menu will appear as a submenu.
+ */
+#define KHUI_ACTIONREF_SUBMENU      0x01
+
+/*! \brief Separator
+
+    This is not an actual action, but represents a separator between
+    actions.  When displaying this action in a menu or a toolbar, a
+    separating line will be drawn in place of this action.  The \a
+    action and \a p_action members of the structures are unused if
+    this flag is set.
+ */
+#define KHUI_ACTIONREF_SEP          0x02
+
+/*! \brief Action by reference
+
+    The \a p_action member of the structure points to the
+    ::khui_action structure that describes the action.
+ */
+#define KHUI_ACTIONREF_PACTION      0x04
+
+#ifdef NOEXPORT
+/*! \brief Action should be freed
+
+    \note This flag is reserved for internal use in the NetIDMgr
+    application.  Do not use.
+ */
+#define KHUI_ACTIONREF_FREE_PACTION 0x08
+
+/*! \brief Marks the end of an action sequence
+
+    \note THis flag is reserved for internal use in the NetIDMgr
+    application. Do not use.
+ */
+#define KHUI_ACTIONREF_END          0x10
+#endif
+
+/*! \brief The default action
+
+    When this bit is set in an action reference that describes a menu,
+    the menu item will be the default item and will be rendered
+    differently from other menu items.  Only useful when defining
+    context menus.  In general, it is good practice to place the
+    default item at the top of a menu, although the UI library does
+    not enforce this.  This is purely meant as a rendering hint.
+ */
+#define KHUI_ACTIONREF_DEFAULT      0x20
+
+#ifdef NOEXPORT
+#define MENU_ACTION(c) {0,c}
+#define MENU_DEFACTION(c) {KHUI_ACTIONREF_DEFAULT, c}
+#define MENU_SUBMENU(s) {KHUI_ACTIONREF_SUBMENU,s}
+#define MENU_SEP() {KHUI_ACTIONREF_SEP,KHUI_MENU_SEP}
+#define MENU_END() {KHUI_ACTIONREF_END,KHUI_MENU_END}
+#endif
+
+/*! \brief Menu definition
+
+    Use the khui_menu_create(), khui_menu_insert_action(),
+    khui_menu_insert_paction(), khui_menu_get_size(),
+    khui_menu_get_action() functions to create and manipulate custom
+    menus.  Do not manipulate this structure directly as doing so may
+    cause inconsistencies in the UI library.
+*/
+typedef struct tag_khui_menu_def {
+    khm_int32 cmd;          /*!< Action associated with menu */
+    khm_int32 state;        /*!< combination of KHUI_MENUSTATE_* */
+    khm_size  n_items;      /*!< The number of actions in the \a items
+                              list.  If this is a custom menu, the
+                              ::KHUI_MENUSTATE_ALLOCD bit will be set,
+                              and the contents of this field will be
+                              valid.  Otherwise, the contents of this
+                              field is ignored and the list of actions
+                              must be terminated with a
+                              ACTION_LIST_END action. */
+    khm_size  nc_items;     /*!< max number of items in the buffer
+                             alocated for items.  Ignored if
+                             ::KHUI_MENUSTATE_ALLOCD is not set in \a
+                             state. */
+    khui_action_ref *items; /*!< Action list terminated by,
+                             ACTION_LIST_END.  If \a n_items is set
+                             to a value other than -1, the list
+                             doesn't necessarily have to end with a
+                             ACTION_LIST_END.  When constructing a
+                             menu using khui_menu_* functions, they
+                             will set the size of this list in the \a
+                             n_items member, and there will be no
+                             ACTION_LIST_END action to terminate the
+                             list. */
+} khui_menu_def;
+
+#ifdef NOEXPORT
+#define CONSTMENU(c,s,i) {c,s,-1,-1,i}
+#endif
+
+/*! \brief Unspecified menu
+
+    Used when there is no single command associated with the entire
+    menu, such as for ad-hoc context menus.
+ */
+#define KHUI_MENU_NONE -3
+
+/*! \brief Menu end indicator
+
+    For static or constant menus this indicates that this action marks
+    the end of the list of actions which defined the menu.  This is
+    invalid if used in a dynamic menu (a menu with the
+    ::KHUI_MENUSTATE_ALLOCD bit set).
+ */
+#define KHUI_MENU_END -2
+
+/*! \brief Menu separator
+
+    A separator for actions.  When displaying a menu or showing a
+    toolbar based on a menu definition, a separator is rendered as a
+    bar separating the user interface elements for the actions on
+    either side of this.
+*/
+#define KHUI_MENU_SEP -1
+
+/*! \brief Constant menu
+
+    The contents of the menu cannot be modified (individual actions in
+    the menu may be modified, but the order and the contents of the
+    menu itself cannot be modified.
+
+    This is the default if ::KHUI_MENUSTATE_ALLOCD is not specified.
+ */
+#define KHUI_MENUSTATE_CONSTANT 0
+
+/*! \brief Variable menu
+
+    The menu is dnamically allocated.  The list of actions contained
+    in the menu can be modified.
+*/
+#define KHUI_MENUSTATE_ALLOCD   1
+
+#ifdef NOEXPORT
+/* predefined system menu */
+#define KHUI_MENUSTATE_SYSTEM   2
+#endif
+
+#ifdef NOEXPORT
+
+/*! \brief Accelerator definition */
+typedef struct tag_khui_accel_def {
+    int cmd;
+    int mod;
+    int key;
+    int scope;
+} khui_accel_def;
+
+#define KHUI_ACCEL_SCOPE_GLOBAL 0
+
+extern khui_accel_def khui_accel_global[];
+extern int khui_n_accel_global;
+
+extern khui_action khui_actions[];
+extern int khui_n_actions;
+
+extern khui_menu_def khui_all_menus[];
+extern int khui_n_all_menus;
+
+#endif /* NOEXPORT */
+
+/* functions */
+
+/*! \brief Create a new menu
+
+    Creates a new menu.  The returned data structure must be freed by
+    a call to khui_menu_delete().  Custom menus that are created this
+    way are not reference counted or maintained by the UI library.
+    The caller is responsible for calling khui_menu_delete() when the
+    data is no longer needed.
+
+    Specifiying an action in the \a action parameter will associate
+    the menu with the specified action.  In this case, if the action
+    is added to another menu with the ::KHUI_ACTIONREF_SUBMENU flag,
+    this menu will appear as a submenu within that menu.  Only one
+    menu can be associated with any given action.  Custom menus can
+    not be associated with standard actions.
+ */
+KHMEXP khui_menu_def * KHMAPI
+khui_menu_create(khm_int32 action);
+
+/*! \brief Duplicate a menu
+
+    Creates a copy of the specified menu.  The returned data structure
+    must be freed by a call to khui_menu_delete().  Custom menus are
+    not reference counted or maintained by the UI library.  The caller
+    is responsible for calling khui_menu_delete() when the data is no
+    longer needed.
+
+    Note that even if the original menu was associated with an action,
+    the duplicate will not be.  Modifying the duplicate will not
+    modify the original menu.  Only one menu can be associated with an
+    action.
+ */
+KHMEXP khui_menu_def * KHMAPI
+khui_menu_dup(khui_menu_def * src);
+
+/*! \brief Delete a menu
+
+    Deletes a menu created by a call to khui_menu_create() or
+    khui_menu_dup().  This frees up the memory and associated
+    resources used by the menu definition.  The pointer that is passed
+    in will no longer be valid.
+ */
+KHMEXP void KHMAPI
+khui_menu_delete(khui_menu_def * d);
+
+/*! \brief Insert an action into a menu
+
+    The action specified by \a cmd will be inserted in to the menu \a
+    d at index \a idx.
+
+    \param[in] d The menu to insert the action into
+
+    \param[in] idx The index at which to insert the action.  The index
+        is zero based.  If \a idx is (-1) or larger than the largest
+        index in the menu, the item is appended to the menu.
+
+    \param[in] cmd The command representing the action to insert into
+        the menu.  This should be either a standard action, a user
+        action created with khui_action_create(), or certain pseudo
+        actions.  Not all pseudo actions can be placed on a menu.
+
+    \param[in] flags Flags for the action.  This is a combination of
+        KHUI_ACTIONREF_* constants.  Currently, the only constants
+        that are valid for this function are: ::KHUI_ACTIONREF_SEP,
+        ::KHUI_ACTIONREF_SUBMENU, ::KHUI_ACTIONREF_DEFAULT.
+        ::KHUI_ACTIONREF_SEP will be automatically added if the
+        command is ::KHUI_MENU_SEP.
+
+    \note The ::khui_menu_def structure is not thread safe.  Multiple
+        threads modifying the same ::khui_menu_def structure may cause
+        thread safety issues.
+ */
+KHMEXP void KHMAPI
+khui_menu_insert_action(khui_menu_def * d, khm_size idx, khm_int32 cmd, khm_int32 flags);
+
+#define khui_menu_add_action(d,c) khui_menu_insert_action((d),-1,(c),0)
+#pragma deprecated(khui_menu_add_action)
+
+#ifdef NOEXPORT
+
+/*! \brief Insert an action by reference into a menu
+
+    The action specified by \a act will be inserted into the menu \a d
+    at index \a idx.
+
+    \param[in] d The menu to inser the action into.
+
+    \param[in] idx The index at which to insert the action.  The index
+        is zero based.  If the index is (-1) or is larger than the
+        largest index in the menu, then the action is appended to the
+        menu.
+
+    \param[in] act The action to insert.  This is added by reference.
+        It is the callers reponsibility to ensure that the structure
+        pointed to by \a act is available throughout the lifetime of
+        the menu.
+
+    \param[in] flags Flags for the action.  This is a combination of
+        KHUI_ACTIONREF_* constants.  Currently, the only constants
+        that are valid for this function are: ::KHUI_ACTIONREF_SEP,
+        ::KHUI_ACTIONREF_SUBMENU, ::KHUI_ACTIONREF_DEFAULT.  For this
+        function, ::KHUI_ACTIONREF_PACTION will automatically be aded
+        when adding the action.  ::KHUI_ACTIONREF_SEP will be
+        automatically added if the command is ::KHUI_MENU_SEP.
+
+    \note The ::khui_menu_def structure is not thread safe.  Multiple
+        threads modifying the same ::khui_menu_def structure may cause
+        thread safety issues.
+*/
+KHMEXP void KHMAPI
+khui_menu_insert_paction(khui_menu_def * d, khm_size idx, khui_action * act, khm_int32 flags);
+
+#define khui_menu_add_paction(d,a,f) khui_menu_insert_paction((d),-1,(a),(f))
+#pragma deprecated(khui_menu_add_paction)
+
+#endif
+
+/*! \brief Remove an action from a menu
+
+    The action at the specified index will be removed from the menu.
+  */
+KHMEXP void KHMAPI
+khui_menu_remove_action(khui_menu_def * d, khm_size idx);
+
+/*! \brief Get the number of items in the menu
+
+    Note that the count includes menu separators.  The indices of the
+    menu items range from 0 to one less than the value returned by
+    this function.
+ */
+KHMEXP khm_size KHMAPI
+khui_menu_get_size(khui_menu_def * d);
+
+/*! \brief Get the menu item at a specified index
+
+    The returned reference is only valid while the ::khui_menu_def
+    structure is valid.  In addition, the reference becomes invalid if
+    the list of actions in the menu data structure is modified in any
+    way.
+
+    If the specified index is out of bounds, then the function returns
+    NULL.
+
+    \note The ::khui_menu_def structure is not thread safe.  Multiple
+        threads modifying the same ::khui_menu_def structure may cause
+        thread safety issues.
+ */
+KHMEXP khui_action_ref *
+khui_menu_get_action(khui_menu_def * d, khm_size idx);
+
+/*! \brief Action scope identifiers 
+
+    The scope identifier is a value which describes the scope of the
+    cursor context.  See documentation on individual scope identifiers
+    for details.
+
+    The role of the scope identifier is to provide a summary of the
+    current cursor context.  Specifically, these identify several
+    special cases of credential selection, such as the selection of an
+    entire identity, a credential type or a single credential.  If
+    none of these are applicable, then the generic scope identifier
+    ::KHUI_SCOPE_GROUP is set or ::KHUI_SCOPE_NONE if there is nothing
+    selected.
+
+    Note that the scope typically only apply to cursor contexts and
+    not the selection context.  Please see 
+    \ref khui_context "UI Contexts" for more information.
+
+    \see \ref khui_context "UI Contexts"
+*/
+typedef enum tag_khui_scope {
+    KHUI_SCOPE_NONE,
+    /*!< No context.  Nothing is selected. */
+
+    KHUI_SCOPE_IDENT,     
+    /*!< Identity.  The selection is the entire identity specified in
+      the \a identity field of the context. */
+
+    KHUI_SCOPE_CREDTYPE,  
+    /*!< A credentials type.  The selection is an entire credentials
+      type.  If \a identity is non-NULL, then the scope is all the
+      credentials of type \a cred_type which belong to \a identity.
+      Otherwise, the selection is all credentials of type \a
+      cred_type.
+
+      \note The \a identity can be non-NULL even for the case where
+      all credentials of type \a cred_type under \a identity is the
+      same scope as all credentials of type \a cred_type under all
+      identities. */
+
+    KHUI_SCOPE_GROUP,
+    /*!< A grouping of credentials.  The scope is a group of
+      credentials which can not be simplified using one of the other
+      context identifiers.  The \a headers array contains \a n_headers
+      elements describing the outline level that has been selected.
+
+      \see ::khui_header
+      \see \ref khui_context_sel_ctx_grp "KHUI_SCOPE_GROUP description" */
+
+    KHUI_SCOPE_CRED
+    /*!< A single credential.  Only a single credential was
+      selected. The \a cred field of the context specifies the
+      credential.  The \a identity and \a cred_type fields specify the
+      identity and the credential type respectively. */
+} khui_scope;
+
+
+/*! \brief Outline header
+
+    Describes an outline header in the user interface.
+
+    \see \ref khui_context_sel_ctx_grp "KHUI_SCOPE_GROUP description"
+ */
+typedef struct tag_khui_header {
+    khm_int32 attr_id;          /*!< Attribute ID */
+    void *    data;             /*!< Value of attribute */
+    khm_size  cb_data;          /*!< Size of the value */
+} khui_header;
+
+/*! \brief Maximum number of outline headers
+
+    This is the maximum number of fields that the credentials view can
+    be grouped by.
+ */
+#define KHUI_MAX_HEADERS  6
+
+/*! \brief Action context
+
+    Represents the UI context for an action.
+ */
+typedef struct tag_khui_action_context {
+    khm_int32   magic;          /*!< Internal. */
+    khui_scope  scope;          /*!< Context scope.  One of ::khui_scope*/
+    khm_handle  identity;       /*!< Identity */
+    khm_int32   cred_type;      /*!< Credential type ID */
+    khm_handle  cred;           /*!< Credential */
+
+    khui_header headers[KHUI_MAX_HEADERS];
+                                /*!< The ordered set of outline
+                                  headers which define the current
+                                  cursor location. */
+
+    khm_size    n_headers;      /*!< Number of actual headers defined
+                                  above */
+
+    khm_handle  credset;        /*!< Handle to a credential set
+                                  containing the currently selected
+                                  credentials.  When the context is
+                                  obtained through khui_context_get(),
+                                  this credential is returned in a
+                                  sealed state. */
+
+    khm_size    n_sel_creds;    /*!< Number of selected credentials */
+
+    void *      int_buf;        /*!< Internal.  Do not use. */
+    khm_size    int_cb_buf;     /*!< Internal.  Do not use. */
+    khm_size    int_cb_used;    /*!< Internal.  Do not use. */
+
+    void *      vparam;         /*!< Optional data */
+    khm_size    cb_vparam;      /*!< Size of optional data */
+} khui_action_context;
+
+/*! \brief Set the current context
+
+    Changes the UI context to that represented by the parameters to
+    the function.  Note that specifying a valid \a identity or \a cred
+    parameter will result in an automatic hold on the respective
+    object.  The hold will stay until another call to
+    khui_context_set() overwrites the identity or credential handle or
+    a call to khui_context_reset() is made.
+
+    While this API is available, it is only called from the main
+    NetIDMgr application.  Plugins do not have a good reason to call
+    this API directly and should not do so.
+
+    \param[in] scope The new context scope
+
+    \param[in] identity A handle to an identity.  If this is not NULL,
+        then it should be a valid handle to an identity.  Required if
+        \a scope specifies ::KHUI_SCOPE_IDENT.  Optional if \a scope
+        specifies ::KHUI_SCOPE_CREDTYPE.  Ignored otherwise.
+
+    \param[in] cred_type A credentials type.  Specify
+        ::KCDB_CREDTYPE_INVALID if this parameter is not given or not
+        relevant.  Required if \a scope specifies
+        ::KHUI_SCOPE_CREDTYPE.  Ignored otherwise.
+
+    \param[in] cred A handle to a credential.  If this parameter is
+        not NULL it is expected to be a valid handle to a credential.
+        Required if \a scope specifies ::KHUI_SCOPE_CRED.  Ignored
+        otherwise.
+
+    \param[in] headers An array of headers.  The \a n_headers
+        parameter specifies the number of elements in the array.  Set
+        to NULL if not specified.  Required if \a scope specifies
+        ::KHUI_SCOPE_GROUP.
+
+    \param[in] n_headers Number of elements in \a headers.  Must be
+        less than or equal to ::KHUI_MAX_HEADERS.  Required if \a
+        headers is not NULL. Ignored otherwise.
+
+    \param[in] cs_src A handle to a credential set from which the
+        selected credentials will be extracted.  The credentials that
+        are selected must have the ::KCDB_CRED_FLAG_SELECTED flag set.
+
+    \note This function should only be called from the UI thread.
+ */
+KHMEXP void KHMAPI 
+khui_context_set(khui_scope  scope, 
+                 khm_handle  identity, 
+                 khm_int32   cred_type, 
+                 khm_handle  cred,
+                 khui_header *headers,
+                 khm_size    n_headers,
+                 khm_handle  cs_src);
+
+/*! \brief Set the current context
+
+    Changes the UI context to that represented by the parameters to
+    the function.  Note that specifying a valid \a identity or \a cred
+    parameter will result in an automatic hold on the respective
+    object.  The hold will stay until another call to
+    khui_context_set() overwrites the identity or credential handle or
+    a call to khui_context_reset() is made.
+
+    While this API is available, it is only called from the main
+    NetIDMgr application.  Plugins do not have a good reason to call
+    this API directly and should not do so.
+
+    \param[in] scope The new context scope
+
+    \param[in] identity A handle to an identity.  If this is not NULL,
+        then it should be a valid handle to an identity.  Required if
+        \a scope specifies ::KHUI_SCOPE_IDENT.  Optional if \a scope
+        specifies ::KHUI_SCOPE_CREDTYPE.  Ignored otherwise.
+
+    \param[in] cred_type A credentials type.  Specify
+        ::KCDB_CREDTYPE_INVALID if this parameter is not given or not
+        relevant.  Required if \a scope specifies
+        ::KHUI_SCOPE_CREDTYPE.  Ignored otherwise.
+
+    \param[in] cred A handle to a credential.  If this parameter is
+        not NULL it is expected to be a valid handle to a credential.
+        Required if \a scope specifies ::KHUI_SCOPE_CRED.  Ignored
+        otherwise.
+
+    \param[in] headers An array of headers.  The \a n_headers
+        parameter specifies the number of elements in the array.  Set
+        to NULL if not specified.  Required if \a scope specifies
+        ::KHUI_SCOPE_GROUP.
+
+    \param[in] n_headers Number of elements in \a headers.  Must be
+        less than or equal to ::KHUI_MAX_HEADERS.  Required if \a
+        headers is not NULL. Ignored otherwise.
+
+    \param[in] cs_src A handle to a credential set from which the
+        selected credentials will be extracted.  The credentials that
+        are selected must have the ::KCDB_CRED_FLAG_SELECTED flag set.
+
+    \param[in] vparam Optional parameter blob
+
+    \param[in] cb_vparam Size of parameter blob
+
+    \note This function should only be called from the UI thread.
+ */
+KHMEXP void KHMAPI 
+khui_context_set_ex(khui_scope scope, 
+                    khm_handle identity, 
+                    khm_int32 cred_type, 
+                    khm_handle cred,
+                    khui_header *headers,
+                    khm_size n_headers,
+                    khm_handle cs_src,
+                    void * vparam,
+                    khm_size cb_vparam);
+
+/*! \brief Set the current UI context using an existing context
+
+    Copies the context specified in \a ctx into the active UI context.
+
+    \param[in] ctx A pointer to a ::khui_action_context structure that
+        specifies the new UI context.  Cannot be NULL.
+*/
+KHMEXP void KHMAPI
+khui_context_set_indirect(khui_action_context * ctx);
+
+/*! \brief Obtain the current UI context
+
+    The parameter specified by \a ctx will receive the current UI
+    context.  If the context contains an identity or a credential
+    handle, a hold will be obtained on the relevant object.  Use
+    khui_context_release() to release the holds obtained in a prior
+    call to khui_context_get().
+
+    \note The returned context should not be modified prior to calling
+    khui_context_release().
+*/
+KHMEXP void KHMAPI 
+khui_context_get(khui_action_context * ctx);
+
+/*! \brief Create a new UI context
+
+    The created context does not have any relation to the current UI
+    context.  This function is provided for use in situations where an
+    application needs to provide a scope description through a
+    ::khui_action_context structure.
+
+    Once the application is done with the context, it should call
+    khui_context_release() to release the created context.
+ */
+KHMEXP void KHMAPI
+khui_context_create(khui_action_context * ctx,
+                    khui_scope scope,
+                    khm_handle identity,
+                    khm_int32 cred_type,
+                    khm_handle cred);
+
+/*! \brief Release a context obtained using khui_context_get()
+
+    Releases all holds obtained on related objects in a prior call to
+    khui_context_get() and nullifies the context.
+
+    \note The context should not have been modified between calling
+    khui_context_get() and khui_context_release()
+ */
+KHMEXP void KHMAPI 
+khui_context_release(khui_action_context * ctx);
+
+/*! \brief Reset the UI context
+
+    Nullifies the current UI context and releases any holds obtained
+    on objects related to the previous context.
+*/
+KHMEXP void KHMAPI 
+khui_context_reset(void);
+
+/*! \brief Refresh context data
+
+    Setting the UI context involves other side effects such as
+    activation of or disabling certain actions based on the selection.
+    If an operation is performed which may affect the side effects,
+    khui_context_refresh() is called to refresh them.
+
+    An example is when setting the default identity.  The state of the
+    action ::KHUI_ACTION_SET_DEF_ID depends on whether the currently
+    selected identity is the default.  However, if the currently
+    selected identity becomes the default after selection, then
+    khui_context_refresh() should be called to adjust the state of the
+    ::KHUI_ACTION_SET_DEF_ID action.
+ */
+KHMEXP void KHMAPI 
+khui_context_refresh(void);
+
+/*! \brief A filter function that filters for credentials in the cursor context
+
+    This is a function of type ::kcdb_cred_filter_func which can be
+    used to filter for credentials that are included in the cursor
+    context.
+
+    The \a rock parameter should be a pointer to a
+    ::khui_action_context structure which will be used as the filter.
+
+    For example, the following code will extract the cursor context
+    credentials into the credential set \a my_credset based on the UI
+    context \a my context:
+
+    \code
+    kcdb_credset_extract_filtered(my_credset,
+                                  NULL,
+                                  khui_context_cursor_filter,
+                                  (void *) my_context);
+    \endcode
+*/
+KHMEXP khm_int32 KHMAPI
+khui_context_cursor_filter(khm_handle cred,
+                           khm_int32 flags,
+                           void * rock);
+
+/*! \brief Get a string representation of an accelerator
+
+    \param[in] cmd Command for which to obtain the accelerator string for
+    \param[out] buf Buffer to receive the accelerator string
+    \param[in] bufsiz Size of the buffer in bytes.  Note that the size of the
+        buffer must be sufficient to hold at least one character and a
+        NULL terminator.
+
+    \return TRUE if the operation was successful. FALSE otherwise.
+ */
+KHMEXP khm_boolean KHMAPI khui_get_cmd_accel_string(khm_int32 cmd, wchar_t * buf, khm_size bufsiz);
+
+#ifdef NOEXPORT
+/*! \brief Initializes the global accelerator table
+ */
+KHMEXP HACCEL KHMAPI khui_create_global_accel_table(void);
+#endif
+
+/*! \brief Find a menu by id
+
+    Finds the menu that is associated with the specified action.
+ */
+KHMEXP khui_menu_def * KHMAPI khui_find_menu(khm_int32 action);
+
+#ifdef NOEXPORT
+
+/* internal */
+KHMEXP void KHMAPI
+khui_set_main_window(HWND hwnd);
+
+#endif
+
+/*! \brief Trigger an action
+
+    Triggers the specified action using the specified UI context.
+
+    This function does not return until the specified action has been
+    processed.  Many standard actions are asynchronous and they will
+    return before processing will complete.
+
+    Pseudo actions should not be triggered using khui_action_trigger()
+    as they only carry meaning when invoked from specific windows or
+    contexts.
+
+    \param[in] action Action.  Should be one of the standard actions
+        or an action created by khui_action_create()
+
+    \param[in] ctx The UI context to use for the action.  If this is
+        NULL, the action will be triggered under the current UI context.
+ */
+KHMEXP void KHMAPI
+khui_action_trigger(khm_int32 action, khui_action_context * ctx);
+
+/*! \brief Find an action by id
+
+    \note This function should not be used by plugins.  It is there
+        for use by the NetIDMgr application.
+*/
+KHMEXP khui_action * KHMAPI khui_find_action(khm_int32 action);
+
+#ifdef NOEXPORT
+/*! \brief Get the length of the action list */
+KHMEXP size_t KHMAPI khui_action_list_length(khui_action_ref * ref);
+#endif
+
+/*! \brief Create a new action
+
+    \param[in] name Name for a named action.  The name must be unique
+        among all registered actions. (limited by KHUI_MAXCCH_NAME)
+        (Optional. Set to NULL if the action is not a named action.)
+
+    \param[in] caption The localized caption for the action.  This
+        will be shown in menus, toolbars and buttons when the action
+        needs to be represented. (limited by KHUI_MAXCCH_SHORT_DESC)
+        (Required)
+
+    \param[in] tooltip The localized tooltip for the action. (limited
+        by KHUI_MAXCCH_SHORT_DESC) (Optional, set to NULL if there is
+        no tooltip associated with the action)
+
+    \param[in] hsub The subscription that is notified when the action
+        is triggered. (Optional) The subscription can be created with
+        kmq_create_subscription().  The handle will be released when
+        it is no longer needed.  Hence, the caller should not release
+        it.
+
+    \param[in] type The type of the action.  Currently it should be
+        set to either ::KHUI_ACTIONTYPE_TRIGGER or
+        ::KHUI_ACTIONTYPE_TOGGLE.  For ::KHUI_ACTIONTYPE_TOGGLE, the
+        initial state will be unchecked.  Use khui_check_action()
+        function to change the checked state of the action.
+
+    \param[in] userdata A custom value.
+
+    \return The identifier of the new action or zero if the action
+        could not be created.
+
+    \note For named custom actions, the name of the action can not be
+        the same as the name of a configuration node.  See
+        khui_cfg_register_node().
+ */
+KHMEXP khm_int32 KHMAPI
+khui_action_create(const wchar_t * name,
+                   const wchar_t * caption,
+                   const wchar_t * tooltip,
+                   void * userdata,
+                   khm_int32 type,
+                   khm_handle hsub);
+
+/* \brief Delete a custom action
+
+   Deletes a custom action created by a call to khui_action_create().
+   Custom actions should only be deleted when unloading a plugin.
+ */
+KHMEXP void KHMAPI
+khui_action_delete(khm_int32 action);
+
+/*! \brief Get the user data associated with a custom action
+
+    This function returns the user data that was specified when the
+    custom action was created usng khui_action_create().  If the
+    custom action identifier is invalid or if the custom action does
+    not contain any user data, this function will return NULL.
+ */
+KHMEXP void * KHMAPI
+khui_action_get_data(khm_int32 action);
+
+/*! \brief Find an action by name */
+KHMEXP khui_action * KHMAPI khui_find_named_action(const wchar_t * name);
+
+/*! \brief Enables or disables a group of actions
+
+    The group of actions are specified by the menu definition.  All
+    valid action entries in the menu are marked as enabled or disabled
+    according to the value of \a enable.
+ */
+KHMEXP void KHMAPI khui_enable_actions(khui_menu_def * d, khm_boolean enable);
+
+/*! \brief Enables or disables an action
+
+    The action designated by the command \a action will either be enabled
+    or disabled depending on the \a enable parameter.  If \a enable is
+    TRUE then the action is enabled.
+ */
+KHMEXP void KHMAPI khui_enable_action(khm_int32 action, khm_boolean enable);
+
+/*! \brief Check an action in an action group
+
+    Marks the action denoted by \a action as checked and resets the
+    checked bit in all other actions.
+
+    \param[in] d A menu definition.
+
+    \param[in] action A command identifier.  Setting this to -1 will
+        reset the checked bit in all the actions in the menu
+        definition.
+ */
+KHMEXP void KHMAPI khui_check_radio_action(khui_menu_def * d, khm_int32 action);
+
+/*! \brief Check an action
+
+    For toggle typed actions, this sets or resets the check.
+ */
+KHMEXP void KHMAPI khui_check_action(khm_int32 cmd, khm_boolean check);
+
+#ifdef NOEXPORT
+/*!\cond INTERNAL */
+
+/*! \brief Initialize actions
+
+    \note Only called by the NetIDMgr application
+ */
+KHMEXP void KHMAPI khui_init_actions(void);
+
+/*! \brief Exit actions
+
+    \note Only called by the NetIDMgr application
+ */
+KHMEXP void KHMAPI khui_exit_actions(void);
+
+/*! \endcond */
+#endif
+
+/*@}*/
+/*@}*/
+#endif