/*
* 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.event.*;
import java.beans.*;
import java.util.List;
import javax.swing.*;
import javax.swing.event.*;
import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.account.*;
import org.jitsi.service.configuration.*;
import org.jitsi.service.resources.*;
/**
* The <tt>AccountsConfigurationPanel</tt> is the panel containing the accounts
* list and according buttons shown in the options form.
*
* @author Yana Stamcheva
* @author Lubomir Marinov
*/
public class AccountsConfigurationPanel
extends TransparentPanel
implements ActionListener,
ListSelectionListener,
PropertyChangeListener
{
private final AccountList accountList;
private final JButton newButton =
new JButton(GuiActivator.getResources().getI18NString(
"service.gui.ADD"));
private final JButton editButton =
new JButton(GuiActivator.getResources().getI18NString(
"service.gui.EDIT"));
private final JButton removeButton =
new JButton(GuiActivator.getResources().getI18NString(
"service.gui.DELETE"));
/**
* Creates and initializes this account configuration panel.
*/
public AccountsConfigurationPanel()
{
super(new BorderLayout());
accountList = new AccountList(this);
/*
* It seems that we can only delete one account at a time because our
* confirmation dialog asks for one account.
*/
accountList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.setPreferredSize(new Dimension(500, 400));
JScrollPane accountListPane = new JScrollPane();
accountListPane.getViewport().add(accountList);
accountListPane.getVerticalScrollBar().setUnitIncrement(30);
this.add(accountListPane, BorderLayout.CENTER);
JPanel buttonsPanel =
new TransparentPanel(new FlowLayout(FlowLayout.RIGHT));
newButton.addActionListener(this);
editButton.addActionListener(this);
removeButton.addActionListener(this);
this.newButton.setMnemonic(GuiActivator.getResources().getI18nMnemonic(
"service.gui.ADD"));
this.editButton
.setMnemonic(GuiActivator.getResources().getI18nMnemonic(
"service.gui.EDIT"));
this.removeButton
.setMnemonic(GuiActivator.getResources().getI18nMnemonic(
"service.gui.DELETE"));
buttonsPanel.add(newButton);
buttonsPanel.add(editButton);
buttonsPanel.add(removeButton);
this.add(buttonsPanel, BorderLayout.SOUTH);
accountList.addListSelectionListener(this);
accountList.addPropertyChangeListener(
AccountList.ACCOUNT_STATE_CHANGED, this);
updateButtons();
}
/**
* Handles the <tt>ActionEvent</tt> triggered when user clicks on on the
* buttons. Shows the account registration wizard when user clicks on "New".
*
* @param evt the action event that has just occurred.
*/
public void actionPerformed(ActionEvent evt)
{
Object sourceButton = evt.getSource();
if (sourceButton.equals(newButton))
{
NewAccountDialog.showNewAccountDialog();
}
else if (sourceButton.equals(removeButton))
{
Account account = accountList.getSelectedAccount();
if (account == null)
return;
AccountID accountID = account.getAccountID();
ProtocolProviderFactory providerFactory =
AccountUtils.getProtocolProviderFactory(
accountID.getProtocolName());
if (providerFactory != null)
{
int result = JOptionPane.showConfirmDialog(
this,
GuiActivator.getResources()
.getI18NString("service.gui.REMOVE_ACCOUNT_MESSAGE"),
GuiActivator.getResources().getI18NString(
"service.gui.REMOVE_ACCOUNT"),
JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION)
{
ConfigurationService configService
= GuiActivator.getConfigurationService();
String prefix
= "net.java.sip.communicator.impl.gui.accounts";
List<String> accounts
= configService.getPropertyNamesByPrefix(prefix, true);
for (String accountRootPropName : accounts)
{
String accountUID
= configService.getString(accountRootPropName);
if (accountUID.equals(accountID.getAccountUniqueID()))
{
configService.setProperty(accountRootPropName, null);
break;
}
}
boolean isUninstalled
= providerFactory.uninstallAccount(accountID);
if (isUninstalled)
{
accountList.ensureAccountRemoved(accountID);
// Notify the corresponding wizard that the account
// would be removed.
AccountRegWizardContainerImpl wizardContainer
= (AccountRegWizardContainerImpl) GuiActivator
.getUIService().getAccountRegWizardContainer();
ProtocolProviderService protocolProvider =
account.getProtocolProvider();
AccountRegistrationWizard wizard =
wizardContainer.getProtocolWizard(protocolProvider);
if (wizard != null)
wizard.accountRemoved(protocolProvider);
}
}
}
}
else if (sourceButton.equals(editButton))
{
Account account = accountList.getSelectedAccount();
if (account == null)
return;
AccountRegWizardContainerImpl wizard =
(AccountRegWizardContainerImpl) GuiActivator.getUIService()
.getAccountRegWizardContainer();
AccountRegistrationWizard protocolWizard =
wizard.getProtocolWizard(account.getProtocolProvider());
ResourceManagementService resources = GuiActivator.getResources();
if (protocolWizard != null)
{
wizard.setTitle(resources.getI18NString(
"service.gui.ACCOUNT_REGISTRATION_WIZARD"));
wizard.modifyAccount(account.getProtocolProvider());
wizard.showDialog(false);
}
else
{
// There is no wizard for this account - just show an error
// dialog:
String title = resources.getI18NString("service.gui.ERROR");
String message =
resources.getI18NString("service.gui.EDIT_NOT_SUPPORTED");
ErrorDialog dialog = new ErrorDialog(null, title, message);
dialog.setVisible(true);
}
}
}
/**
* Returns the edit button.
*
* @return the edit button
*/
public JButton getEditButton()
{
return editButton;
}
/**
* Updates enabled states of the buttons of this
* <tt>AccountsConfigurationPanel</tt> to reflect their applicability to the
* current selection in <tt>accountList</tt>.
*/
private void updateButtons()
{
if(!SwingUtilities.isEventDispatchThread())
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
updateButtons();
}
});
return;
}
Account account = accountList.getSelectedAccount();
boolean enabled = (account != null);
editButton.setEnabled(enabled && account.isEnabled());
removeButton.setEnabled(enabled);
}
/**
* Implements ListSelectionListener#valueChanged(ListSelectionEvent).
* @param e the <tt>ListSelectionEvent</tt> that notified us
*/
public void valueChanged(ListSelectionEvent e)
{
if (!e.getValueIsAdjusting())
updateButtons();
}
/**
* This method gets called when a property is changed.
*
* @param evt A PropertyChangeEvent object describing the event source
* and the property that has changed.
*/
public void propertyChange(PropertyChangeEvent evt)
{
// update buttons whenever an account changes its state
updateButtons();
}
}