From bf3fd3dcdaa47ef8a5e246c5af9915e052d7aa74 Mon Sep 17 00:00:00 2001 From: Yana Stamcheva Date: Thu, 24 Feb 2011 13:48:24 +0000 Subject: Allow to enable provisioning when you start jitsi for the first time. As part of the solution proposed by Conrad Beckert on dev (subject: "Re: Updates to the Provisioning Plugin"). --- resources/languages/resources.properties | 2 + .../sip/communicator/impl/gui/UIServiceImpl.java | 19 ++- .../impl/gui/main/chat/toolBars/MainToolBar.java | 3 +- .../impl/gui/main/configforms/ConfigFormList.java | 54 ++++++-- .../gui/main/configforms/ConfigurationFrame.java | 10 +- .../impl/gui/main/menus/ToolsMenu.java | 2 +- .../impl/osdependent/jdic/TrayMenuFactory.java | 2 +- .../advancedconfig/AdvancedConfigActivator.java | 7 +- .../advancedconfig/AdvancedConfigurationPanel.java | 76 +++++++++++- .../plugin/provisioning/ProvisioningForm.java | 14 +++ .../InitialAccountRegistrationFrame.java | 60 ++++++++- .../SimpleAccountRegistrationActivator.java | 138 +++++++++++++++++++++ .../service/gui/ConfigurationContainer.java | 21 ++++ .../service/gui/LazyConfigurationForm.java | 2 +- .../sip/communicator/service/gui/UIService.java | 12 ++ 15 files changed, 393 insertions(+), 29 deletions(-) create mode 100644 src/net/java/sip/communicator/service/gui/ConfigurationContainer.java diff --git a/resources/languages/resources.properties b/resources/languages/resources.properties index 9f82a64..1c646a0 100644 --- a/resources/languages/resources.properties +++ b/resources/languages/resources.properties @@ -430,6 +430,7 @@ service.gui.ACCOUNT_CREATION_FAILED=We failed to create your account due to the service.gui.UNKNOWN=Unknown user service.gui.UNKNOWN_STATUS=Unknown state service.gui.UNREGISTERED_MESSAGE=Unable to connect the following account: User name: {0}, Server name: {1}. You are currently offline. +service.gui.USE_PROVISIONING=Use online provisioning service.gui.VIDEO_CALL=&Video call service.gui.VIA_SMS=Via SMS service.gui.VIEW=&View @@ -1112,6 +1113,7 @@ plugin.provisioning.DNS=DNS plugin.provisioning.BONJOUR=Bonjour plugin.provisioning.MANUAL=Manually specify a provisioning URI plugin.provisioning.URI=URI +plugin.provisioning.RESTART_WARNING=Note that your changes will take effect on next restart! # packet logging service plugin.loggingutils.PACKET_LOGGING_CONFIG=Logging diff --git a/src/net/java/sip/communicator/impl/gui/UIServiceImpl.java b/src/net/java/sip/communicator/impl/gui/UIServiceImpl.java index 61e4450..5598538 100644 --- a/src/net/java/sip/communicator/impl/gui/UIServiceImpl.java +++ b/src/net/java/sip/communicator/impl/gui/UIServiceImpl.java @@ -1131,9 +1131,26 @@ public class UIServiceImpl */ public void setConfigurationWindowVisible(boolean visible) { + if (isVisible() && configurationFrame == null) + configurationFrame = new ConfigurationFrame(mainFrame); + + if (configurationFrame != null) + configurationFrame.setVisible(visible); + } + + /** + * Returns the ConfigurationContainer associated with this + * UIService. + * + * @return the ConfigurationContainer associated with this + * UIService + */ + public ConfigurationContainer getConfigurationContainer() + { if (configurationFrame == null) configurationFrame = new ConfigurationFrame(mainFrame); - configurationFrame.setVisible(visible); + + return configurationFrame; } /** diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/toolBars/MainToolBar.java b/src/net/java/sip/communicator/impl/gui/main/chat/toolBars/MainToolBar.java index 33db564..9966384 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/toolBars/MainToolBar.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/toolBars/MainToolBar.java @@ -557,7 +557,8 @@ public class MainToolBar } else if (buttonText.equals("options")) { - GuiActivator.getUIService().setConfigurationWindowVisible(true); + GuiActivator.getUIService() + .getConfigurationContainer().setVisible(true); } else if (buttonText.equals("font")) chatPanel.showFontChooserDialog(); diff --git a/src/net/java/sip/communicator/impl/gui/main/configforms/ConfigFormList.java b/src/net/java/sip/communicator/impl/gui/main/configforms/ConfigFormList.java index 09b08cd..2f48398 100644 --- a/src/net/java/sip/communicator/impl/gui/main/configforms/ConfigFormList.java +++ b/src/net/java/sip/communicator/impl/gui/main/configforms/ConfigFormList.java @@ -70,19 +70,24 @@ public class ConfigFormList */ public void removeConfigForm(ConfigurationForm configForm) { - for(int count = listModel.getSize(), i = count - 1; i >= 0; i--) - { - ConfigFormDescriptor descriptor - = (ConfigFormDescriptor) listModel.get(i); + ConfigFormDescriptor descriptor = findDescriptor(configForm); - if(descriptor.getConfigForm().equals(configForm)) - { - listModel.remove(i); - /* - * TODO We may just consider not allowing duplicates on addition - * and then break here. - */ - } + if (descriptor != null) + listModel.removeElement(descriptor); + } + + /** + * Selects the given ConfigurationForm. + * + * @param configForm the ConfigurationForm to select + */ + public void setSelected(ConfigurationForm configForm) + { + ConfigFormDescriptor descriptor = findDescriptor(configForm); + + if (descriptor != null) + { + setSelectedValue(descriptor, true); } } @@ -100,4 +105,29 @@ public class ConfigFormList configFrame.showFormContent(configFormDescriptor); } } + + /** + * Finds the list descriptor corresponding the given + * ConfigurationForm. + * + * @param configForm the ConfigurationForm, which descriptor we're + * looking for + * @return the list descriptor corresponding the given + * ConfigurationForm + */ + private ConfigFormDescriptor findDescriptor(ConfigurationForm configForm) + { + for(int i = 0; i < listModel.getSize(); i++) + { + ConfigFormDescriptor descriptor + = (ConfigFormDescriptor) listModel.getElementAt(i); + + if(descriptor.getConfigForm().equals(configForm)) + { + return descriptor; + } + } + + return null; + } } diff --git a/src/net/java/sip/communicator/impl/gui/main/configforms/ConfigurationFrame.java b/src/net/java/sip/communicator/impl/gui/main/configforms/ConfigurationFrame.java index adbc347..31b2aaa 100644 --- a/src/net/java/sip/communicator/impl/gui/main/configforms/ConfigurationFrame.java +++ b/src/net/java/sip/communicator/impl/gui/main/configforms/ConfigurationFrame.java @@ -29,7 +29,8 @@ import com.explodingpixels.macwidgets.*; */ public class ConfigurationFrame extends SIPCommDialog - implements ServiceListener + implements ConfigurationContainer, + ServiceListener { /** * The Logger used by the ConfigurationFrame class and its @@ -231,7 +232,7 @@ public class ConfigurationFrame */ public void setVisible(boolean isVisible) { - if (isVisible) + if (isVisible && configList.getSelectedIndex() < 0) { this.configList.setSelectedIndex(0); } @@ -320,4 +321,9 @@ public class ConfigurationFrame { configList.removeConfigForm(configForm); } + + public void setSelected(ConfigurationForm configForm) + { + configList.setSelected(configForm); + } } diff --git a/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java b/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java index 8981259..4a37678 100644 --- a/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java +++ b/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java @@ -173,7 +173,7 @@ public class ToolsMenu */ void configActionPerformed() { - GuiActivator.getUIService().setConfigurationWindowVisible(true); + GuiActivator.getUIService().getConfigurationContainer().setVisible(true); } /** diff --git a/src/net/java/sip/communicator/impl/osdependent/jdic/TrayMenuFactory.java b/src/net/java/sip/communicator/impl/osdependent/jdic/TrayMenuFactory.java index ed43218..6f97465 100644 --- a/src/net/java/sip/communicator/impl/osdependent/jdic/TrayMenuFactory.java +++ b/src/net/java/sip/communicator/impl/osdependent/jdic/TrayMenuFactory.java @@ -49,7 +49,7 @@ public final class TrayMenuFactory if (itemName.equals("settings")) { OsDependentActivator.getUIService() - .setConfigurationWindowVisible(true); + .getConfigurationContainer().setVisible(true); } else if (itemName.equals("service.gui.QUIT")) { diff --git a/src/net/java/sip/communicator/plugin/advancedconfig/AdvancedConfigActivator.java b/src/net/java/sip/communicator/plugin/advancedconfig/AdvancedConfigActivator.java index abf9b26..5dfc8e4 100644 --- a/src/net/java/sip/communicator/plugin/advancedconfig/AdvancedConfigActivator.java +++ b/src/net/java/sip/communicator/plugin/advancedconfig/AdvancedConfigActivator.java @@ -47,12 +47,7 @@ public class AdvancedConfigActivator bundleContext .registerService( ConfigurationForm.class.getName(), - new LazyConfigurationForm( - "net.java.sip.communicator.plugin.advancedconfig.AdvancedConfigurationPanel", - getClass().getClassLoader(), - "plugin.advancedconfig.PLUGIN_ICON", - "service.gui.ADVANCED", - 300), + new AdvancedConfigurationPanel(), properties); if (logger.isInfoEnabled()) diff --git a/src/net/java/sip/communicator/plugin/advancedconfig/AdvancedConfigurationPanel.java b/src/net/java/sip/communicator/plugin/advancedconfig/AdvancedConfigurationPanel.java index ef07e3b..aad5dd9 100644 --- a/src/net/java/sip/communicator/plugin/advancedconfig/AdvancedConfigurationPanel.java +++ b/src/net/java/sip/communicator/plugin/advancedconfig/AdvancedConfigurationPanel.java @@ -24,7 +24,9 @@ import org.osgi.framework.*; */ public class AdvancedConfigurationPanel extends TransparentPanel - implements ServiceListener, + implements ConfigurationForm, + ConfigurationContainer, + ServiceListener, ListSelectionListener { /** @@ -181,8 +183,20 @@ public class AdvancedConfigurationPanel break; } listModel.add(i, configForm); + } - configList.setSelectedIndex(0); + /** + * Implements ApplicationWindow.show method. + * + * @param isVisible specifies whether the frame is to be visible or not. + */ + public void setVisible(boolean isVisible) + { + if (isVisible && configList.getSelectedIndex() < 0) + { + this.configList.setSelectedIndex(0); + } + super.setVisible(isVisible); } /** @@ -306,4 +320,62 @@ public class AdvancedConfigurationPanel showFormContent(configForm); } } + + /** + * Selects the given ConfigurationForm. + * + * @param configForm the ConfigurationForm to select + */ + public void setSelected(ConfigurationForm configForm) + { + configList.setSelectedValue(configForm, true); + } + + /** + * Returns the title of the form. + * @return the title of the form + */ + public String getTitle() + { + return AdvancedConfigActivator.getResources() + .getI18NString("service.gui.ADVANCED"); + } + + /** + * Returns the icon of the form. + * @return a byte array containing the icon of the form + */ + public byte[] getIcon() + { + return AdvancedConfigActivator.getResources() + .getImageInBytes("plugin.advancedconfig.PLUGIN_ICON"); + } + + /** + * Returns the form component. + * @return the form component + */ + public Object getForm() + { + return this; + } + + /** + * Returns the index of the form in its parent container. + * @return the index of the form in its parent container + */ + public int getIndex() + { + return 300; + } + + /** + * Indicates if the form is an advanced form. + * @return true to indicate that this is an advanced form, + * otherwise returns false + */ + public boolean isAdvanced() + { + return true; + } } diff --git a/src/net/java/sip/communicator/plugin/provisioning/ProvisioningForm.java b/src/net/java/sip/communicator/plugin/provisioning/ProvisioningForm.java index 39f429f..e91bc5a 100644 --- a/src/net/java/sip/communicator/plugin/provisioning/ProvisioningForm.java +++ b/src/net/java/sip/communicator/plugin/provisioning/ProvisioningForm.java @@ -142,6 +142,20 @@ public class ProvisioningForm c.gridy = 3; mainPanel.add(uriField, c); + JTextPane pane = new JTextPane(); + pane.setForeground(Color.RED); + pane.setEditable(false); + pane.setOpaque(false); + pane.setText(ProvisioningActivator.getResourceService().getI18NString( + "plugin.provisioning.RESTART_WARNING")); + + c.fill = GridBagConstraints.HORIZONTAL; + c.weightx = 1.0; + c.insets = new Insets(30, 10, 0, 0); + c.gridx = 0; + c.gridy = 4; + mainPanel.add(pane, c); + initButtonStates(); initListeners(); } diff --git a/src/net/java/sip/communicator/plugin/simpleaccreg/InitialAccountRegistrationFrame.java b/src/net/java/sip/communicator/plugin/simpleaccreg/InitialAccountRegistrationFrame.java index f02fd64..9ce5a7c 100644 --- a/src/net/java/sip/communicator/plugin/simpleaccreg/InitialAccountRegistrationFrame.java +++ b/src/net/java/sip/communicator/plugin/simpleaccreg/InitialAccountRegistrationFrame.java @@ -68,8 +68,6 @@ public class InitialAccountRegistrationFrame = new TransparentPanel(new BorderLayout()); mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - - JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); JButton cancelButton = new JButton(Resources.getString("service.gui.CANCEL")); @@ -94,6 +92,8 @@ public class InitialAccountRegistrationFrame mainAccountsPanel.add(accountsPanel, BorderLayout.CENTER); + initProvisioningPanel(); + mainAccountsPanel.setOpaque(false); accountsPanel.setOpaque(false); buttonPanel.setOpaque(false); @@ -137,6 +137,62 @@ public class InitialAccountRegistrationFrame } } + /** + * Initializes the provisioning panel. + */ + private void initProvisioningPanel() + { + JPanel provisioningPanel = new TransparentPanel(); + + final JLabel provisioningLabel = + new JLabel("" + + SimpleAccountRegistrationActivator + .getResources().getI18NString("service.gui.USE_PROVISIONING") + + ""); + + provisioningLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); + provisioningLabel.setToolTipText( + SimpleAccountRegistrationActivator + .getResources().getI18NString("service.gui.USE_PROVISIONING")); + + provisioningLabel.addMouseListener(new MouseAdapter() + { + 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); + } + }); + + provisioningPanel.add(provisioningLabel); + + mainAccountsPanel.add(provisioningPanel, BorderLayout.SOUTH); + } + private void initAccountWizards() { String simpleWizards diff --git a/src/net/java/sip/communicator/plugin/simpleaccreg/SimpleAccountRegistrationActivator.java b/src/net/java/sip/communicator/plugin/simpleaccreg/SimpleAccountRegistrationActivator.java index b5e8f3a..3c35917 100644 --- a/src/net/java/sip/communicator/plugin/simpleaccreg/SimpleAccountRegistrationActivator.java +++ b/src/net/java/sip/communicator/plugin/simpleaccreg/SimpleAccountRegistrationActivator.java @@ -12,18 +12,38 @@ import java.util.*; 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.service.resources.*; import net.java.sip.communicator.util.*; import org.osgi.framework.*; +/** + * + * @author Yana Stamcheva + */ public class SimpleAccountRegistrationActivator implements BundleActivator { private static final Logger logger = Logger.getLogger(SimpleAccountRegistrationActivator.class); + /** + * Advanced config form class name. + */ + private static final String advancedConfigFormClassName + = "net.java.sip.communicator.plugin" + + ".advancedconfig.AdvancedConfigurationPanel"; + + /** + * Provisioning form class name. + */ + private static final String provisioningFormClassName + = "net.java.sip.communicator.plugin.provisioning.ProvisioningForm"; + public static BundleContext bundleContext; + private static ResourceManagementService resourcesService; + public void start(BundleContext bc) throws Exception { bundleContext = bc; @@ -172,4 +192,122 @@ public class SimpleAccountRegistrationActivator return (UIService) bundleContext .getService(serviceReference); } + + /** + * Returns the ResourceManagementService, through which we will + * access all resources. + * + * @return the ResourceManagementService, through which we will + * access all resources. + */ + public static ResourceManagementService getResources() + { + if (resourcesService == null) + { + resourcesService + = ServiceUtils.getService( + bundleContext, + ResourceManagementService.class); + } + return resourcesService; + } + + /** + * Returns the first available advanced configuration form. + * + * @return the first available advanced configuration form + */ + public static ConfigurationForm getAdvancedConfigForm() + { + // General configuration forms only. + String osgiFilter = "(" + + ConfigurationForm.FORM_TYPE + + "="+ConfigurationForm.GENERAL_TYPE+")"; + + ServiceReference[] confFormsRefs = null; + try + { + confFormsRefs = bundleContext + .getServiceReferences( + ConfigurationForm.class.getName(), + osgiFilter); + } + catch (InvalidSyntaxException ex) + {} + + if(confFormsRefs != null) + { + for (int i = 0; i < confFormsRefs.length; i++) + { + ConfigurationForm form + = (ConfigurationForm) bundleContext + .getService(confFormsRefs[i]); + + if (form instanceof LazyConfigurationForm) + { + LazyConfigurationForm lazyConfigForm + = (LazyConfigurationForm) form; + + if (lazyConfigForm.getFormClassName().equals( + advancedConfigFormClassName)) + return form; + } + else if (form.getClass().getName().equals( + advancedConfigFormClassName)) + { + return form; + } + } + } + + return null; + } + + /** + * Returns the first available provisioning configuration form. + * + * @return the first available provisioning configuration form + */ + public static ConfigurationForm getProvisioningConfigForm() + { + // General configuration forms only. + String osgiFilter = "(" + + ConfigurationForm.FORM_TYPE + + "="+ConfigurationForm.ADVANCED_TYPE+")"; + + ServiceReference[] confFormsRefs = null; + try + { + confFormsRefs = bundleContext + .getServiceReferences( + ConfigurationForm.class.getName(), + osgiFilter); + } + catch (InvalidSyntaxException ex) + {} + + if(confFormsRefs != null) + { + for (int i = 0; i < confFormsRefs.length; i++) + { + ConfigurationForm form + = (ConfigurationForm) bundleContext + .getService(confFormsRefs[i]); + + if (form instanceof LazyConfigurationForm) + { + LazyConfigurationForm lazyConfigForm + = (LazyConfigurationForm) form; + + if (lazyConfigForm.getFormClassName().equals( + provisioningFormClassName)) + { + return form; + } + } + } + } + + return null; + } } diff --git a/src/net/java/sip/communicator/service/gui/ConfigurationContainer.java b/src/net/java/sip/communicator/service/gui/ConfigurationContainer.java new file mode 100644 index 0000000..ed94a1b --- /dev/null +++ b/src/net/java/sip/communicator/service/gui/ConfigurationContainer.java @@ -0,0 +1,21 @@ +package net.java.sip.communicator.service.gui; + +public interface ConfigurationContainer +{ + /** + * Shows or hides this configuration container depending on the value of + * parameter visible. + * + * @param visible if true, shows the main application window; + * otherwise, hides the main application window. + */ + public void setVisible(boolean visible); + + /** + * Selects the given ConfigurationForm if it exists in this + * container. + * + * @param configForm the ConfigurationForm to select + */ + public void setSelected(ConfigurationForm configForm); +} diff --git a/src/net/java/sip/communicator/service/gui/LazyConfigurationForm.java b/src/net/java/sip/communicator/service/gui/LazyConfigurationForm.java index 9208450..7ae01b6 100644 --- a/src/net/java/sip/communicator/service/gui/LazyConfigurationForm.java +++ b/src/net/java/sip/communicator/service/gui/LazyConfigurationForm.java @@ -158,7 +158,7 @@ public class LazyConfigurationForm * Returns the form class name. * @return the form class name */ - protected String getFormClassName() + public String getFormClassName() { return formClassName; } diff --git a/src/net/java/sip/communicator/service/gui/UIService.java b/src/net/java/sip/communicator/service/gui/UIService.java index 3c90878..b3705ec 100644 --- a/src/net/java/sip/communicator/service/gui/UIService.java +++ b/src/net/java/sip/communicator/service/gui/UIService.java @@ -372,10 +372,22 @@ public interface UIService * * @param visible true to show the "Tools > Settings" * configuration window; false to hide it + * + * @deprecated instead use getConfigurationContainer().setVisible(visible) */ + @Deprecated public void setConfigurationWindowVisible(boolean visible); /** + * Returns the ConfigurationContainer associated with this + * UIService. + * + * @return the ConfigurationContainer associated with this + * UIService + */ + public ConfigurationContainer getConfigurationContainer(); + + /** * Adds the given WindowListener listening for events triggered * by the main UIService component. This is normally the main application * window component, the one containing the contact list. This listener -- cgit v1.1