/*
* Copyright 2012 jMethods, Inc.
*
* 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 com.myjavaworld.jftp;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.ResourceBundle;
import javax.swing.AbstractListModel;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.myjavaworld.gui.GUIUtil;
import com.myjavaworld.gui.ImageCellRenderer;
import com.myjavaworld.gui.MButton;
import com.myjavaworld.gui.MDialog;
import com.myjavaworld.gui.MList;
import com.myjavaworld.gui.MScrollPane;
import com.myjavaworld.util.CommonResources;
import com.myjavaworld.util.ResourceLoader;
/**
* A central point for managing favourites.
*
* @author Sai Pullabhotla, psai [at] jMethods [dot] com
* @version 2.0
*
*/
public class FavoritesDlg extends MDialog implements ActionListener,
ListSelectionListener, MouseListener {
private static final ResourceBundle resources = ResourceLoader
.getBundle("com.myjavaworld.jftp.FavoritesDlg");
private static final String HELP_ID = "favorites.favoritesManager";
private JFTP jftp = null;
private MList listFavorites = null;
private FavoritesListModel model = null;
private MButton butAdd = null;
private MButton butEdit = null;
private MButton butDelete = null;
private MButton butConnect = null;
private MButton butClose = null;
private MButton butHelp = null;
/**
* Creates an instance of <code>FavoritesDlg</code>.
*
* @param jftp
* JFTP main window
*
*/
public FavoritesDlg(JFTP jftp) {
super(jftp);
this.jftp = jftp;
setTitle(resources.getString("title.dialog"));
setModal(true);
getContentPane().setLayout(new GridBagLayout());
JFTPHelp2.getInstance().enableHelpKey(getRootPane(), HELP_ID);
initComponents();
loadFavorites();
pack();
}
public void actionPerformed(ActionEvent evt) {
if (evt.getSource() == butAdd) {
addButtonPressed();
} else if (evt.getSource() == butEdit) {
editButtonPressed();
} else if (evt.getSource() == butDelete) {
deleteButtonPressed();
} else if (evt.getSource() == butClose) {
saveFavorites();
setVisible(false);
} else if (evt.getSource() == butConnect) {
connectButtonPressed();
}
}
@Override
public void windowClosing(WindowEvent evt) {
saveFavorites();
super.windowClosing(evt);
}
public void valueChanged(ListSelectionEvent listSelectionEvent) {
int[] selectedIndices = listFavorites.getSelectedIndices();
if (selectedIndices == null || selectedIndices.length == 0) {
butAdd.setEnabled(true);
butEdit.setEnabled(false);
butDelete.setEnabled(false);
butConnect.setEnabled(false);
} else if (selectedIndices.length == 1) {
butAdd.setEnabled(true);
butEdit.setEnabled(true);
butDelete.setEnabled(true);
butConnect.setEnabled(true);
} else if (selectedIndices.length > 1) {
butAdd.setEnabled(true);
butEdit.setEnabled(false);
butDelete.setEnabled(true);
butConnect.setEnabled(false);
}
}
@Override
public void windowOpened(WindowEvent evt) {
valueChanged(null);
}
public void mouseClicked(MouseEvent evt) {
if (evt.getClickCount() == 2) {
int index = listFavorites.locationToIndex(evt.getPoint());
if (index < 0) {
return;
}
connectButtonPressed();
}
}
public void mouseEntered(MouseEvent evt) {
}
public void mouseExited(MouseEvent evt) {
}
public void mousePressed(MouseEvent evt) {
}
public void mouseReleased(MouseEvent evt) {
}
@Override
protected void escape() {
butClose.doClick();
}
private void addButtonPressed() {
FavoritePropertiesDlg dlg = new FavoritePropertiesDlg(this,
FavoritePropertiesDlg.ADD_MODE);
Favorite favorite = new Favorite();
favorite.setFTPClientClassName(JFTP.prefs.getClient());
favorite.setListParserClassName(JFTP.prefs.getListParser());
favorite.setPassive(JFTP.prefs.isPassive());
dlg.setFavorite(favorite);
dlg.setLocationRelativeTo(this);
dlg.setVisible(true);
favorite = dlg.getFavorite();
dlg.dispose();
if (favorite != null) {
if (!model.contains(favorite)) {
model.add(favorite);
listFavorites.setSelectedValue(favorite, true);
} else {
GUIUtil.showError(this,
resources.getString("error.duplicateFavorite"));
listFavorites.clearSelection();
}
}
}
private void editButtonPressed() {
int selectedIndex = listFavorites.getSelectedIndex();
if (selectedIndex < 0) {
return;
}
Favorite selectedFavorite = (Favorite) (model.get(selectedIndex));
FavoritePropertiesDlg dlg = new FavoritePropertiesDlg(this,
FavoritePropertiesDlg.EDIT_MODE);
dlg.setFavorite(selectedFavorite);
dlg.setLocationRelativeTo(this);
dlg.setVisible(true);
Favorite favorite = dlg.getFavorite();
dlg.dispose();
if (favorite != null) {
if (!(model.contains(favorite) && !favorite.getName()
.equalsIgnoreCase(selectedFavorite.getName()))) {
model.set(selectedIndex, favorite);
listFavorites.setSelectedValue(favorite, true);
} else {
GUIUtil.showError(this,
resources.getString("error.duplicateFavorite"));
listFavorites.clearSelection();
}
}
}
private void deleteButtonPressed() {
Object[] selectedObjects = listFavorites.getSelectedValues();
if (selectedObjects == null || selectedObjects.length == 0) {
return;
}
int option = GUIUtil.showConfirmation(this,
resources.getString("confirm.deleteFavorites"));
if (option != JOptionPane.YES_OPTION) {
return;
}
java.util.List list = new ArrayList(selectedObjects.length);
for (int i = 0; i < selectedObjects.length; i++) {
list.add(selectedObjects[i]);
}
model.delete(list);
listFavorites.clearSelection();
}
private void connectButtonPressed() {
int selectedIndex = listFavorites.getSelectedIndex();
if (selectedIndex < 0) {
return;
}
RemoteHost selectedHost = (RemoteHost) (model.get(selectedIndex));
FTPSession session = jftp.getCurrentSession();
if (session == null) {
jftp.newSession();
session = jftp.getCurrentSession();
// Double check to make sure we got a non-null session.
if (session == null) {
return;
}
}
saveFavorites();
setVisible(false);
session.connect(selectedHost);
}
private void initComponents() {
GridBagConstraints c = new GridBagConstraints();
c.anchor = GridBagConstraints.WEST;
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 1;
c.gridheight = 5;
c.weightx = 1.0;
c.weighty = 1.0;
c.fill = GridBagConstraints.BOTH;
c.insets = new Insets(12, 12, 12, 12);
model = new FavoritesListModel();
listFavorites = new MList(model);
listFavorites.setVisibleRowCount(15);
listFavorites.setCellRenderer(new ImageCellRenderer(JFTPUtil
.getIcon("server16.gif")));
listFavorites.setPrototypeCellValue("ftp.jMethods.com");
MScrollPane listScroller = new MScrollPane(listFavorites);
getContentPane().add(listScroller, c);
c.gridx = 0;
c.gridy = 5;
c.gridwidth = 1;
c.gridheight = 1;
c.weightx = 0.0;
c.weighty = 0.0;
c.anchor = GridBagConstraints.EAST;
c.fill = GridBagConstraints.NONE;
c.insets = new Insets(6, 12, 12, 12);
getContentPane().add(getCommandButtons(), c);
listFavorites.addListSelectionListener(this);
listFavorites.addMouseListener(this);
}
private Component getCommandButtons() {
Box panel = new Box(BoxLayout.X_AXIS);
butAdd = new MButton(CommonResources.getString("text.add"));
butAdd.addActionListener(this);
butEdit = new MButton(CommonResources.getString("text.edit"));
butEdit.addActionListener(this);
butDelete = new MButton(CommonResources.getString("text.delete"));
butDelete.addActionListener(this);
butConnect = new MButton(resources.getString("text.connect"));
butConnect.addActionListener(this);
butClose = new MButton(CommonResources.getString("text.close"));
butClose.addActionListener(this);
butHelp = new MButton(CommonResources.getString("text.help"));
JFTPHelp2.getInstance().enableHelp(butHelp, HELP_ID);
getRootPane().setDefaultButton(butConnect);
panel.add(butAdd);
panel.add(Box.createHorizontalStrut(5));
panel.add(butEdit);
panel.add(Box.createHorizontalStrut(5));
panel.add(butDelete);
panel.add(Box.createHorizontalStrut(5));
panel.add(butConnect);
panel.add(Box.createHorizontalStrut(5));
panel.add(butClose);
panel.add(Box.createHorizontalStrut(5));
panel.add(butHelp);
return panel;
}
private void loadFavorites() {
java.util.List favorites = new ArrayList();
try {
favorites = FavoritesManager.getFavorites();
model.setFavorites(favorites);
} catch (Exception exp) {
GUIUtil.showError(this, exp);
}
}
private void saveFavorites() {
java.util.List favorites = model.getFavorites();
try {
FavoritesManager.saveFavorites(favorites);
} catch (Exception exp) {
GUIUtil.showError(this, exp);
}
}
/**
* An implementation of List model to display the favourites in a JList
* component.
*
*/
class FavoritesListModel extends AbstractListModel {
private java.util.List favorites = null;
public FavoritesListModel() {
this(new ArrayList());
}
public FavoritesListModel(java.util.List favorites) {
setFavorites(favorites);
}
public void setFavorites(java.util.List favorites) {
if (favorites == null) {
favorites = new ArrayList();
}
this.favorites = favorites;
Collections.sort(this.favorites);
fireContentsChanged(this, 0, this.favorites.size());
}
public java.util.List getFavorites() {
return favorites;
}
public int getSize() {
return favorites.size();
}
public Object getElementAt(int index) {
return favorites.get(index);
}
public void add(Object obj) {
favorites.add(obj);
Collections.sort(favorites);
fireContentsChanged(this, 0, this.favorites.size());
}
public void set(int index, Object obj) {
favorites.set(index, obj);
Collections.sort(favorites);
fireContentsChanged(this, 0, this.favorites.size());
}
public Object get(int index) {
return favorites.get(index);
}
public void delete(Collection objects) {
favorites.removeAll(objects);
fireContentsChanged(this, 0, this.favorites.size());
}
public boolean contains(Object obj) {
return favorites.contains(obj);
}
}
}