/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.java.sip.communicator.plugin.connectioninfo;
import java.awt.*;
import java.security.cert.*;
import javax.swing.*;
import javax.swing.event.*;
import net.java.sip.communicator.plugin.connectioninfo.ConnectionInfoMenuItemComponent.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.Logger;
import org.jitsi.service.resources.*;
/**
* The main panel that allows users to view and edit their account information.
* Different instances of this class are created for every registered
* <tt>ProtocolProviderService</tt>.
* Currently, supported account details are first/middle/last names, nickname,
* street/city/region/country address, postal code, birth date, gender,
* organization name, job title, about me, home/work email, home/work phone.
*
* @author Yana Stamcheva
* @author Adam Netocny
* @author Marin Dzhigarov
* @author Markus Kilas
*/
public class ConnectionDetailsPanel
extends TransparentPanel
implements HyperlinkListener
{
/**
* Serial version UID.
*/
private static final long serialVersionUID = 1L;
/**
* The logger
*/
private final Logger logger = Logger.getLogger(
ConnectionDetailsPanel.class);
private final ResourceManagementService R;
/**
* The <tt>ProtocolProviderService</tt> that this panel is associated with.
*/
final ProtocolProviderService protocolProvider;
/**
* The parent dialog.
*/
private final ConnectionInfoDialog dialog;
/**
* The information text pane.
*/
private final JEditorPane infoTextPane;
/**
* Dummy URL to indicate that the certificate should be displayed.
*/
private final String CERTIFICATE_URL = "jitsi://viewCertificate";
/**
* Construct a panel containing all account details for the given protocol
* provider.
*
* @param dialog the parent dialog
* @param protocolProvider the protocol provider service
*/
public ConnectionDetailsPanel(ConnectionInfoDialog dialog,
ProtocolProviderService protocolProvider)
{
this.dialog = dialog;
this.R = ConnectionInfoActivator.R;
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
setOpaque(false);
this.setPreferredSize(new Dimension(600, 400));
this.protocolProvider = protocolProvider;
this.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
infoTextPane = new JEditorPane();
// Make JEditorPane respect our default font because we will be using it
// to just display text.
infoTextPane.putClientProperty(
JEditorPane.HONOR_DISPLAY_PROPERTIES,
true);
infoTextPane.setOpaque(false);
infoTextPane.setEditable(false);
infoTextPane.setContentType("text/html");
infoTextPane.addHyperlinkListener(this);
if (protocolProvider.isRegistered())
{
loadDetails();
}
this.add(infoTextPane);
}
/**
* Constructs the connection info text.
*/
public void loadDetails()
{
final StringBuilder buff = new StringBuilder();
buff.append(
"<html><body><p align=\"left\">"
+ "<font size=\"3\">");
// Protocol name
buff.append(getLineString(R.getI18NString(
"service.gui.PROTOCOL"), protocolProvider.getProtocolName()));
// Server address and port
final OperationSetConnectionInfo opSetConnectionInfo = protocolProvider
.getOperationSet(OperationSetConnectionInfo.class);
if (opSetConnectionInfo != null)
{
buff.append(getLineString(R.getI18NString(
"service.gui.ADDRESS"),
opSetConnectionInfo.getServerAddress() == null ?
"" : opSetConnectionInfo.getServerAddress()
.getHostName()));
buff.append(getLineString(R.getI18NString(
"service.gui.PORT"),
opSetConnectionInfo.getServerAddress() == null ?
"" : String.valueOf(opSetConnectionInfo
.getServerAddress().getPort())));
}
// Transport protocol
TransportProtocol preferredTransport
= protocolProvider.getTransportProtocol();
if (preferredTransport != TransportProtocol.UNKNOWN)
buff.append(getLineString(
R.getI18NString("service.gui.callinfo.CALL_TRANSPORT"),
preferredTransport.toString()));
// TLS information
final OperationSetTLS opSetTls = protocolProvider
.getOperationSet(OperationSetTLS.class);
if (opSetTls != null)
{
buff.append(getLineString(
R.getI18NString(
"service.gui.callinfo.TLS_PROTOCOL"),
opSetTls.getProtocol()));
buff.append(getLineString(
R.getI18NString(
"service.gui.callinfo.TLS_CIPHER_SUITE"),
opSetTls.getCipherSuite()));
buff.append("<b><a href=\"")
.append(CERTIFICATE_URL)
.append("\">")
.append(R.getI18NString(
"service.gui.callinfo.VIEW_CERTIFICATE"))
.append("</a></b><br/>");
}
buff.append("</font></p></body></html>");
infoTextPane.setText(buff.toString());
infoTextPane.revalidate();
infoTextPane.repaint();
}
/**
* Returns an HTML string corresponding to the given labelText and infoText,
* that could be easily added to the information text pane.
*
* @param labelText the label text that would be shown in bold
* @param infoText the info text that would be shown in plain text
* @return the newly constructed HTML string
*/
private String getLineString(String labelText, String infoText)
{
return "<b>" + labelText + "</b> : " + infoText + "<br/>";
}
/**
* Invoked when user clicks a link in the editor pane.
* @param e the event
*/
public void hyperlinkUpdate(HyperlinkEvent e)
{
// Handle "View certificate" link
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED
&& CERTIFICATE_URL.equals(e.getDescription()))
{
Certificate[] chain = protocolProvider
.getOperationSet(OperationSetTLS.class)
.getServerCertificates();
ViewCertificateFrame certFrame =
new ViewCertificateFrame(chain, null, R.getI18NString(
"service.gui.callinfo.TLS_CERTIFICATE_CONTENT"));
certFrame.setVisible(true);
}
}
/**
* Returns the provider we represent.
* @return
*/
public ProtocolProviderService getProtocolProvider()
{
return protocolProvider;
}
}