/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Distributable under LGPL license. See terms of license at gnu.org. */ package net.java.sip.communicator.plugin.simpleaccreg; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import java.util.List; import javax.imageio.*; import javax.swing.*; import javax.swing.text.*; import net.java.sip.communicator.service.contactlist.*; import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.*; import net.java.sip.communicator.plugin.desktoputil.*; import org.jitsi.service.configuration.*; import org.osgi.framework.*; /** * The NoAccountFoundPage is the page shown in the account * registration wizard shown in the beginning of the program, when no registered * accounts are found. * * @author Yana Stamcheva * @author Lubomir Marinov */ public class InitialAccountRegistrationFrame extends SIPCommFrame { /** * Serial version UID. */ private static final long serialVersionUID = 0L; private ConfigurationService configurationService; /** * The Logger used by this InitialAccountRegistrationFrame * for logging output. */ private final Logger logger = Logger.getLogger(InitialAccountRegistrationFrame.class); private final TransparentPanel mainAccountsPanel = new TransparentPanel(new BorderLayout(10, 10)); private final TransparentPanel accountsPanel = new TransparentPanel(new GridLayout(0, 2, 10, 10)); private final TransparentPanel southPanel = new TransparentPanel(new BorderLayout()); private final JButton signinButton = new JButton(Resources.getString("service.gui.SIGN_IN")); private final Collection registrationForms = new Vector(); /** * Creates an instance of NoAccountFoundPage. */ public InitialAccountRegistrationFrame() { super(false); setDefaultCloseOperation(DISPOSE_ON_CLOSE); TransparentPanel mainPanel = new TransparentPanel(new BorderLayout()); mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); southPanel.add(buttonPanel, BorderLayout.EAST); JButton cancelButton = new JButton(Resources.getString("service.gui.CANCEL")); this.setTitle(Resources.getString("service.gui.SIGN_IN")); this.setIconImage( Resources.getImage("service.gui.SIP_COMMUNICATOR_LOGO").getImage()); // In order to have the same icon when using option panes JOptionPane.getRootFrame().setIconImage( Resources.getImage("service.gui.SIP_COMMUNICATOR_LOGO").getImage()); mainAccountsPanel.setBorder( BorderFactory.createEmptyBorder(10, 10, 10, 10)); this.getContentPane().add(mainPanel); mainPanel.add(createTitleComponent(), BorderLayout.NORTH); JScrollPane scroller = new JScrollPane(mainAccountsPanel); scroller.setOpaque(false); scroller.getViewport().setOpaque(false); mainPanel.add(scroller, BorderLayout.CENTER); mainPanel.add(southPanel, BorderLayout.SOUTH); mainAccountsPanel.add(accountsPanel, BorderLayout.CENTER); initProvisioningPanel(); mainAccountsPanel.setOpaque(false); accountsPanel.setOpaque(false); buttonPanel.setOpaque(false); SigninActionListener actionListener = new SigninActionListener(); signinButton.addActionListener(actionListener); cancelButton.addActionListener(actionListener); buttonPanel.add(signinButton); buttonPanel.add(cancelButton); this.getRootPane().setDefaultButton(signinButton); this.initAccountWizards(); // Create the default group String groupName = Resources.getApplicationProperty("impl.gui.DEFAULT_GROUP_NAME"); if(groupName != null && groupName.length() > 0) { MetaContactListService contactList = SimpleAccountRegistrationActivator.getContactList(); Iterator iter = contactList.getRoot().getSubgroups(); while (iter.hasNext()) { MetaContactGroup gr = iter.next(); if (groupName.equals(gr.getGroupName())) return; } contactList .createMetaContactGroup(contactList.getRoot(), groupName); getConfigurationService() .setProperty( "net.java.sip.communicator.impl.gui.addcontact.lastContactParent", groupName); } this.getRootPane().validate(); this.pack(); // if the screen height is sufficiently large, expand the window size // so that no scrolling is needed if (scroller.getViewport().getHeight() < Toolkit.getDefaultToolkit().getScreenSize().getHeight() - 230) { this.setSize(scroller.getViewport().getWidth() + 100, scroller.getViewport().getHeight() + 150); } else { // otherwise add some width so that no horizontal scrolling is // needed this.setSize(this.getSize().width + 20, this.getSize().height - 10); } } /** * Initializes the provisioning panel. */ private void initProvisioningPanel() { String isInitialProv = SimpleAccountRegistrationActivator.getResources() .getSettingsString( "plugin.provisioning.IS_INITIAL_PROVISIONING_LINK"); if (isInitialProv != null && isInitialProv.length() > 0 && !Boolean.parseBoolean(isInitialProv)) return; String useProvisioningString = SimpleAccountRegistrationActivator .getResources().getI18NString("service.gui.USE_PROVISIONING"); final JLabel provisioningLabel = new JLabel("" + useProvisioningString + ""); provisioningLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); provisioningLabel.setToolTipText(useProvisioningString); provisioningLabel.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { ConfigurationContainer configContainer = SimpleAccountRegistrationActivator.getUIService() .getConfigurationContainer(); ConfigurationForm advancedConfigForm = SimpleAccountRegistrationActivator.getAdvancedConfigForm(); if (advancedConfigForm != null) { configContainer.setSelected(advancedConfigForm); if (advancedConfigForm instanceof ConfigurationContainer) { ConfigurationForm provisioningForm = SimpleAccountRegistrationActivator .getProvisioningConfigForm(); if (provisioningForm != null) { ((ConfigurationContainer) advancedConfigForm) .setSelected(provisioningForm); } } } configContainer.setVisible(true); } }); southPanel.add(provisioningLabel, BorderLayout.WEST); } private void initAccountWizards() { String simpleWizards = SimpleAccountRegistrationActivator.getConfigService() .getString("plugin.simpleaccreg.PROTOCOL_ORDER"); StringTokenizer tokenizer = new StringTokenizer(simpleWizards, "|"); ServiceReference[] serviceRefs = null; while (tokenizer.hasMoreTokens()) { String protocolToken = tokenizer.nextToken(); String osgiFilter = "(" + ProtocolProviderFactory.PROTOCOL + "="+protocolToken+")"; try { serviceRefs = SimpleAccountRegistrationActivator.bundleContext .getServiceReferences( AccountRegistrationWizard.class.getName(), osgiFilter); if (serviceRefs != null && serviceRefs.length > 0) { AccountRegistrationWizard wizard = (AccountRegistrationWizard) SimpleAccountRegistrationActivator .bundleContext.getService(serviceRefs[0]); this.addAccountRegistrationForm(wizard); } } catch (InvalidSyntaxException ex) { logger.error("GuiActivator : ", ex); } } } /** * The account registration panel. */ private class AccountRegistrationPanel extends JPanel { /** * Serial version UID. */ private static final long serialVersionUID = 0L; private JLabel usernameLabel = new JLabel(Resources.getString( "plugin.simpleaccregwizz.LOGIN_USERNAME")); private JLabel passwordLabel = new JLabel(Resources.getString("service.gui.PASSWORD")); private JTextField usernameField = new JTextField(); private JLabel usernameExampleLabel = new JLabel(); private JPasswordField passwordField = new JPasswordField(); private JPanel labelsPanel = new JPanel(new GridLayout(0, 1, 5, 0)); private JPanel fieldsPanel = new JPanel(new GridLayout(0, 1, 5, 0)); private JPanel emptyPanel = new JPanel(); private JPanel inputPanel = new JPanel(new BorderLayout(5, 5)); private JPanel iconDescriptionPanel = new JPanel(new BorderLayout()); private JTextArea descriptionArea = new JTextArea(); private final AccountRegistrationWizard wizard; public AccountRegistrationPanel( AccountRegistrationWizard accountWizard, boolean isPreferredWizard) { super(new BorderLayout(5, 5)); this.wizard = accountWizard; // Obtain the simple form in order to initialize all predefined // values. // TODO: Use the simple form instead of creating new fields and // panels here. wizard.getSimpleForm(false); JLabel protocolLabel = new JLabel(); JPanel inputRegisterPanel = new JPanel(new BorderLayout()); this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); this.setOpaque(false); this.inputPanel.setOpaque(false); this.labelsPanel.setOpaque(false); this.fieldsPanel.setOpaque(false); this.emptyPanel.setOpaque(false); inputRegisterPanel.setOpaque(false); this.iconDescriptionPanel.setOpaque(false); this.add(inputRegisterPanel, BorderLayout.CENTER); inputRegisterPanel.add(inputPanel, BorderLayout.NORTH); if (((wizard instanceof ExtendedAccountRegistrationWizard) && ((ExtendedAccountRegistrationWizard) wizard) .isSignupSupported()) || wizard.isWebSignupSupported()) { String textKey = isPreferredWizard ? "plugin.simpleaccregwizz.SPECIAL_SIGNUP" : "plugin.simpleaccregwizz.SIGNUP"; JLabel signupLabel = new JLabel("" + Resources.getString(textKey) + "", JLabel.RIGHT); signupLabel.setFont(signupLabel.getFont().deriveFont(10f)); signupLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); signupLabel.setToolTipText( Resources.getString( "plugin.simpleaccregwizz.SPECIAL_SIGNUP")); signupLabel.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { try { if ((wizard instanceof ExtendedAccountRegistrationWizard) && ((ExtendedAccountRegistrationWizard) wizard) .isSignupSupported()) { showCreateAccountWindow(wizard); dispose(); } else if (wizard.isWebSignupSupported()) { wizard.webSignup(); } } catch (UnsupportedOperationException ex) { // This should not happen, because we check if the // operation is supported, before adding the sign // up. logger.error("The web sign up is not supported.", ex); } } }); inputRegisterPanel.add(signupLabel, BorderLayout.SOUTH); } this.inputPanel.add(labelsPanel, BorderLayout.WEST); this.inputPanel.add(fieldsPanel, BorderLayout.CENTER); this.iconDescriptionPanel.add( protocolLabel, BorderLayout.NORTH); protocolLabel.setFont( protocolLabel.getFont().deriveFont(Font.BOLD, 14f)); this.usernameExampleLabel.setForeground(Color.DARK_GRAY); this.usernameExampleLabel.setFont( usernameExampleLabel.getFont().deriveFont(8f)); this.emptyPanel.setMaximumSize(new Dimension(40, 25)); this.labelsPanel.add(usernameLabel); this.labelsPanel.add(emptyPanel); this.labelsPanel.add(passwordLabel); this.fieldsPanel.add(usernameField); this.fieldsPanel.add(usernameExampleLabel); this.fieldsPanel.add(passwordField); this.usernameExampleLabel.setText(wizard.getUserNameExample()); protocolLabel.setText(wizard.getProtocolName()); Image image = null; try { image = ImageIO.read( new ByteArrayInputStream(wizard.getPageImage())); } catch (IOException e) { logger.error("Unable to load image.", e); } if (image != null) { image = image.getScaledInstance(28, 28, Image.SCALE_SMOOTH); protocolLabel.setIcon(new ImageIcon(image)); } if (isPreferredWizard) { descriptionArea.setBorder(BorderFactory .createEmptyBorder(10, 0, 0, 0)); descriptionArea.setFont( descriptionArea.getFont().deriveFont(10f)); descriptionArea.setPreferredSize(new Dimension(220, 50)); descriptionArea.setLineWrap(true); descriptionArea.setWrapStyleWord(true); descriptionArea.setText(wizard.getProtocolDescription()); descriptionArea.setEditable(false); descriptionArea.setOpaque(false); this.iconDescriptionPanel.add( descriptionArea, BorderLayout.CENTER); this.add(iconDescriptionPanel, BorderLayout.WEST); } else { this.add(iconDescriptionPanel, BorderLayout.NORTH); } } @Override public void paintComponent(Graphics g) { // do the superclass behavior first super.paintComponent(g); g = g.create(); try { AntialiasingManager.activateAntialiasing(g); Graphics2D g2d = (Graphics2D) g; // paint the background with the chosen color g2d.setColor(Color.GRAY); g2d.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, 15, 15); } finally { g.dispose(); } } public boolean isFilled() { String username = usernameField.getText(); return (username != null) && (username.length() > 0); } public void signin() throws OperationFailedException { ProtocolProviderService protocolProvider = wizard.signin(usernameField.getText(), new String(passwordField .getPassword())); saveAccountWizard(protocolProvider, wizard); } } /** * Adds a simple account registration form corresponding to the given * AccountRegistrationWizard. * * @param wizard the AccountRegistrationWizard, which gives us * information to fill our simple form. */ private void addAccountRegistrationForm(AccountRegistrationWizard wizard) { // We don't need to add wizards that are not interested in a // simple sign in form. if (!wizard.isSimpleFormEnabled()) return; String preferredWizardName = Resources.getLoginProperty("impl.gui.PREFERRED_ACCOUNT_WIZARD"); AccountRegistrationPanel accountPanel; if (preferredWizardName != null && preferredWizardName.equals(wizard.getClass().getName())) { accountPanel = new AccountRegistrationPanel(wizard, true); mainAccountsPanel.add( accountPanel, BorderLayout.NORTH); mainAccountsPanel.validate(); } else { accountPanel = new AccountRegistrationPanel(wizard, false); accountsPanel.add(accountPanel); accountsPanel.validate(); } this.registrationForms.add(accountPanel); } /** * Handles the event triggered by the "service.gui.SIGN_IN" button. */ private class SigninActionListener implements ActionListener { public void actionPerformed(ActionEvent evt) { JButton button = (JButton) evt.getSource(); if (button.equals(signinButton)) { Iterator regIterator = registrationForms.iterator(); if (regIterator.hasNext()) setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); while(regIterator.hasNext()) { AccountRegistrationPanel regForm = regIterator.next(); try { if (regForm.isFilled()) regForm.signin(); } catch (OperationFailedException e) { if (logger.isDebugEnabled()) logger.debug("The sign in operation has failed."); PopupDialog popupDialog = SimpleAccountRegistrationActivator.getUIService() .getPopupDialog(); if (e.getErrorCode() == OperationFailedException.ILLEGAL_ARGUMENT) { popupDialog.showMessagePopupDialog( Resources.getString( "service.gui.USERNAME_NULL"), Resources.getString( "service.gui.ERROR"), PopupDialog.ERROR_MESSAGE); } else if (e.getErrorCode() == OperationFailedException .IDENTIFICATION_CONFLICT) { popupDialog.showMessagePopupDialog( Resources.getString( "service.gui.USER_EXISTS_ERROR"), Resources.getString( "service.gui.ERROR"), PopupDialog.ERROR_MESSAGE); } else if (e.getErrorCode() == OperationFailedException .SERVER_NOT_SPECIFIED) { popupDialog.showMessagePopupDialog( Resources.getString( "service.gui.SPECIFY_SERVER"), Resources.getString( "service.gui.ERROR"), PopupDialog.ERROR_MESSAGE); } } } } InitialAccountRegistrationFrame initialAccountRegistrationFrame = InitialAccountRegistrationFrame.this; initialAccountRegistrationFrame.setVisible(false); initialAccountRegistrationFrame.dispose(); } } /** * Saves the (protocol provider, wizard) pair in through the * ConfigurationService. * * @param protocolProvider the protocol provider to save * @param wizard the wizard to save */ private void saveAccountWizard(ProtocolProviderService protocolProvider, AccountRegistrationWizard wizard) { String prefix = "net.java.sip.communicator.impl.gui.accounts"; ConfigurationService configService = getConfigurationService(); List accounts = configService.getPropertyNamesByPrefix(prefix, true); boolean savedAccount = false; for (String accountRootPropName : accounts) { String accountUID = configService.getString(accountRootPropName); if (accountUID.equals(protocolProvider.getAccountID() .getAccountUniqueID())) { configService.setProperty(accountRootPropName + ".wizard", wizard.getClass().getName().replace('.', '_')); savedAccount = true; } } if (!savedAccount) { String accNodeName = "acc" + Long.toString(System.currentTimeMillis()); String accountPackage = "net.java.sip.communicator.impl.gui.accounts." + accNodeName; configService.setProperty(accountPackage, protocolProvider .getAccountID().getAccountUniqueID()); configService.setProperty(accountPackage + ".wizard", wizard); } } /** * Returns the ConfigurationService. * * @return the ConfigurationService */ public ConfigurationService getConfigurationService() { if (configurationService == null) { BundleContext bundleContext = SimpleAccountRegistrationActivator.bundleContext; ServiceReference configReference = bundleContext.getServiceReference(ConfigurationService.class .getName()); configurationService = (ConfigurationService) bundleContext .getService(configReference); } return configurationService; } /** * Creates the title component. * @return the newly created title component */ private JComponent createTitleComponent() { JTextPane titlePane = new JTextPane(); SimpleAttributeSet aSet = new SimpleAttributeSet(); StyleConstants.setAlignment(aSet, StyleConstants.ALIGN_CENTER); StyleConstants.setBold(aSet, true); StyleConstants.setFontFamily(aSet, titlePane.getFont().getFamily()); titlePane.setParagraphAttributes(aSet, true); titlePane.setEditable(false); titlePane.setText(Resources.getString( "plugin.simpleaccregwizz.INITIAL_ACCOUNT_REGISTRATION")); titlePane.setOpaque(false); return titlePane; } /** * Show the create account window for the given wizard. * * @param wizard the AccountRegistrationWizard, for which we're * opening the window */ private void showCreateAccountWindow(AccountRegistrationWizard wizard) { CreateAccountWindow createAccountWindow = SimpleAccountRegistrationActivator .getUIService().getCreateAccountWindow(); createAccountWindow.setSelectedWizard(wizard, true); if (wizard instanceof ExtendedAccountRegistrationWizard) { ((ExtendedAccountRegistrationWizard) wizard).setCreateAccountView(); } createAccountWindow.setVisible(true); } @Override protected void close(boolean isEscaped) { } }