/*
* This file is part of muCommander, http://www.mucommander.com
* Copyright (C) 2002-2012 Maxence Bernard
*
* muCommander is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* muCommander is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.mucommander.ui.dialog.server;
import com.mucommander.commons.file.Credentials;
import com.mucommander.commons.file.FileURL;
import com.mucommander.commons.file.connection.ConnectionHandler;
import com.mucommander.commons.file.connection.ConnectionPool;
import com.mucommander.text.Translator;
import com.mucommander.ui.action.ActionProperties;
import com.mucommander.ui.action.impl.ShowServerConnectionsAction;
import com.mucommander.ui.dialog.FocusDialog;
import com.mucommander.ui.helper.MnemonicHelper;
import com.mucommander.ui.layout.XBoxPanel;
import com.mucommander.ui.main.MainFrame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* This dialog shows a list of server connections and allows the user to close/disconnect them.
*
* @author Maxence Bernard
*/
public class ShowServerConnectionsDialog extends FocusDialog implements ActionListener {
private MainFrame mainFrame;
private JList connectionList;
private java.util.List<ConnectionHandler> connections;
private JButton disconnectButton;
private JButton goToButton;
private JButton closeButton;
// Dialog's size has to be at least 400x300
private final static Dimension MINIMUM_DIALOG_DIMENSION = new Dimension(400,300);
// Dialog's size has to be at most 600x400
private final static Dimension MAXIMUM_DIALOG_DIMENSION = new Dimension(600,400);
public ShowServerConnectionsDialog(MainFrame mainFrame) {
super(mainFrame, ActionProperties.getActionLabel(ShowServerConnectionsAction.Descriptor.ACTION_ID), mainFrame);
this.mainFrame = mainFrame;
Container contentPane = getContentPane();
// Add the list of server connections
connections = ConnectionPool.getConnectionHandlersSnapshot();
connectionList = new JList(new AbstractListModel() {
public int getSize() {
return connections.size();
}
public Object getElementAt(int i) {
ConnectionHandler connHandler = connections.get(i);
// Show login (but not password) in the URL
// Note: realm returned by ConnectionHandler does not contain credentials
FileURL clonedRealm = (FileURL)connHandler.getRealm().clone();
Credentials loginCredentials = new Credentials(connHandler.getCredentials().getLogin(), "");
clonedRealm.setCredentials(loginCredentials);
return clonedRealm.toString(true)
+" ("+Translator.get(connHandler.isLocked()?"server_connections_dialog.connection_busy":"server_connections_dialog.connection_idle")+")";
}
});
// Only one list index can be selected at a time
connectionList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// Select the first connection in the list
boolean hasConnections = connections.size()>0;
if(hasConnections)
connectionList.setSelectedIndex(0);
contentPane.add(
new JScrollPane(connectionList, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED),
BorderLayout.CENTER);
// Add buttons
XBoxPanel buttonsPanel = new XBoxPanel();
JPanel buttonGroupPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
MnemonicHelper mnemonicHelper = new MnemonicHelper();
// Disconnect button
disconnectButton = new JButton(Translator.get("server_connections_dialog.disconnect"));
disconnectButton.setMnemonic(mnemonicHelper.getMnemonic(disconnectButton));
disconnectButton.setEnabled(hasConnections);
if(hasConnections)
disconnectButton.addActionListener(this);
buttonGroupPanel.add(disconnectButton);
// Go to button
goToButton = new JButton(Translator.get("go_to"));
goToButton.setMnemonic(mnemonicHelper.getMnemonic(goToButton));
goToButton.setEnabled(hasConnections);
if(hasConnections)
goToButton.addActionListener(this);
buttonGroupPanel.add(goToButton);
buttonsPanel.add(buttonGroupPanel);
// Button that closes the window
closeButton = new JButton(Translator.get("close"));
closeButton.setMnemonic(mnemonicHelper.getMnemonic(closeButton));
closeButton.addActionListener(this);
buttonsPanel.add(Box.createHorizontalGlue());
buttonsPanel.add(closeButton);
contentPane.add(buttonsPanel, BorderLayout.SOUTH);
// Connections list will receive initial focus
setInitialFocusComponent(connectionList);
// Selects 'Done' button when enter is pressed
getRootPane().setDefaultButton(closeButton);
// Packs dialog
setMinimumSize(MINIMUM_DIALOG_DIMENSION);
setMaximumSize(MAXIMUM_DIALOG_DIMENSION);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
showDialog();
}
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
// Disconnects the selected connection
if(source==disconnectButton) {
int selectedIndex = connectionList.getSelectedIndex();
if(selectedIndex>=0 && selectedIndex<connections.size()) {
final ConnectionHandler connHandler = connections.get(selectedIndex);
// Close connection in a separate thread as I/O can lock.
// Todo: Add a confirmation dialog if the connection is active as it will stop whatever the connection is currently doing
new Thread(){
@Override
public void run() {
connHandler.closeConnection();
}
}.start();
// Remove connection from the list
connections.remove(selectedIndex);
connectionList.setSelectedIndex(Math.min(selectedIndex, connections.size()));
connectionList.repaint();
// Disable contextual butons if there are no more connections
if(connections.size()==0) {
disconnectButton.setEnabled(false);
goToButton.setEnabled(false);
}
}
}
// Goes to the selected connection
else if (source==goToButton) {
// Dispose the dialog first
dispose();
int selectedIndex = connectionList.getSelectedIndex();
if(selectedIndex>=0 && selectedIndex<connections.size())
mainFrame.getActivePanel().tryChangeCurrentFolder(connections.get(selectedIndex).getRealm());
}
// Dispose the dialog
else if (source==closeButton) {
dispose();
}
}
}