While going through my recently found backup hard disk containing a lot of source code dating back to 1996 I found a few scripts and programs I thought might be worth mentioning.
- Biztalk 2004 Terminate Suspended Biztalk Messages (code nostalgia)
- Perl P2/91 & P2/94 fathometer data correction script (code nostalgia)
- Perl P190 Navigation Merge script (code nostalgia)
- Hydrogeologic : Extract data from seismic files for use in surfer
- PERL upload and download image to database (code nostalgia)
Op top of the above mentioned I also found this PL/SQL & Javascript tree menu portlet which were written in 2002 and 2003. It is supposed to generate and show the page structure inside Oracle Portal.
First we have the PL/SQL specification for the MENU_PCK_PROVIDER
CREATE OR REPLACE package MENU_PCK_PROVIDER is /** * Provider for menu portlet * * MENU_PCK_PROVIDER * * Version History: * 03 Mar 2003 1.0 Kenneth Thorman Original Version */ MENU_PORTLET constant integer := 1; /** * Get the specification version that this provider adheres to. * * For the initial release, this function will need to return * wwpro_api_provider.API_VERSION_1. The framework calls * this method to determine the way in which it should * interact with the provider. * * @param p_provider_id A unique identifier for the provider. * @returns The API version that this provider adheres to. */ function get_api_version ( p_provider_id in integer ) return integer; /** * This procedure is called when a provider is registered using * the provider registry UI or APIs. This provides the provider * an opportunity to perform provider level initializations. * * @param p_provider_id A unique identifier for the provider. */ procedure register_provider ( p_provider_id in integer ); /** * This procedure is called when a provider is deregistered using * the provider registry UI or APIs. This provides the * providers an opportunity to perform provider level cleanup. * * @param p_provider_id A unique identifier for the provider. */ procedure deregister_provider ( p_provider_id in integer ); /** * Permit the provider to perform Login-based processing before any * portlets are executed. * * @param p_provider_id A unique identifier for the provider. * @param p_browser_cookies The cookies that exist at the current * browser session. * @param p_provider_cookies The cookies that this provider generates. */ procedure do_login ( p_provider_id in integer ,p_browser_cookies in wwpro_api_provider.cookie_table ,p_provider_cookies out wwpro_api_provider.cookie_table ); /** * Get the properties for a portlet. * * This function returns, in a wwpro_api_provider.portlet_record * structure, the details of a specific portlet. * * @param p_provider_id A unique identifier for the provider. * @param p_portlet_id A unique identifier within the provider * domain for the portlet. * @param p_language The language in which to return the * translatable strings of the portlet. * @returns A portlet record (wwpro_api_provider.portlet_record) * that contains the properties of the portlet. */ function get_portlet ( p_provider_id in integer ,p_portlet_id in integer ,p_language in varchar2 ) return wwpro_api_provider.portlet_record; /** * Return a list of portlets. * * This function returns, in a wwpro_api_provider.portlet_table * structure, a list of portlets and their properties that * are available from this provider. * * This function may be called in 2 modes. These 2 modes are * determined by the value of the p_security_level parameter. * * If p_security_level is false this method should generate a * list of portlets implemented by this provider without * respect to any portlet security checks. The framework will * call this method with p_security_level set to false when * it performs a refresh of the portlet repository in order to * get the complete list of portlets for this provider that * will be made available in the portal. * If p_security_level is true this method should generate a * list of portlets in which a security check is performed * for the portlets. Such a call may be performed by the * framework to retrieve the list of portlets to display * on the Add Portlets screen. When generating this * list the currently logged on user may be taken into account * so that only the portlets that the user can access are * returned. * * @param p_provider_id A unique identifier for the provider. * @param p_start_row The starting index of the table in which the * portlets are returned into. * @param p_rowcount The number of portlets returned by this call. * @param p_language The language in which the return the * translatable strings into. * @param p_security_level * @param p_type * @returns A table of portlets in a portlet table structure * (wwpro_api_provider.portlet_table). */ function get_portlet_list ( p_provider_id in integer ,p_start_row in integer ,p_rowcount in integer ,p_language in varchar2 ,p_security_level in boolean ,p_type in integer ) return wwpro_api_provider.portlet_table; /** * Return whether this portlet can be viewed by the current user. * * This method may be called in one of the following 2 situations: * 1 - When a request is made to display the portlet in any of the * show modes. In this case the reference_path field of the * p_portlet_instance record is not null. This is a situation * in which portlet instance security check should be made. * 2 - When the portlet repository is displayed a call is made to * the provider (i.e. is_portlet_runnable) for each portlet * to check whether this portlet should be shown to the user. * This is the situation in which general portlet security * check is performed. In this case the reference_path field * of the p_portlet_instance record is null. * * The portlet may use the context package wwctx_api in the * implementation of the portlet-specific security mechanism for * each situation described above. * * @param p_portlet_instance A portlet instance record that contains * information for the portlet instance. * @returns A boolean value indicating whether the portlet can * be run or not. */ function is_portlet_runnable ( p_portlet_instance in wwpro_api_provider.portlet_instance_record ) return boolean; /** * Register the usage of a portlet on a page. * * The framework will call upon this function when the portlet is * put on a page. This provides the portlet an opportunity to perform * instance-level initialization such as the establishment of defaults * for end-user customization. * * @param p_portlet_instance A portlet instance record that contains * information for the portlet instance. */ procedure register_portlet ( p_portlet_instance in wwpro_api_provider.portlet_instance_record ); /** * Deregister a usage of a portlet on a page. * * The framework will call upon this function when a portlet is * removed from a page. This provides the portlet an opportunity to * perform instance-level cleanup such as the removal of end-user * and default customizations. * * @param p_portlet_instance A portlet instance record that contains * information for the portlet instance. */ procedure deregister_portlet ( p_portlet_instance in wwpro_api_provider.portlet_instance_record ); /** * Show the portlet. * * When called, the portlet should produce the necessary HTML or * XML/XSL to render itself for the selected mode. The page * produced should contain the restricted set of HTML Markup that * would be legal to place within a cell of a HTML Table (TD * element). For example, it should not have the HEAD or BODY * html tags since these will be applied by the Portal framework. * * The content generated by the portlet should use the tags from * the cascading style sheet (CSS). * * The following are the valid show modes for a portlet: * * MODE_SHOW - Shows the portlet's content on a page * MODE_SHOW_ABOUT - Shows the about content of the portlet on * a page. The about content may contain * the portlet's version number, date, etc. * MODE_SHOW_EDIT - Shows the Edit (i.e. Customize) UI * MODE_SHOW_HELP - Shows the Help for the portlet * MODE_SHOW_EDIT_DEFAULTS - Shows the UI to edit the default * customizations for the portlet * MODE_SHOW_DETAILS - Shows the details page for the portlet * MODE_PREVIEW - Shows the preview of the portlet * * @param p_portlet_record A portlet runtime record that contains * information passed by the framework and * is used by the portlet. */ procedure show_portlet ( p_portlet_record in out wwpro_api_provider.portlet_runtime_record ); /** * Copy a portlets customization and defaults from one portlet * to another. * * This procedure is called when a page is copied and the page * contains a portlet implemented by this provider. * It is the responsibility of this API to copy the appropriate * portlet customizations. The register_portlet API is called * prior to this one. * * @param p_copy_portlet_info Source and destination portlet info. */ procedure copy_portlet ( p_copy_portlet_info in wwpro_api_provider.copy_portlet_record ); /** * Describe the parameters that the portlet understands. * * The framework will call upon this function if it needs * descriptive information about the parameters to the portlet. * * @param p_provider_id A unique identifier for the provider. * @param p_portlet_id The id of the portlet. * @param p_language The language in which to return the * translatable strings into. */ function describe_portlet_parameters ( p_provider_id in integer ,p_portlet_id in integer ,p_language in varchar2 ) return wwpro_api_provider.portlet_parameter_table; end MENU_PCK_PROVIDER; /
PL/SQL body for the MENU_PCK_PROVIDER
CREATE OR REPLACE package body MENU_PCK_PROVIDER is /** * Public APIs for the Sample_Provider provider. * * These methods are required by the provider framework in order * to support this provider implementation. */ function get_api_version ( p_provider_id in integer ) return integer is begin return wwpro_api_provider.API_VERSION_1; end get_api_version; procedure register_provider ( p_provider_id in integer ) is begin null; end register_provider; procedure deregister_provider ( p_provider_id in integer ) is begin null; end deregister_provider; procedure do_login ( p_provider_id in integer ,p_browser_cookies in wwpro_api_provider.cookie_table ,p_provider_cookies out wwpro_api_provider.cookie_table ) is begin null; end do_login; function get_portlet ( p_provider_id in integer ,p_portlet_id in integer ,p_language in varchar2 ) return wwpro_api_provider.portlet_record is begin if (p_portlet_id = MENU_PORTLET) then return menu.menu_pck_portlet.get_portlet_info( p_provider_id => p_provider_id ,p_language => p_language ); else raise wwpro_api_provider.PORTLET_NOT_FOUND_EXCEPTION; end if; end get_portlet; function get_portlet_list ( p_provider_id in integer ,p_start_row in integer ,p_rowcount in integer ,p_language in varchar2 ,p_security_level in boolean ,p_type in integer ) return wwpro_api_provider.portlet_table is l_portlet_list wwpro_api_provider.portlet_table; l_cnt number; begin l_cnt := 0; if (menu.menu_pck_portlet.is_runnable( p_provider_id => p_provider_id ,p_reference_path => null) ) then l_cnt := l_cnt + 1; l_portlet_list(l_cnt) := get_portlet( p_provider_id => p_provider_id ,p_portlet_id => MENU_PORTLET ,p_language => p_language ); end if; return l_portlet_list; end get_portlet_list; function is_portlet_runnable ( p_portlet_instance in wwpro_api_provider.portlet_instance_record ) return boolean is begin if (p_portlet_instance.portlet_id = MENU_PORTLET) then return menu.menu_pck_portlet.is_runnable( p_provider_id => p_portlet_instance.provider_id ,p_reference_path => p_portlet_instance.reference_path ); else raise wwpro_api_provider.PORTLET_NOT_FOUND_EXCEPTION; end if; end is_portlet_runnable; procedure register_portlet ( p_portlet_instance in wwpro_api_provider.portlet_instance_record ) is begin if (p_portlet_instance.portlet_id = MENU_PORTLET) then menu.menu_pck_portlet.register(p_portlet_instance); else raise wwpro_api_provider.PORTLET_NOT_FOUND_EXCEPTION; end if; end register_portlet; procedure deregister_portlet ( p_portlet_instance in wwpro_api_provider.portlet_instance_record ) is begin if (p_portlet_instance.portlet_id = MENU_PORTLET) then menu.menu_pck_portlet.deregister(p_portlet_instance); else raise wwpro_api_provider.PORTLET_NOT_FOUND_EXCEPTION; end if; end deregister_portlet; procedure show_portlet ( p_portlet_record in out wwpro_api_provider.portlet_runtime_record ) is begin if (p_portlet_record.portlet_id = MENU_PORTLET) then menu.menu_pck_portlet.show(p_portlet_record); else raise wwpro_api_provider.PORTLET_NOT_FOUND_EXCEPTION; end if; end show_portlet; procedure copy_portlet ( p_copy_portlet_info in wwpro_api_provider.copy_portlet_record ) is begin null; end copy_portlet; function describe_portlet_parameters ( p_provider_id in integer ,p_portlet_id in integer ,p_language in varchar2 ) return wwpro_api_provider.portlet_parameter_table is begin if (p_portlet_id = MENU_PORTLET) then return menu.menu_pck_portlet.describe_parameters( p_provider_id => p_provider_id ,p_language => p_language ); else raise wwpro_api_provider.PORTLET_NOT_FOUND_EXCEPTION; end if; end describe_portlet_parameters; end MENU_PCK_PROVIDER; /
PL/SQL specification for the MENU_PCK_PORTLET
CREATE OR REPLACE package MENU_PCK_PORTLET is /** PACKAGE * * OBJECTIVES.....: Menu portlet * * DESCRIBTION....: Javascript menu portlet which creates a menu based on the * page structure in a pagegroup * * RULES..........: n/a * * DESIGN REQUESTS: n/a * * REVISIONS: * Ver Date Author Description * --------- ---------- --------------- -------------------------- * 1.0 4-Mar-2003 Kenneth Thorman 1. Created this package. * * * */ /** * Get the properties for a portlet. * * This function returns, in a wwpro_api_provider.portlet_record * structure, the details of the Portlet implemented by this * package. * * @param p_provider_id A unique identifier for the provider. * @param p_language The language in which the translatable * strings are returned. * @return A record structure containing the portlet info. * * @exception wwpro_api_provider.PROVIDER_SECURITY_EXCEPTION * if is_runnable returns false. */ function get_portlet_info ( p_provider_id in integer ,p_language in varchar2 ) return wwpro_api_provider.portlet_record; /** * Return whether this portlet can be viewed by the current user. * * This method may be called in one of the following 2 situations: * <P> * 1 - When a request is made to display the portlet in any of the * show modes. In this case the reference_path field of the * p_portlet_instance record is not null. This is a situation * in which portlet instance security check should be made. * </P> * <P> * 2 - When the portlet repository is displayed a call is made to * the provider (i.e. is_portlet_runnable) for each portlet * to check whether this portlet should be shown to the user. * This is the situation in which general portlet security * check is performed. In this case the reference_path field * of the p_portlet_instance record is null. * </P> * <P> * This function simply verifies that the user is logged on - * i.e. it is not a public session. * </P> * * @param p_provider_id A unique identifier for the provider. * @param p_reference_path A unique identifier for a portlet * instance on a page. * @return A boolean value indicating whether the portlet can * be run or not. */ function is_runnable ( p_provider_id in integer ,p_reference_path in varchar2 ) return boolean; /** * Register the usage of a portlet on a page. * * The framework will call upon this function when the portlet is * put on a page. This provides the Portlet an opportunity to perform * instance-level initialization such as the establishment of defaults * for end-user customization. * * @param p_portlet_instance A portlet instance record that contains * information for the portlet instance. */ procedure register ( p_portlet_instance in wwpro_api_provider.portlet_instance_record ); /** * Deregister a usage of a portlet on a page. * * The framework will call upon this function when a portlet is * removed from a page. This provides the Portlet an opportunity to * perform instance-level cleanup such as the removal of end-user * and default customizations. * * @param p_portlet_instance A portlet instance record that contains * information for the portlet instance. */ procedure deregister ( p_portlet_instance in wwpro_api_provider.portlet_instance_record ); /** * Show the Database Services Portlet. * * When called, the portlet should produce the necessary HTML or * XML/XSL to visualize itself for the selected mode. The page * produced should contain the restricted set of HTML Markup that * would be legal to place within a cell of a HTML Table (TD * element). For example, it should not have the HEAD or BODY * html tags since these will be applied by the Portal framework. * <P> * The content generated by the portlet should use the tags from * the cascading style sheet (CSS). * </P> <P> * The following are the valid show modes for a portlet: * </P> <P> * MODE_SHOW - Shows the portlet's content on a page * </P> <P> * MODE_SHOW_ABOUT - Shows the about content of the portlet on * a page. The about content may contain * the portlet's version number, date, etc. * </P> <P> * MODE_SHOW_EDIT - Shows the Edit (i.e. Customize) UI * </P> <P> * MODE_SHOW_HELP - Shows the Help for the portlet * </P> <P> * MODE_SHOW_EDIT_DEFAULTS - Shows the UI to edit the default * customizations for the portlet * </P> <P> * MODE_SHOW_DETAILS - Shows the details page for the portlet * </P> <P> * MODE_PREVIEW - Shows the preview of the portlet * </P> * * @param p_portlet_record A portlet runtime record that contains * information passed by the framework and * is used by the portlet. * * @exception wwpro_api_provider.PROVIDER_SECURITY_EXCEPTION * if is_runnable returns false. * @exception wwpro_api_provider.PORTLET_EXECUTION_EXCEPTION * Raised if any exception is handled during portlet execution * */ procedure show ( p_portlet_record wwpro_api_provider.portlet_runtime_record ); /** * Copy a portlets customization and defaults from one portlet * to another. * * This procedure does nothing! * * @param p_copy_portlet_info Source and destination portlet info. */ procedure copy ( p_copy_portlet_info in wwpro_api_provider.copy_portlet_record ); /** * Describe the parameters that the Portlet understands. * * The framework will call upon this function if it needs * descriptive information about the parameters to the portlet. * * @param p_provider_id A unique identifier for the provider. * @param p_language The language in which to return the * translatable strings into. * @return A record describing the portlet parameters. */ function describe_parameters ( p_provider_id in integer ,p_language in varchar2 ) return wwpro_api_provider.portlet_parameter_table; end MENU_PCK_PORTLET; /
PL/SQL body for the MENU_PCK_PORTLET
CREATE OR REPLACE PACKAGE BODY menu_pck_portlet IS /******************************************************************************* * Portlet specific contants and variables *******************************************************************************/ /** * DOMAIN The domain. * SUBDOMAIN The subdomain used to retreive certain portlet * specific values in portal. * Change to: Should be changed to the name of the portlet package */ DOMAIN CONSTANT VARCHAR2 (30) := util_pck_constants.DOMAIN; SUBDOMAIN CONSTANT VARCHAR2 (32) := 'MENU'; /******************************************************************************* * Constants *******************************************************************************/ /** * @group Preference Store Constants * * These are constants used to store the customizations in the preference store. * * PORTLET_PATH The portlet path. */ PORTLET_PATH CONSTANT VARCHAR2 (256) := DOMAIN || '.' || SUBDOMAIN; /** * @group Customisation actions. * * These constants define the different actions following customisation. * */ ACTION_OK CONSTANT VARCHAR2 (10) := util_pck_constants.ACTION_OK; ACTION_APPLY CONSTANT VARCHAR2 (10) := util_pck_constants.ACTION_APPLY; ACTION_CANCEL CONSTANT VARCHAR2 (10) := util_pck_constants.ACTION_CANCEL; ACTION_CLOSE CONSTANT VARCHAR2 (10) := util_pck_constants.ACTION_CLOSE; /** * @group Logging actions. * * These constants define the different actions for logging. * * LOG_UPDATE The string 'UPDATE' * LOG_INSERT The string 'INSERT' * LOG_FAILED The string 'FAILED' */ LOG_UPDATE CONSTANT VARCHAR2 (10) := util_pck_constants.LOG_UPDATE; LOG_INSERT CONSTANT VARCHAR2 (10) := util_pck_constants.LOG_INSERT; LOG_DELETE CONSTANT VARCHAR2 (10) := util_pck_constants.LOG_DELETE; LOG_FAILED CONSTANT VARCHAR2 (10) := util_pck_constants.LOG_FAILED; /******************************************************************************* * Variables *******************************************************************************/ type Tprefs IS VARRAY(26) OF VARCHAR2(250); prefNames Tprefs:= Tprefs('portlet_title', 'page_group_id', 'start_page_id', 'icon_page_path', 'target', 'empty_img', 'vertical_line', 'root_normal', 'root_selected', 'root_opened', 'root_selected_opened', 'node_normal', 'node_selected', 'node_opened', 'node_selected_opened', 'leaf_normal', 'leaf_selected', 'leaf_opened', 'leaf_selected_opened', 'junc_leaf', 'junc_last_leaf', 'junc_closed_node', 'junc_last_closed_node', 'junc_opened_node', 'junc_last_opened_node'); prefValues Tprefs := Tprefs(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); /******************************************************************************* * Forward declarations *******************************************************************************/ PROCEDURE save_prefs (p_portlet_record IN wwpro_api_provider.portlet_runtime_record, p_action in varchar2); PROCEDURE show_main ( p_portlet_record IN wwpro_api_provider.portlet_runtime_record, p_portlet IN wwpro_api_provider.portlet_record ); PROCEDURE show_edit ( p_portlet_record IN wwpro_api_provider.portlet_runtime_record ); procedure get_user_preference ( p_portlet_record in wwpro_api_provider.portlet_runtime_record ); procedure get_default_preference ( p_portlet_record in wwpro_api_provider.portlet_runtime_record ); function get_pref_value ( p_name in varchar2 ) return varchar2; FUNCTION get_nls_string ( p_name IN VARCHAR2, p_language IN VARCHAR2 ) RETURN VARCHAR2; /******************************************************************************* * Main programming logic *******************************************************************************/ /** * Get the properties for a portlet. * * This function returns, in a wwpro_api_provider.portlet_record * structure, the details of the Portlet implemented by this * package. * */ FUNCTION get_portlet_info ( p_provider_id IN INTEGER, p_language IN VARCHAR2 ) RETURN wwpro_api_provider.portlet_record IS l_portlet wwpro_api_provider.portlet_record; BEGIN l_portlet.id := menu_pck_provider.menu_portlet; l_portlet.provider_id := p_provider_id; l_portlet.NAME := SUBDOMAIN; l_portlet.TIMEOUT := 10; l_portlet.timeout_msg := NULL; l_portlet.LANGUAGE := p_language; l_portlet.has_show_edit := wwctx_api.is_logged_on; l_portlet.has_show_edit_defaults := TRUE; l_portlet.has_show_preview := TRUE; l_portlet.preference_store_path := DOMAIN || '.' || SUBDOMAIN; l_portlet.created_on := TO_DATE ('12112002', 'DDMMYYYY'); l_portlet.created_by := 'kennethD.O.TthormanA.TgmailD.O.TgmailD.O.Tcom'; l_portlet.last_updated_on := TO_DATE ('12112002', 'DDMMYYYY'); l_portlet.last_updated_by := 'kennethD.O.TthormanA.TgmailD.O.TgmailD.O.Tcom'; -- -- New Portal 2 values -- l_portlet.api_version := wwpro_api_provider.api_version_1; l_portlet.content_type := wwpro_api_provider.content_type_html; -- -- Currently not used by the framework -- l_portlet.implementation_style := NULL; l_portlet.implementation_owner := NULL; l_portlet.implementation_name := NULL; -- -- Make sure everything else is set first -- The title and description returned should be responsive to the language parameter -- l_portlet.title := get_nls_string ('title', p_language); l_portlet.description := get_nls_string ('description', p_language); RETURN l_portlet; END get_portlet_info; /** * Show the Portlet. * * When called, the portlet should produce the necessary HTML or * XML/XSL to visualize itself for the selected mode. The page * produced should contain the restricted set of HTML Markup that * would be legal to place within a cell of a HTML Table (TD * element). For example, it should not have the HEAD or BODY * html tags since these will be applied by the Portal framework. * * The following are the valid show modes for a portlet: * * MODE_SHOW Shows the portlet's content on a page * * MODE_SHOW_ABOUT Shows the about content of the portlet on a page. The * about content may contain the portlet's version number, date, etc. * * MODE_SHOW_EDIT Shows the Edit (i.e. Customize) UI * * MODE_SHOW_HELP Shows the Help for the portlet * * MODE_SHOW_EDIT_DEFAULTS Shows the UI to edit the default customizations for the portlet * * MODE_SHOW_DETAILS Shows the details page for the portlet * * MODE_PREVIEW Shows the preview of the portlet */ PROCEDURE show ( p_portlet_record wwpro_api_provider.portlet_runtime_record ) IS l_portlet wwpro_api_provider.portlet_record; l_action varchar2(50); BEGIN -- -- Perform a security check -- IF (NOT is_runnable ( p_provider_id => p_portlet_record.provider_id, p_reference_path => p_portlet_record.reference_path ) ) THEN wwerr_api_error.ADD (DOMAIN, SUBDOMAIN, 'securityerr', SUBDOMAIN||'.show'); RAISE wwpro_api_provider.portlet_security_exception; END IF; l_portlet := get_portlet_info (p_portlet_record.provider_id, p_portlet_record.LANGUAGE); -- -- P_MODE = SHOW -- IF (p_portlet_record.exec_mode = wwpro_api_provider.mode_show) THEN show_main (p_portlet_record, l_portlet); -- -- P_MODE = EDIT or EDIT DEFAULTS -- ELSIF (p_portlet_record.exec_mode = wwpro_api_provider.mode_show_edit) OR (p_portlet_record.exec_mode = wwpro_api_provider.mode_show_edit_defaults) THEN l_action := upper(util_param.GETPARAMETERVALUE('p_action')); if l_action in (ACTION_OK,ACTION_APPLY,ACTION_CANCEL) then save_prefs(p_portlet_record,l_action); else show_edit(p_portlet_record); end if; -- -- Generic display -- ELSE util_pck_show.show (DOMAIN, SUBDOMAIN, p_portlet_record, l_portlet); END IF; EXCEPTION WHEN OTHERS THEN util_pck_show.show_error; END show; /** * This displays the portlet for a normal show mode. * * This procedure renders the 'normal' show mode of the portlet. * * @exception wwpro_api_provider.PORTLET_EXECUTION_EXCEPTION * This is raised as a response to any exception. */ PROCEDURE show_main ( p_portlet_record IN wwpro_api_provider.portlet_runtime_record, p_portlet IN wwpro_api_provider.portlet_record ) IS v_siteid number; v_pageid number; v_siteid_pageid varchar2(100); v_commapos number; v_substrlen number; v_startpos number; v_page_group_id varchar2(100); v_start_page_id varchar2(100); BEGIN -- -- Retrieve the user customizations. -- get_user_preference(p_portlet_record); IF (p_portlet_record.has_title_region) THEN -- -- Draw the portlet header and specify what links are available -- from that header (i.e. details, customize, help, and about). -- The has_title property is set at the page region level. -- wwui_api_portlet.draw_portlet_header ( p_provider_id => p_portlet_record.provider_id, p_portlet_id => p_portlet_record.portlet_id, p_title => get_pref_value('portlet_title'), p_has_details => FALSE, p_has_edit => TRUE, p_has_help => TRUE, p_has_about => TRUE, p_show_collapse => TRUE, p_show_remove => FALSE, p_is_collapsed => p_portlet_record.is_collapsed, p_referencepath => p_portlet_record.reference_path, p_back_url => p_portlet_record.page_url ); END IF; -- -- Draw the portlet borders. -- The has_border property is set at the page region level. -- wwui_api_portlet.open_portlet (p_portlet_record.has_border); -- -- Is the portlet collapsed? If it is open then render contents -- else do nothing -- IF NOT p_portlet_record.is_collapsed THEN -- -- Get siteid and pageid so we can establish the menu root -- this is default setting but if the user specifies a pageid and siteid -- during customization then it overirdes this default setting -- (I could not find an API which returns the page the user is currently -- visiting and since it is present in the p_portlet_record.page_url, then -- grab it from here. It is not however a nice and clean solution :-( ) -- v_startpos := instr(p_portlet_record.page_url,'_pageid=')+8; v_substrlen := ((instr(p_portlet_record.page_url,'&')) - v_startpos); v_siteid_pageid := substr(p_portlet_record.page_url,v_startpos,v_substrlen); -- htp.p('v_siteid_pageid='||v_siteid_pageid||'<br>'); -- -- Seperate siteid from pageid -- v_commapos := instr(v_siteid_pageid, ','); v_siteid := to_number(substr(v_siteid_pageid, 1, v_commapos-1)); v_pageid := to_number(substr(v_siteid_pageid, v_commapos+1, length(v_siteid_pageid))); -- htp.p('siteid:'||v_siteid||', pageid:'||v_pageid||'<br>'); -- -- Print reference to javascript file which is responsible for the menu -- generation -- v_page_group_id := get_pref_value('page_group_id'); if lower(v_page_group_id) like 'missing%' then v_page_group_id := v_siteid; end if; v_start_page_id := get_pref_value('start_page_id'); if lower(v_start_page_id) like 'missing%' then v_start_page_id := 1; end if; htp.p('<style>'); htp.p('.t0i {font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif;font-size: 11px;color: #000000;background-color:;text-decoration: none;}'); htp.p('.t0im {border:0px;width:19px;height:16px;}'); htp.p('</style>'); htp.p('<script language="JavaScript" src="/pls/portal/menu.navigation_menu.show_menu?p_page_group='||v_page_group_id||'&p_start_page_id='||v_start_page_id||'&p_current_page_id='||v_pageid||'&p_language='||wwctx_api.get_nls_language||'"></script>'); htp.p('<BODY leftmargin="15" marginheight="2" marginwidth="15" topmargin="2">'); htp.p('<script language="JavaScript" src="/pls/portal/docs/2095.js"></script>'); htp.p('<script language="JavaScript" src="/pls/portal/menu.navigation_menu.tree_tpl?p_target='||get_pref_value('target')||'&p_empty_img='||get_pref_value('empty_img')||'&p_vertical_line='||get_pref_value('vertical_line')|| '&p_root_normal='||get_pref_value('root_normal')||'&p_root_selected='||get_pref_value('root_selected')||'&p_root_opened='||get_pref_value('root_opened')||'&p_root_selected_opened='||get_pref_value('root_selected_opened')|| '&p_node_normal='||get_pref_value('node_normal')||'&p_node_selected='||get_pref_value('node_selected')||'&p_node_opened='||get_pref_value('node_opened')||'&p_node_selected_opened='||get_pref_value('node_selected_opened')|| '&p_leaf_normal='||get_pref_value('leaf_normal')||'&p_leaf_selected='||get_pref_value('leaf_selected')||'&p_leaf_opened='||get_pref_value('leaf_opened')||'&p_leaf_selected_opened='||get_pref_value('leaf_selected_opened')|| '&p_junc_leaf='||get_pref_value('junc_leaf')||'&p_junc_last_leaf='||get_pref_value('junc_last_leaf')||'&p_junc_closed_node='||get_pref_value('junc_closed_node')|| '&p_junc_last_closed_node='||get_pref_value('junc_last_closed_node')||'&p_junc_opened_node='||get_pref_value('junc_opened_node')|| '&p_junc_last_opened_node='||get_pref_value('junc_last_opened_node')||'"></script>'); htp.p('<script language="JavaScript">new tree (TREE_ITEMS, tree_tpl);</script>'); END IF; -- -- If the portlet has borders then close them -- IF (p_portlet_record.has_border) THEN wwui_api_portlet.close_portlet; END IF; EXCEPTION WHEN OTHERS THEN util_pck_show.show_error; END show_main; /** * Show the 'Edit' mode for the portlet. * * This procedure displays the 'edit' or customise mode of show. * * p_portlet_record A record containing the portlet details. */ PROCEDURE show_edit ( p_portlet_record IN wwpro_api_provider.portlet_runtime_record ) IS l_text_prompt_string VARCHAR2 (30); l_title_prompt_string VARCHAR2 (30); l_button_list wwui_api_portlet_dialog.button_list; v_icon_page_path varchar2(300); cursor c_img_lov (p_parent_path in varchar2) is select filename, name from wwdoc_document$ doc, wwdav$path dav where dav.DOC_ID = doc.DAV_ID and dav.PARENTPATH = p_parent_path and (upper(name) like '%.GIF' or upper(name) like '%.JPG'); BEGIN -- -- This procedure renders the customisation and edit default screens. -- -- -- Depending on whether we are cutomising or showin edit defaults -- set some values. -- if (p_portlet_record.exec_mode = wwpro_api_provider.MODE_SHOW_EDIT) then get_user_preference(p_portlet_record); else get_default_preference(p_portlet_record); end if; htp.p ('<script>function Save(pAction) {'); htp.p (' document.services.p_action.value = pAction;'); htp.p (' document.services.submit();'); htp.p ('}</script>'); l_button_list(1) := portal.wwui_api_portlet_dialog.create_apply_button( 'Save('''||ACTION_APPLY||''')',p_portlet_record.language); l_button_list(2) := portal.wwui_api_portlet_dialog.create_ok_button( 'Save('''||ACTION_OK||''')',p_portlet_record.language); l_button_list(3) := portal.wwui_api_portlet_dialog.create_close_button( 'Save('''||ACTION_CANCEL||''')',p_portlet_record.language); wwui_api_portlet_dialog.open_dialog ( p_title => get_nls_string('customize',p_portlet_record.language) ,p_dialog_image => null ,p_help_url => null ,p_subheader_text => null ,p_help_text => null ,p_buttons => l_button_list ,p_path_text => null ); -- -- This procedure call creates the <FORM> tags with a set of -- standard parameters. Using this procedure makes the -- customisation page work through the pl/sql http adapter. -- htp.p('<table align="center">'); wwpro_api_adapter.open_form(p_formattr => 'NAME="services"', p_prr => p_portlet_record); for x in prefNames.first .. prefnames.last loop if prefnames(x) in ('portlet_title','page_group_id','start_page_id','target','icon_page_path') then htp.p('<tr><td>'||wwui_api_portlet.portlet_heading(get_nls_string('txt'||prefnames(x),p_portlet_record.language),1)||'</td><td><input type="TEXT" name="'||prefnames(x)||'" value="'||prefValues(x)||'"></td></tr>'); end if; end loop; if get_pref_value('icon_page_path') is null then htp.p('<tr><td colspan="2">'||wwui_api_portlet.portlet_text(get_nls_string('txticon_location',p_portlet_record.language),1)||'</td></tr>'); else for x in prefNames.first .. prefnames.last loop if prefnames(x) in ('empty_img','vertical_line','root_normal','root_selected','root_opened','root_selected_opened','node_normal','node_selected','node_opened','node_selected_opened','leaf_normal','leaf_selected','leaf_opened','leaf_selected_opened','junc_leaf','junc_last_leaf','junc_closed_node','junc_last_closed_node','junc_opened_node','junc_last_opened_node') then htp.p('<tr><td>'||wwui_api_portlet.portlet_heading(get_nls_string('txt'||prefnames(x),p_portlet_record.language),1)||'</td><td><select name="'||prefnames(x)||'">'); for a in c_img_lov(get_pref_value('icon_page_path')) loop htp.p('<option value="'||a.filename||'">'||a.name); end loop; htp.p('</td></tr>'); end if; end loop; end if; htp.p('</table>'); HTP.formclose; wwui_api_portlet_dialog.close_dialog; END show_edit; /** * Save the Customisations * * If p_action is 'OK' or 'APPLY' then the customisations are stored * in the preference store. Then redirect as appropriate. * * @param p_string The user text to be saved. * @param p_title The portlet title to be saved. * @param p_action One of 'OK', 'APPLY' or 'CANCEL'. * @param p_level Either SYSTEM or USER level. SYSTEM level * is for 'edit defaults' functionality. * @param p_portlet_record A record containing the portlet details. * * @exception INVALID_TEXT_EXCEPTION if text contains illegal characters. */ procedure save_prefs ( p_portlet_record in wwpro_api_provider.portlet_runtime_record, p_action in varchar2 ) is l_user varchar2(100) := wwctx_api.get_user; p_level varchar2(1); p_level_name varchar2(300); l_id number; l_names owa.vc_arr; l_values owa.vc_arr; begin -- -- If the OK button or APPLY button is pressed then we need to: -- - Load any preferences that already exist -- - Validate the string is valid -- - For both the portlet title and customisation text: -- - If the preference doesn't alread exist create a string and -- populate the preference -- - If it does exist then update is with the new string -- - and finally re-direct to the appropriate page -- if p_action in (ACTION_OK, ACTION_APPLY) then -- -- Load the last preferences created by the user, if any, in order -- to use the same preference store ids. If no preferences have -- been created yet, they will be created. -- if (p_portlet_record.exec_mode = wwpro_api_provider.mode_show_edit_defaults) then get_default_preference (p_portlet_record); p_level := WWPRE_API_VALUE.SYSTEM_LEVEL_TYPE; p_level_name := NULL; else get_user_preference (p_portlet_record); p_level := WWPRE_API_VALUE.USER_LEVEL_TYPE; p_level_name := l_user; end if; wwpro_api_parameters.retrieve(l_names, l_values); for w in 1..l_names.count loop --Web parameters for p in prefnames.first .. prefnames.last loop -- Preferences -- -- If the webparameter has the same name as the preference parameter then a match -- if upper(prefNames(p)) = upper(l_names(w)) then --htp.p(l_names(w)||':'||l_values(w)||'<br>'); --htp.p(prefnames(p)||':'||prefvalues(p)||'<br>'); -- -- If there is no existing value the make a new one -- if prefValues(p) is NULL then -- -- Use the nls add_string api to create a new nls string in -- nls storage. -- l_id := wwnls_api.add_string( p_domain => DOMAIN, p_sub_domain => SUBDOMAIN, p_name => prefNames(p), p_language => p_portlet_record.language, p_text => l_values(w) ); htp.p(l_id); -- -- Store the id of the nls string created in the preference -- store in order to be able to locate the nls string. -- wwpre_api_value.set_value_as_number( p_path => PORTLET_PATH || p_portlet_record.reference_path, p_name => prefNames(p), p_level_type => p_level, p_level_name => p_level_name, p_value => l_id ); -- -- string exists in at least one language so update it -- else -- -- Use the nls set_string api to modify the existing nls string -- in nls storage. If the string exists in a different -- languages this call will create a new string in the new -- language. If the string exists only in the current -- language this API will overwrite the existing string -- with the new one entered by the user. -- --htp.p(wwnls_api.get_id (DOMAIN,SUBDOMAIN,prefNames(p),p_portlet_record.language)); htp.p(PORTLET_PATH || p_portlet_record.reference_path||'.'||prefNames(p)||wwpre_api_value.get_value_as_number ( p_path => PORTLET_PATH || p_portlet_record.reference_path, p_name => prefNames(p), p_level_type => p_level, p_level_name => p_level_name)||prefnames(p)||':'||prefvalues(p)||'<br>'); /* wwnls_api.set_string ( p_id => wwpre_api_value.get_value_as_number ( p_path => PORTLET_PATH || p_portlet_record.reference_path, p_name => prefNames(p), p_level_type => p_level, p_level_name => p_level_name), p_language => p_portlet_record.language, p_text => l_values(w) );*/ end if; end if; end loop; end loop; -- -- Now we have saved the preferences we need to re-direct -- /*if p_action = ACTION_OK then owa_util.redirect_url(curl=>p_portlet_record.back_page_url); elsif p_action = ACTION_APPLY then owa_util.redirect_url(curl=>p_portlet_record.page_url); end if;*/ end if; exception when others then util_pck_show.SHOW_ERROR; end save_prefs; /** * Generalized Load the system level default values. * * This procedure loads the default preferences from the preference * store. The default preferences are associated with the portlet * instance. If no preferences have been set for the portlet * instance it returns the system default preferences. The system * default preferences are some nls strings used by this portlet. * The preferences are save in the ptl properties runtime array * * @param p_language The language being used. * @param p_reference_path This is used to store the preferences. * * @return A record containing the preferences. */ procedure get_default_preference ( p_portlet_record in wwpro_api_provider.portlet_runtime_record ) is v_temp_nls_string_id number; begin -- Since we have to do all the following checks fo each and every -- preference we might have for a portlet it is easier to do it -- in a loop. FOR x IN prefNames.FIRST .. prefNames.LAST LOOP IF prefValues(x) IS NULL THEN -- Try to find any object values for this portlet in the preference store v_temp_nls_string_id := wwpre_api_value.get_value_as_number( p_path => PORTLET_PATH || p_portlet_record.reference_path, p_name => prefNames(x), p_level_type => wwpre_api_value.SYSTEM_LEVEL_TYPE ); if v_temp_nls_string_id is null then -- No object values for this portlet was found. -- Load the class values (installation default) prefValues(x) := get_nls_string (prefNames(x), p_portlet_record.language); else prefValues(x) := wwnls_api.get_string(v_temp_nls_string_id, p_portlet_record.language); end if; end if; END LOOP; end get_default_preference; /** * Retrieve the user customized string displayed in the portlet. * * Each user can store their customized strings for each portlet instance * in each language. * * @param p_language The language being used. * @param p_reference_path This is used to store the preferences. * * @return A record containing the preferences. */ procedure get_user_preference ( p_portlet_record in wwpro_api_provider.portlet_runtime_record ) is v_temp_nls_string_id number; v_need_object_or_class_values boolean := FALSE; begin -- Since we have to do all the following checks fo each and every -- preference we might have for a portlet it is easier to do it -- in a loop. FOR x IN prefNames.FIRST .. prefNames.LAST LOOP -- Try to find any object user customized values for this portlet in the -- preference store v_temp_nls_string_id := wwpre_api_value.get_value_as_number( p_path => PORTLET_PATH || p_portlet_record.reference_path, p_name => prefNames(x), p_level_type => wwpre_api_value.USER_LEVEL_TYPE, p_level_name => wwctx_api.get_user ); -- If the value returned above is null it is an indication that the -- the user has not created a object user customized string yet. if v_temp_nls_string_id is null then v_need_object_or_class_values := TRUE; prefValues(x) := NULL; else -- Now load it indirectly from the NLS storage into ptl runtime properties prefValues(x) := wwnls_api.get_string(v_temp_nls_string_id, p_portlet_record.language); end if; END LOOP; if v_need_object_or_class_values then get_default_preference(p_portlet_record); end if; end get_user_preference; /** * Register the usage of a portlet on a page. * * The framework will call upon this function when the portlet is * put on a page. This provides the Portlet an opportunity to perform * instance-level initialization such as the establishment of defaults * for end-user customization. * */ PROCEDURE register ( p_portlet_instance IN wwpro_api_provider.portlet_instance_record ) IS BEGIN -- -- Create a path for the portlet instance. This is used to create -- the preferences for the portlet instance in the preference store. -- wwpre_api_name.create_path (p_path => PORTLET_PATH || p_portlet_instance.reference_path); -- -- Create the names to store the portlet preferences. -- FOR x IN prefNames.FIRST .. prefNames.LAST LOOP wwpre_api_name.create_name ( p_path => PORTLET_PATH || p_portlet_instance.reference_path, p_name => prefNames(x), p_description => '', p_type_name => 'NLSID', p_language => wwctx_api.get_nls_language ); end loop; END register; /******************************************************************************* * Utility and helper subroutines *******************************************************************************/ /** * Get value function */ function get_pref_value ( p_name in varchar2 ) return varchar2 is begin for a in prefNames.first .. prefNames.last loop if lower(prefNames(a)) = lower(p_name) then return prefValues(a); end if; end loop; end; /** * Shortcut/wrapper for portal function wwnls_api.get_string */ FUNCTION get_nls_string ( p_name IN VARCHAR2, p_language IN VARCHAR2 ) RETURN VARCHAR2 IS v_temp varchar2(1000); BEGIN v_temp:= wwnls_api.get_string (DOMAIN, SUBDOMAIN, p_name, p_language); if v_temp like 'Missing%' then return NULL; else RETURN wwnls_api.get_string (DOMAIN, SUBDOMAIN, p_name, p_language); end if; END; /******************************************************************************* * Portal generic utility and helper subroutines (no custom logic) *******************************************************************************/ /** * Return whether this portlet can be viewed by the current user. * * This method may be called in one of the following 2 situations: * 1 - When a request is made to display the portlet in any of the * show modes. In this case the reference_path field of the * p_portlet_instance record is not null. This is a situation * in which portlet instance security check should be made. * 2 - When the portlet repository is displayed a call is made to * the provider (i.e. is_portlet_runnable) for each portlet * to check whether this portlet should be shown to the user. * This is the situation in which general portlet security * check is performed. In this case the reference_path field * of the p_portlet_instance record is null. * * This function simply verifies that the user is logged on - * i.e. it is not a public session. */ FUNCTION is_runnable ( p_provider_id IN INTEGER, p_reference_path IN VARCHAR2 ) RETURN BOOLEAN IS BEGIN -- -- Portlet security check. It allows the portlet to be visible -- if the user is logged on, i.e. the current session is not a -- public session. -- RETURN wwctx_api.is_logged_on; END is_runnable; /** * Deregister a usage of a portlet on a page. * * The framework will call upon this function when a portlet is * removed from a page. This provides the Portlet an opportunity to * perform instance-level cleanup such as the removal of end-user * and default customizations. * */ PROCEDURE deregister ( p_portlet_instance IN wwpro_api_provider.portlet_instance_record ) IS BEGIN -- -- Delete the path used by the portlet instance. This will delete -- all the names and all the values associated with the path. -- wwpre_api_name.delete_path (p_path => PORTLET_PATH || p_portlet_instance.reference_path); EXCEPTION WHEN OTHERS THEN RAISE; END deregister; /** * Copy a portlets customization and defaults from one portlet * to another. * * This procedure does nothing! * */ PROCEDURE copy ( p_copy_portlet_info IN wwpro_api_provider.copy_portlet_record ) IS BEGIN NULL; END copy; /** * Describe the parameters that the Portlet understands. * * The framework will call upon this function if it needs * descriptive information about the parameters to the portlet. * */ FUNCTION describe_parameters ( p_provider_id IN INTEGER, p_language IN VARCHAR2 ) RETURN wwpro_api_provider.portlet_parameter_table IS l_params_tab wwpro_api_provider.portlet_parameter_table; BEGIN RETURN l_params_tab; END describe_parameters; END menu_pck_portlet; /
PL/SQL specification for the NAVIGATION_MENU
CREATE OR REPLACE package NAVIGATION_MENU ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- is -- procedure show_menu( p_page_group in number default null , p_start_page_id in number default 1 -- 1 = Root Page , p_current_page_id in number default null -- highlight current page in the menu , p_language in varchar2 default 'us' ); -- procedure tree_tpl( p_target in varchar2 default '_main', p_empty_img in varchar2 default '1999.gif', p_vertical_line in varchar2 default '2009.gif', p_root_normal in varchar2 default '1998.gif', p_root_selected in varchar2 default '1998.gif', p_root_opened in varchar2 default '1998.gif', p_root_selected_opened in varchar2 default '1998.gif', p_node_normal in varchar2 default '2000.gif', p_node_selected in varchar2 default '2000.gif', p_node_opened in varchar2 default '2001.gif', p_node_selected_opened in varchar2 default '2001.gif', p_leaf_normal in varchar2 default '2006.gif', p_leaf_selected in varchar2 default '2006.gif', p_leaf_opened in varchar2 default '2006.gif', p_leaf_selected_opened in varchar2 default '2006.gif', p_junc_leaf in varchar2 default '2003.gif', p_junc_last_leaf in varchar2 default '2002.gif', p_junc_closed_node in varchar2 default '2008.gif', p_junc_last_closed_node in varchar2 default '2007.gif', p_junc_opened_node in varchar2 default '2005.gif', p_junc_last_opened_node in varchar2 default '2004.gif' ); -- end NAVIGATION_MENU; /
PL/SQL bodyfor the NAVIGATION_MENU
CREATE OR REPLACE package body NAVIGATION_MENU ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- is -- procedure show_menu( p_page_group in number default null , p_start_page_id in number default 1 -- 1 = Root Page , p_current_page_id in number default null -- highlight current page in the menu , p_language in varchar2 default 'us') is -- TYPE PageCurTyp IS REF CURSOR; -- define weak REF CURSOR type page_cv PageCurTyp; -- declare cursor variable l_page_group number; l_page_id number; l_level_old number; -- Previous Level to check for change of level l_level number; -- Current Level l_parent_id number; -- Parent Page ID l_display_name varchar2(300); -- Display Name of Page l_stmnt varchar2(1000); -- Statement for Dynamic SQL l_temp varchar2(300); -- Temporary variable l_counter number; -- Temporary counter v_commapos number; v_baseurl varchar(300); v_pageurl varchar(3000); v_dadurl varchar(300); v_dadpos number; v_temp_row_counter number; v_row_counter number; BEGIN l_stmnt := 'select level '|| ', f.siteid page_group ' || ', f.id id ' || ', f.title display_name ' || ', f.parentid parent_id ' || 'from portal.wwv_user_corners f ' || 'where f.siteid = :b_page_group ' || 'and f.type = 1 ' || -- Not Tabs 'and f.active = 1 ' || -- Only active version 'and f.language = :b_language ' || -- In the users language 'start with f.id = :b_page_id '|| 'connect by prior f.id = f.parentid '|| 'and prior f.siteid = f.siteid ' || 'order siblings by f.title'; -- -- If no Page Group given, take the current Page Group if p_page_group is null then l_temp := portal.wwpro_api_parameters.get_value( '_pageid', 'a'); l_page_group := to_number(substr(l_temp,1,instr(l_temp,',')-1)); else l_page_group := p_page_group; end if; -- -- Get common denominators for the urls to the portal pages -- v_pageurl:=portal.wwpob_page_util.get_page_url( 1, l_page_group); v_commapos := instr(v_pageurl,','); v_baseurl:=substr(v_pageurl,1,v_commapos); v_dadpos:=instr(v_pageurl,'&_dad'); v_dadurl:=substr(v_pageurl,v_dadpos,(length(v_pageurl)-v_dadpos)+1); htp.p('var h = "'||v_baseurl||'";'); htp.p('var d = "'||v_dadurl||'";'); l_level_old := 0; htp.p('var TREE_ITEMS = ['); -- htp.p(l_stmnt); v_temp_row_counter := -1; OPEN page_cv FOR l_stmnt USING l_page_group, p_language, p_start_page_id; LOOP FETCH page_cv INTO l_level , l_page_group , l_page_id , l_display_name , l_parent_id; -- fetch next row EXIT WHEN page_cv%NOTFOUND; -- exit loop when last row is fetched -- 4 following lines are needed to highligt the current page v_temp_row_counter := v_temp_row_counter + 1; if l_page_id = p_current_page_id then v_row_counter := v_temp_row_counter; end if; -- -- Check for Level change if l_level_old = 0 then -- Print the First line null; elsif l_level > l_level_old -- Print a Child then -- End the previous line htp.p(','); elsif l_level = l_level_old -- Print a Sibling then -- First Close the Prevous Line htp.p('],'); elsif l_level < l_level_old -- Close the Parent then -- First Close the Prevous Line htp.p(']'); -- Then close all parents -- If you go from level 4 to 2 you need to close two parent for l_counter in 1..(l_level_old-l_level) loop -- Then close the Parent on a new line --htp.prn(rpad(' ',3*(l_level_old-l_counter),' ')); htp.p('],'); end loop; end if; -- Print current page information --htp.prn(rpad(' ',3*l_level,' ')); htp.prn('['||chr(39)); htp.prn(replace(l_display_name,'''','\''')||chr(39)||','); -- -- Optimizing output -- htp.prn('h+'||chr(39)||l_page_id||chr(39)||'+d'); l_level_old := l_level; END LOOP; -- -- First Close the Prevous Line htp.p(']'); -- Close all parents that need to be closed -- If you go from level 4 to 2 you need to close two parent for l_counter in 1..(l_level_old-1) loop -- Then close the Parent on a new line --htp.prn(rpad(' ',3*(l_level_old-l_counter),' ')); htp.p(']'); end loop; -- Close the array htp.p('];'); -- htp.p('var v_current_page_arr_id = '|| v_row_counter||';'); exception when others then htp.p('An error has occured in procedure menu.navigation_menu.show_menu : '||sqlerrm); end show_menu; -- procedure tree_tpl( p_target in varchar2 default '_main', p_empty_img in varchar2 default '1999.gif', p_vertical_line in varchar2 default '2009.gif', p_root_normal in varchar2 default '1998.gif', p_root_selected in varchar2 default '1998.gif', p_root_opened in varchar2 default '1998.gif', p_root_selected_opened in varchar2 default '1998.gif', p_node_normal in varchar2 default '2000.gif', p_node_selected in varchar2 default '2000.gif', p_node_opened in varchar2 default '2001.gif', p_node_selected_opened in varchar2 default '2001.gif', p_leaf_normal in varchar2 default '2006.gif', p_leaf_selected in varchar2 default '2006.gif', p_leaf_opened in varchar2 default '2006.gif', p_leaf_selected_opened in varchar2 default '2006.gif', p_junc_leaf in varchar2 default '2003.gif', p_junc_last_leaf in varchar2 default '2002.gif', p_junc_closed_node in varchar2 default '2008.gif', p_junc_last_closed_node in varchar2 default '2007.gif', p_junc_opened_node in varchar2 default '2005.gif', p_junc_last_opened_node in varchar2 default '2004.gif' ) is l_hostname varchar2(100); -- Hostname BEGIN l_hostname := wwpob_page.get_baseurl; htp.p(l_hostname); htp.p('var tree_tpl = {'); htp.p('''target'''||' : '''||p_target||''', // name of the frame links will be opened in'); htp.p(' // other possible values are: _blank, _parent, _search, _self and _top'); -- Make LOV in Portal to select htp.p(''); htp.p('''icon_e'''||' : '||''''||l_hostname||'docs/'||p_empty_img||''''||', // empty image'); htp.p('''icon_l'''||' : '||''''||l_hostname||'docs/'||p_vertical_line||''''||', // vertical line'); htp.p(''); htp.p('''icon_48'''||' : '||''''||l_hostname||'docs/'||p_root_normal||''''||', // root icon normal'); htp.p('''icon_52'''||' : '||''''||l_hostname||'docs/'||p_root_selected||''''||', // root icon selected'); htp.p('''icon_56'''||' : '||''''||l_hostname||'docs/'||p_root_opened||''''||', // root icon opened'); htp.p('''icon_60'''||' : '||''''||l_hostname||'docs/'||p_root_selected_opened||''''||', // root icon selected'); htp.p(''); htp.p('''icon_16'''||' : '||''''||l_hostname||'docs/'||p_node_normal||''''||', // node icon normal'); htp.p('''icon_20'''||' : '||''''||l_hostname||'docs/'||p_node_selected||''''||', // node icon selected'); htp.p('''icon_24'''||' : '||''''||l_hostname||'docs/'||p_node_opened||''''||', // node icon opened'); htp.p('''icon_28'''||' : '||''''||l_hostname||'docs/'||p_node_selected_opened||''''||', // node icon selected opened'); htp.p(''); htp.p('''icon_0'''||' : '||''''||l_hostname||'docs/'||p_leaf_normal||''''||', // leaf icon normal'); htp.p('''icon_4'''||' : '||''''||l_hostname||'docs/'||p_leaf_selected||''''||', // leaf icon selected'); htp.p('''icon_8'''||' : '||''''||l_hostname||'docs/'||p_leaf_opened||''''||', // leaf icon opened'); htp.p('''icon_12'''||' : '||''''||l_hostname||'docs/'||p_leaf_selected_opened||''''||', // leaf icon selected'); htp.p(''); htp.p('''icon_2'''||' : '||''''||l_hostname||'docs/'||p_junc_leaf||''''||', // junction for leaf'); htp.p('''icon_3'''||' : '||''''||l_hostname||'docs/'||p_junc_last_leaf||''''||', // junction for last leaf'); htp.p('''icon_18'''||' : '||''''||l_hostname||'docs/'||p_junc_closed_node||''''||', // junction for closed node'); htp.p('''icon_19'''||' : '||''''||l_hostname||'docs/'||p_junc_last_closed_node||''''||', // junctioin for last closed node'); htp.p('''icon_26'''||' : '||''''||l_hostname||'docs/'||p_junc_opened_node||''''||',// junction for opened node'); htp.p('''icon_27'''||' : '||''''||l_hostname||'docs/'||p_junc_last_opened_node||''''||' // junctioin for last opended node'); htp.p('};'); htp.p(''); end tree_tpl; -- end NAVIGATION_MENU; /
Seeding the translations for the package danish/english
-- -- Connect as portal -- @@..\unseed.sql menu set serveroutput on size 1000000 set define off declare l_domain VARCHAR2(50) := 'some_domain'; l_sub_domain VARCHAR2(50) := 'menu'; l_us VARCHAR2(2) := wwnls_api.AMERICAN; l_dk VARCHAR2(2) := wwnls_api.DANISH; l_string_id integer; l_name VARCHAr2(64); begin dbms_output.put_line('Adding NLS strings...'); l_name := 'txttitle'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Menu'); l_name := 'txtdescription'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Javascript menu for traversing pagegroup structures in portal'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Javascript menu som gŸr det muligt at vise side struktur i portal'); l_name := 'txtcustomize'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Customize menu'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Tilpas menuen'); l_name := 'txticon_location'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'You need to specific the path to the page where you have uploaded the menu icons (ex. /PORTAL_DOC/DOC_DESIGNER - "/page_group/page_name/page_name...") . Then click Apply/OK.'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Du skal fŸrst specificere stien til den side hvod du har uploadet menu ikonerne (eks. /PORTAL_DOC/DOC_DESIGNER - "/side_gruppe/sidenavn/sidenavn..."). SÅ submit siden.'); l_name := 'txtportlet_title'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'The portlet title'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Portletens title'); l_name := 'txtpage_group_id'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Page group'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Side gruppe'); l_name := 'txtstart_page_id'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Root page for menu'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Rod side for menu'); l_name := 'txttarget'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Target'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Åbnes i'); l_name := 'txticon_page_path'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Path to icon page'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Sti til ikon side'); l_name := 'txtempty_img'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Empty filler icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Tomt/blank ikon'); l_name := 'txtvertical_line'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Vertical line icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Ikon for vertikal linie '); l_name := 'txtroot_normal'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Root icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Rod ikon'); l_name := 'txtroot_selected'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Root selected icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Valgt rod ikon'); l_name := 'txtroot_opened'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Root opened icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Åbnet rod ikon'); l_name := 'txtroot_selected_opened'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Root selected opened icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Åbnet og valft rod ikon'); l_name := 'txtnode_normal'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Folder normal icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Normalt biblioteks ikon'); l_name := 'txtnode_selected'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Folder selected icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Valgt biblioteks ikon'); l_name := 'txtnode_opened'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Folder opened icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Åbnet folder ikon'); l_name := 'txtnode_selected_opened'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Folder opened and selected icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Valgt og Åbnet folder ikon'); l_name := 'txtleaf_normal'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Leaf normal icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Blad ikon'); l_name := 'txtleaf_selected'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Leaf selected icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Valgt blad ikon'); l_name := 'txtleaf_opened'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Leaf opened icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Åbnet blad ikon'); l_name := 'txtleaf_selected_opened'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Leaf selected and opened icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Valgt og Åbnet blad ikon'); l_name := 'txtjunc_leaf'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Junction leaf icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'T ikon'); l_name := 'txtjunc_last_leaf'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Junction last leaf icon'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'T ikon'); l_name := 'txtjunc_closed_node'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Junction closed folder'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Lukket T ikon'); l_name := 'txtjunc_last_closed_node'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Junction last closed folder'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Lukket T ikon'); l_name := 'txtjunc_opened_node'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Junction opened folder'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Åbent T ikon'); l_name := 'txtjunc_last_opened_node'; l_string_id := wwnls_api.add_string(l_domain, l_sub_domain, l_name, l_us, 'Junction last opened folder'); wwnls_api.set_string(l_domain, l_sub_domain, l_name, l_dk, 'Åbent T ikon'); commit; dbms_output.put_line('Seed data successfully installed.'); exception when others then dbms_output.put_line('ERROR: Could not install seed data.'); rollback; end; /
The modified Tigra Tree Menu javascript
// Title: Tigra Tree // Description: See the demo at url // URL: http://www.softcomplex.com/products/tigra_menu_tree/ // Version: 1.1 // Date: 11-12-2002 (mm-dd-yyyy) // Contact: feedback@softcomplex.com (specify product title in the subject) // Notes: This script is free. Visit official site for further details. // // THIS VERSION IS NOT THE OFFICIAL VERSION VISIT THE ABOVE MENTIONED SITE FOR // THE OFFICIAL VERSION // // Changes made: The menu now has persistance (by using a cookie) // Changed by : kennethD.O.TthormanA.TgmailD.O.Tcom // Changed the : 20-March-2003 // // Changes compared to official version // * = New sub routine // ** = Modified sub routine function tree (a_items, a_template) { this.a_tpl = a_template; this.a_config = a_items; this.o_root = this; this.a_index = []; this.o_selected = null; this.n_depth = -1; this.cookie = document.cookie; // * var o_icone = new Image(), o_iconl = new Image(); o_icone.src = a_template['icon_e']; o_iconl.src = a_template['icon_l']; a_template['im_e'] = o_icone; a_template['im_l'] = o_iconl; for (var i = 0; i < 64; i++) if (a_template['icon_' + i]) { var o_icon = new Image(); a_template['im_' + i] = o_icon; o_icon.src = a_template['icon_' + i]; } this.setCurrState = function (label,persistence) { // * //this.cookie = document.cookie = "currState=" + persistence; this.cookie = document.cookie = label + "=" + persistence; }; this.getCurrState = function (label) { // * //var label = "currState="; label = label + "="; var labelLen = label.length; var cLen = this.cookie.length; var i = 0; while (i < cLen) { var j = i + labelLen; if (this.cookie.substring(i,j) == label) { var cEnd = this.cookie.indexOf(";",j); if (cEnd == -1) { cEnd = this.cookie.length; } return unescape(this.cookie.substring(j,cEnd)); } i++ } return "" }; this.toggle = function (n_id) { // ** var o_item = this.a_index[n_id]; o_item.open(o_item.b_opened); var temp_cookie = this.getCurrState("currState"); // If open insert a flag into the cookie so it remebers if (o_item.b_opened) { temp_cookie = temp_cookie + ':' + o_item.n_id + ':'; this.setCurrState("currState",temp_cookie); } // If closed remove the flag in the cookie else { var removeId = new RegExp (":"+n_id+":","g"); temp_cookie = temp_cookie.replace(removeId,''); this.setCurrState("currState",temp_cookie); } }; this.select = function (n_id) { return this.a_index[n_id].select(); }; this.mout = function (n_id) { this.a_index[n_id].upstatus(true) }; this.mover = function (n_id) { this.a_index[n_id].upstatus() }; this.a_children = []; for (var i = 0; i < a_items.length; i++) new tree_item(this, i); this.n_id = trees.length; trees[this.n_id] = this; for (var i = 0; i < this.a_children.length; i++) { document.write(this.a_children[i].init()); this.a_children[i].open(); } // Here we are opening the folders which have a open flag in the cookie var temp_cookie = this.o_root.getCurrState("currState"); if (temp_cookie.length > 0) { var re= new RegExp (":","g"); var cookie_arr = temp_cookie.split(re); for (var x = 0; x < cookie_arr.length; x++) { var o_item = this.a_index[cookie_arr[x]]; if (o_item) { o_item.open(o_item.b_opened); } } } // Make the current url bold in the menu tree //var active_id = this.o_root.getCurrState("active_id"); var active_id = v_current_page_arr_id; //if (active_id.length > 0) { if (get_element('i_txt' + this.o_root.n_id + '_' + active_id)) { get_element('i_txt' + this.o_root.n_id + '_' + active_id).style.fontWeight = 'bold'; } //} } function tree_item (o_parent, n_order) { this.n_depth = o_parent.n_depth + 1; this.a_config = o_parent.a_config[n_order + (this.n_depth ? 2 : 0)]; if (!this.a_config) return; this.o_root = o_parent.o_root; this.o_parent = o_parent; this.n_order = n_order; this.b_opened = !this.n_depth; this.n_id = this.o_root.a_index.length; this.o_root.a_index[this.n_id] = this; o_parent.a_children[n_order] = this; this.a_children = []; for (var i = 0; i < this.a_config.length - 2; i++) new tree_item(this, i); this.get_icon = item_get_icon; this.open = item_open; this.select = item_select; this.init = item_init; this.upstatus = item_upstatus; this.is_last = function () { return this.n_order == this.o_parent.a_children.length - 1 }; } function item_open (b_close) { var o_idiv = get_element('i_div' + this.o_root.n_id + '_' + this.n_id); if (!o_idiv) return; if (!o_idiv.innerHTML) { var a_children = []; for (var i = 0; i < this.a_children.length; i++) a_children[i]= this.a_children[i].init(); o_idiv.innerHTML = a_children.join(''); } o_idiv.style.display = (b_close ? 'none' : 'block'); this.b_opened = !b_close; var o_jicon = document.images['j_img' + this.o_root.n_id + '_' + this.n_id], o_iicon = document.images['i_img' + this.o_root.n_id + '_' + this.n_id]; if (o_jicon) o_jicon.src = this.get_icon(true); if (o_iicon) o_iicon.src = this.get_icon(); this.upstatus(); } function item_select (b_deselect) { if (!b_deselect) { var o_olditem = this.o_root.o_selected; this.o_root.o_selected = this; if (o_olditem) o_olditem.select(true); } var o_iicon = document.images['i_img' + this.o_root.n_id + '_' + this.n_id]; if (o_iicon) o_iicon.src = this.get_icon(); this.o_root.setCurrState("active_id",this.n_id); // Make the selected item bold on the new page as well //get_element('i_txt' + this.o_root.n_id + '_' + this.n_id).style.fontWeight = b_deselect ? 'normal' : 'bold'; this.upstatus(); return Boolean(this.a_config[1]); } function item_upstatus (b_clear) { window.setTimeout('window.status="' + (b_clear ? '' : this.a_config[0] + (this.a_config[1] ? ' ('+ this.a_config[1] + ')' : '')) + '"', 10); } function item_init () { var a_offset = [], o_current_item = this.o_parent; for (var i = this.n_depth; i > 1; i--) { a_offset[i] = '<img src="' + this.o_root.a_tpl[o_current_item.is_last() ? 'icon_e' : 'icon_l'] + '" border="0" align="absbottom">'; o_current_item = o_current_item.o_parent; } return '<table cellpadding="0" cellspacing="0" border="0"><tr><td nowrap>' + (this.n_depth ? a_offset.join('') + (this.a_children.length ? '<a href="javascript: trees[' + this.o_root.n_id + '].toggle(' + this.n_id + ')" onmouseover="trees[' + this.o_root.n_id + '].mover(' + this.n_id + ')" onmouseout="trees[' + this.o_root.n_id + '].mout(' + this.n_id + ')"><img src="' + this.get_icon(true) + '" border="0" align="absbottom" name="j_img' + this.o_root.n_id + '_' + this.n_id + '"></a>' : '<img src="' + this.get_icon(true) + '" border="0" align="absbottom">') : '') + '<a href="' + this.a_config[1] + '" target="' + this.o_root.a_tpl['target'] + '" onclick="return trees[' + this.o_root.n_id + '].select(' + this.n_id + ')" ondblclick="trees[' + this.o_root.n_id + '].toggle(' + this.n_id + ')" onmouseover="trees[' + this.o_root.n_id + '].mover(' + this.n_id + ')" onmouseout="trees[' + this.o_root.n_id + '].mout(' + this.n_id + ')" class="t' + this.o_root.n_id + 'i" id="i_txt' + this.o_root.n_id + '_' + this.n_id + '"><img src="' + this.get_icon() + '" border="0" align="absbottom" name="i_img' + this.o_root.n_id + '_' + this.n_id + '" class="t' + this.o_root.n_id + 'im">' + this.a_config[0] + '</a></td></tr></table>' + (this.a_children.length ? '<div id="i_div' + this.o_root.n_id + '_' + this.n_id + '" style="display:none"></div>' : ''); } function item_get_icon (b_junction) { return this.o_root.a_tpl['icon_' + ((this.n_depth ? 0 : 32) + (this.a_children.length ? 16 : 0) + (this.a_children.length && this.b_opened ? 8 : 0) + (!b_junction && this.o_root.o_selected == this ? 4 : 0) + (b_junction ? 2 : 0) + (b_junction && this.is_last() ? 1 : 0))]; } var trees = []; get_element = document.all ? function (s_id) { return document.all[s_id] } : function (s_id) { return document.getElementById(s_id) };
1 comment:
Just re-read this posting. Time has really blurred the amount of pain I must have felt writing portlets in PL/SQL. I do not remember it as been THAT painfull, but it sure it reading it now.
Post a Comment