/* * 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.impl.gui.main.account; import java.awt.*; import java.awt.Container; 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.impl.gui.*; import net.java.sip.communicator.impl.gui.customcontrols.wizard.*; import net.java.sip.communicator.impl.gui.main.*; import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.util.*; import org.jitsi.service.configuration.*; import org.osgi.framework.*; /** * The implementation of the <tt>AccountRegistrationWizardContainer</tt>. * * @author Yana Stamcheva */ public class AccountRegWizardContainerImpl extends Wizard implements WizardContainer, ServiceListener { private static final Logger logger = Logger.getLogger(AccountRegWizardContainerImpl.class); private final AccountRegSummaryPage summaryPage; private AccountRegistrationWizard currentWizard; private final ConfigurationService configService = GuiActivator.getConfigurationService(); private final Map<String, AccountRegistrationWizard> registeredWizards = new Hashtable<String, AccountRegistrationWizard>(); public AccountRegWizardContainerImpl(MainFrame mainFrame) { super(mainFrame); this.setTitle(GuiActivator.getResources() .getI18NString("service.gui.ACCOUNT_REGISTRATION_WIZARD")); this.summaryPage = new AccountRegSummaryPage(this); this.registerWizardPage(summaryPage.getIdentifier(), summaryPage); Collection<ServiceReference<AccountRegistrationWizard>> accountWizardRefs; try { accountWizardRefs = GuiActivator.bundleContext.getServiceReferences( AccountRegistrationWizard.class, null); } catch (InvalidSyntaxException ex) { // this shouldn't happen since we're providing no parameter string // but let's log just in case. logger.error("Error while retrieving service refs", ex); return; } // in case we found any, add them in this container. if ((accountWizardRefs != null) && !accountWizardRefs.isEmpty()) { if (logger.isDebugEnabled()) { logger.debug( "Found " + accountWizardRefs.size() + " already installed providers."); } for (ServiceReference<AccountRegistrationWizard> serRef : accountWizardRefs) { String protocolName = (String) serRef.getProperty(ProtocolProviderFactory.PROTOCOL); AccountRegistrationWizard wizard = GuiActivator.bundleContext.getService(serRef); addAccountRegistrationWizard(protocolName, wizard); } } GuiActivator.bundleContext.addServiceListener(this); } /** * Adds the given <tt>AccountRegistrationWizard</tt> to the list of * containing wizards. * * @param wizard the <tt>AccountRegistrationWizard</tt> to add */ public void addAccountRegistrationWizard( String protocolName, AccountRegistrationWizard wizard) { synchronized (registeredWizards) { registeredWizards.put(protocolName, wizard); } } /** * Removes the given <tt>AccountRegistrationWizard</tt> from the list of * containing wizards. * * @param wizard the <tt>AccountRegistrationWizard</tt> to remove */ public void removeAccountRegistrationWizard(String protocolName, AccountRegistrationWizard wizard) { synchronized (registeredWizards) { registeredWizards.remove(protocolName); } } /** * Returns the summary wizard page. * * @return the summary wizard page */ public AccountRegSummaryPage getSummaryPage() { return summaryPage; } /** * Opens the corresponding wizard to modify an existing account given by the * <tt>protocolProvider</tt> parameter. * * @param protocolProvider The <tt>ProtocolProviderService</tt> for the * account to modify. */ public void modifyAccount(ProtocolProviderService protocolProvider) { AccountRegistrationWizard wizard = getProtocolWizard(protocolProvider); this.setCurrentWizard(wizard); wizard.setModification(true); this.summaryPage.setModification(protocolProvider); if(protocolProvider != null && protocolProvider.getAccountID().isReadOnly()) { // cardPanel is the main panel of the wizard pages setDisabled(cardPanel.getComponents()); } wizard.loadAccount(protocolProvider); } /** * Disables all editable components. Used to enable readonly accounts * to only show their values and forbid the user to edit. * * @param components the components to disable */ private void setDisabled(Component[] components) { for(Component c : components) { if(c instanceof JTextComponent) ((JTextComponent)c).setEditable(false); else if(c instanceof JComboBox || c instanceof AbstractButton) c.setEnabled(false); if(c instanceof Container) setDisabled(((Container)c).getComponents()); } } /** * Returns the wizard corresponding to the given protocol provider. * * @param protocolProvider the <tt>ProtocolProviderService</tt>, which * corresponding wizard we're looking for * @return the corresponding wizard */ public AccountRegistrationWizard getProtocolWizard( ProtocolProviderService protocolProvider) { AccountRegistrationWizard res = registeredWizards.get(protocolProvider.getProtocolDisplayName()); // compatibility check, some protocols have changed name // and when they have those name saved in configuration // cannot be edited, so lets check whether there is a wizard // with the same protocol name like the one of its provider if(res == null) { //lets find matching protocol name in registered wizards Iterator<AccountRegistrationWizard> iter = registeredWizards.values().iterator(); while(iter.hasNext()) { AccountRegistrationWizard wizard = iter.next(); if(wizard.getProtocolName() .equals(protocolProvider.getProtocolName())) { res = wizard; break; } } } return res; } /** * Saves the (protocol provider, wizard) pair in through the * <tt>ConfigurationService</tt>. * * @param protocolProvider the protocol provider to save * @param wizard the wizard to save */ public void saveAccountWizard(ProtocolProviderService protocolProvider, AccountRegistrationWizard wizard) { String prefix = "net.java.sip.communicator.impl.gui.accounts"; List<String> 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 accountPackage = prefix + ".acc" + Long.toString(System.currentTimeMillis()); configService.setProperty(accountPackage, protocolProvider .getAccountID().getAccountUniqueID()); configService.setProperty(accountPackage + ".wizard", wizard); } } /** * Returns the currently used <tt>AccountRegistrationWizard</tt>. * * @return the currently used <tt>AccountRegistrationWizard</tt> */ public AccountRegistrationWizard getCurrentWizard() { return currentWizard; } /** * Sets the currently used <tt>AccountRegistrationWizard</tt>. * * @param wizard the <tt>AccountRegistrationWizard</tt> to set as * current one */ public void setCurrentWizard(AccountRegistrationWizard wizard) { this.currentWizard = wizard; if (wizard instanceof DesktopAccountRegistrationWizard) summaryPage.setPreferredSize( ((DesktopAccountRegistrationWizard) currentWizard).getSize()); Iterator<WizardPage> i = wizard.getPages(); while(i.hasNext()) { WizardPage page = i.next(); this.registerWizardPage(page.getIdentifier(), page); } this.setCurrentPage(wizard.getFirstPageIdentifier()); try { this.setWizzardIcon( ImageIO.read(new ByteArrayInputStream(wizard.getPageImage()))); } catch (IOException e1) { e1.printStackTrace(); } } /** * Unregisters all pages added by the current wizard. */ public void unregisterWizardPages() { Iterator<WizardPage> i = this.getCurrentWizard().getPages(); while (i.hasNext()) { WizardPage page = i.next(); this.unregisterWizardPage(page.getIdentifier()); } } /** * Handles registration of a new account wizard. */ public void serviceChanged(ServiceEvent event) { if(!GuiActivator.isStarted) return; ServiceReference<?> serRef = event.getServiceReference(); Object sService = GuiActivator.bundleContext.getService(serRef); // we don't care if the source service is not a plugin component if (! (sService instanceof AccountRegistrationWizard)) return; String protocolName = (String) serRef.getProperty(ProtocolProviderFactory.PROTOCOL); AccountRegistrationWizard wizard = (AccountRegistrationWizard) sService; switch (event.getType()) { case ServiceEvent.REGISTERED: logger.info("Handling registration of a new Account Wizard."); addAccountRegistrationWizard(protocolName, wizard); break; case ServiceEvent.UNREGISTERING: removeAccountRegistrationWizard(protocolName, wizard); break; } } /** * Implements the <tt>SIPCommDialog</tt> close method. */ @Override protected void close(boolean isEscaped) { summaryPage.dispose(); } }