<!--

    Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.

    This program and the accompanying materials are made available under the
    terms of the Eclipse Public License v. 2.0, which is available at
    http://www.eclipse.org/legal/epl-2.0.

    This Source Code may also be made available under the following Secondary
    Licenses when the conditions for such availability set forth in the
    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
    version 2 with the GNU Classpath Exception, which is available at
    https://www.gnu.org/software/classpath/license.html.

    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0

-->

<!-- configuration/iiopListeners.jsf -->



<!initPage
    setResourceBundle(key="i18n_corba" bundle="org.glassfish.corba.admingui.Strings")
    setResourceBundle(key="help_corba" bundle="org.glassfish.corba.admingui.Helplinks");
/>
<!composition template="/templates/default.layout"
    guiTitle="$resource{i18n_corba.iiopListeners.ListPageTitle}"
    guiTemplateOnLoad="admingui.nav.refreshTree('treeForm:tree:configurations:#{pageSession.encodedConfigName}:orb:iiopListeners');"
>
<!define name="content">
    <event>
    <!beforeCreate
        getRequestValue(key="configName" value="#{pageSession.configName}");
        urlencode(value="#{pageSession.configName}" encoding="UTF-8" result="#{pageSession.encodedConfigName}");
        setPageSessionAttribute(key="childType" value="iiop-listener");
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/configs/config/#{pageSession.configName}/iiop-service");
        setPageSessionAttribute(key="selfUrl", value="#{pageSession.parentUrl}/#{pageSession.childType}");
        setPageSessionAttribute(key="rest-api" value="true");
        gf.getChildList(parentEndpoint="#{pageSession.parentUrl}", childType="#{pageSession.childType}", id="id", result="#{requestScope.listOfRows}");
        createMap(result="#{pageSession.valueMap}");
        mapPut(map="#{pageSession.valueMap}" key="target" value="#{pageSession.configName}");
        setPageSessionAttribute(key="confirmDeleteMsg" value="$resource{i18n_corba.msg.JS.confirmDeleteIiopListener}");
        setPageSessionAttribute(key="createLink" value="#{request.contextPath}/corba/iiopListenerNew.jsf?configName=#{pageSession.configName}");
        setPageSessionAttribute(key="listLink" value="#{request.contextPath}/corba/iiopListeners.jsf?configName=#{pageSession.configName}");
        setPageSessionAttribute(key="editLink" value="#{request.contextPath}/corba/iiopListenerEdit.jsf?configName=#{pageSession.configName}");
        setPageSessionAttribute(key="tableTitle" value="$resource{i18n_corba.iiopListeners.TableTitle}");
    />
    </event>
"    <script type="text/javascript">admingui.nav.selectTreeNodeById(admingui.nav.TREE_ID+":configurations:#{pageSession.encodedConfigName}:orb:iiopListeners");</script>
            <sun:form id="propertyForm">
#include "/common/shared/alertMsg.inc"
         <sun:title id="propertyContentPage" title="$resource{i18n_corba.iiopListeners.ListPageTitle}"
                 helpText="$resource{i18n_corba.iiopListeners.ListPageHelp}" />
#include "/common/shared/configNameSection.inc"
<sun:table id="configs" title="#{tableTitle}"
    deselectMultipleButton="$boolean{true}"
    deselectMultipleButtonOnClick="setTimeout('admingui.table.changeOneTableButton(\\\\\'#{pageSession.topActionGroup}\\\\\', \\\\\'#{pageSession.tableId}\\\\\');', 0)"
    selectMultipleButton="$boolean{true}"
    selectMultipleButtonOnClick="setTimeout('admingui.table.changeOneTableButton(\\\\\'#{pageSession.topActionGroup}\\\\\', \\\\\'#{pageSession.tableId}\\\\\');', 0)" >
    <!afterCreate
        getClientId(component="$this{component}" clientId=>$page{tableId});
    />

#include "/common/shared/listTableConfigButtons.inc"

<sun:tableRowGroup id="rowGroup1" selected="#{td.value.selected}" data={"$attribute{listOfRows}"} sourceVar="td">
     <!afterCreate
         getClientId(component="$this{component}" clientId=>$page{tableRowGroupId});
        />
    <sun:tableColumn headerText="$resource{i18n.common.SelectHeader}" selectId="select" rowHeader="$boolean{false}" id="col0">
            <sun:checkbox id="select"
                selected="#{td.value.selected}"
                selectedValue="$boolean{true}"
                onClick="setTimeout('admingui.table.changeOneTableButton(\\\\\'#{pageSession.topActionGroup}\\\\\', \\\\\'#{pageSession.tableId}\\\\\'); admingui.table.initAllRows(\\\\\'#{pageSession.tableId}\\\\\');', 0);"
            />
    </sun:tableColumn>

    <sun:tableColumn headerText="$resource{i18n.common.name.header}"  sort="name" rowHeader="$boolean{true}" id="col1">
        <sun:hyperlink id="link" text="#{td.value.name}" url="#{pageSession.editLink}&name=#{td.value.name}" />
    </sun:tableColumn>

    <sun:tableColumn headerText="$resource{i18n.common.Enabled}"   sort="enabled" rowHeader="$boolean{true}" id="col2">
        <sun:staticText escape="true" id="enableCol" value="#{td.value.enabled}" />
    </sun:tableColumn>
    <sun:tableColumn headerText="$resource{i18n.common.NtwkAddress}"  sort="address"  rowHeader="$boolean{true}" id="col3">
        <sun:staticText escape="true" id="ntwkAddrCol" value="#{td.value.address}" />
    </sun:tableColumn>
    <sun:tableColumn headerText="$resource{i18n.common.listPort}"  sort="port"  rowHeader="$boolean{true}" id="col4">
        <sun:staticText escape="true" id="portCol" value="#{td.value.port}" />
    </sun:tableColumn>

  </sun:tableRowGroup>
</sun:table>

	<sun:hidden id="helpKey" value="$resource{help_corba.iiopListeners}" />
            </sun:form>
#include "/common/shared/changeButtonsJS.inc"

</define>
</composition>
