package info.opencards.ui.table;
import info.opencards.Utils;
import info.opencards.core.CardFile;
import info.opencards.core.Item;
import info.opencards.core.categories.Category;
import info.opencards.core.categories.CategoryUtils;
import info.opencards.learnstrats.ltm.LTMItem;
import info.opencards.ui.actions.CardFilePropsAction;
import info.opencards.ui.actions.CardFileResetAction;
import info.opencards.ui.actions.CardFileSyncAction;
import info.opencards.util.ScaleableIcon;
import info.opencards.util.UIUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.util.*;
import java.util.List;
/**
* DOCUMENT ME!
*
* @author Holger Brandl
*/
public class FilePopUp extends MouseAdapter {
private CardSetTable parent;
private JPopupMenu menu;
private JMenu remMenu;
private CardFilePropsAction propsAction;
private CardFileResetAction resetAction;
private CardFileSyncAction syncAction;
public FilePopUp(CardSetTable parent) {
assert parent != null;
this.parent = parent;
menu = new JPopupMenu();
//setup the context menu
ResourceBundle rb = Utils.getRB();
propsAction = new CardFilePropsAction(parent, true, rb.getString("CardFileTable.cxtMenu.configureCards"));
menu.add(new JMenuItem(propsAction));
String syncActionName = rb.getString("CardFileTable.cxtMenu.syncCards");
syncAction = new CardFileSyncAction(syncActionName);
menu.add(new JMenuItem(syncAction));
String resetActionName = rb.getString("OpenCardsUI.resetStacksButton.text");
resetAction = new CardFileResetAction(UIUtils.getOwnerDialog(parent), parent, Arrays.<Class<? extends Item>>asList(LTMItem.class), resetActionName);
menu.add(new JMenuItem(resetAction));
menu.add(new JSeparator());
remMenu = new JMenu(rb.getString("CardFileTable.cxtMenu.removeFromCategory"));
remMenu.setIcon(new ScaleableIcon("icons/category_remove.png"));
menu.add(remMenu);
}
public void mouseReleased(java.awt.event.MouseEvent e) {
List<CardFile> selectedCardFiles = getSelectedCardFiles((CardSetTable) e.getSource());
if (!e.isPopupTrigger()) {
if (e.getClickCount() == 2 && selectedCardFiles.size() == 1 && e.getButton() == MouseEvent.BUTTON1) {
try {
Desktop.getDesktop().open(selectedCardFiles.get(0).getFileLocation());
} catch (IOException e1) {
e1.printStackTrace();
}
}
return;
}
propsAction.setCardFile(selectedCardFiles.isEmpty() ? null : selectedCardFiles);
resetAction.setCardFiles(selectedCardFiles.isEmpty() ? null : selectedCardFiles);
syncAction.setCardFiles(selectedCardFiles.isEmpty() ? null : selectedCardFiles);
//add only common categories of the current (multiple) selection. (which is a intersection of all file-categories)
List<Category> commonFileCats = new ArrayList<Category>(getCurCommonSelectionCategories(selectedCardFiles));
//remove all categories which are not selected yet
List<Category> selectedCats = ((CardTableModel) parent.getModel()).getCurCatgories();
Set<Category> selIncChildCats = new HashSet<Category>();
for (Category selectedCat : selectedCats) {
selIncChildCats.addAll(CategoryUtils.recursiveCatCollect(selectedCat));
}
for (int i = 0; i < commonFileCats.size(); i++) {
if (!selIncChildCats.contains(commonFileCats.get(i))) {
commonFileCats.remove(commonFileCats.get(i));
i--;
}
}
remMenu.setEnabled(!commonFileCats.isEmpty());
// create the temporary menu actions
remMenu.removeAll();
for (Category curCat : commonFileCats) {
remMenu.add(new JMenuItem(new RemoveFromCategoryAction(UIUtils.getOwnerDialog(parent), curCat, selectedCardFiles)));
}
menu.show(parent, e.getX(), e.getY()); //Have the tree display the pop up menu here
}
private static List<CardFile> getSelectedCardFiles(CardSetTable cardSetTable) {
int[] ints = cardSetTable.getSelectedRows();
List<CardFile> selectedFiles = new ArrayList<CardFile>();
for (int rowIndex : ints) {
selectedFiles.add(cardSetTable.getSortedRowFile(rowIndex));
}
return selectedFiles;
}
private Set<Category> getCurCommonSelectionCategories(List<CardFile> curFiles) {
Set<Category> commonCats = new HashSet<Category>();
for (CardFile curFile : curFiles) {
commonCats.addAll(new HashSet<Category>(curFile.belongsTo()));
}
for (CardFile curFile : curFiles) {
commonCats.retainAll(new HashSet<Category>(curFile.belongsTo()));
}
return commonCats;
}
public void mouseClicked(MouseEvent e) {
// if (SwingUtilities.isRightMouseButton(e)) {
// return;
// }
}
/**
* Invoked when a mouse button has been pressed on a component.
*/
public void mousePressed(MouseEvent e) {
mouseReleased(e);
}
}
class RemoveFromCategoryAction extends AbstractAction {
private final Dialog ownerDialog;
private final Category removeCategory;
private final List<CardFile> selectedCardFiles;
public RemoveFromCategoryAction(Dialog ownerDialog, Category removeCategory, List<CardFile> selectedCardFiles) {
this.ownerDialog = ownerDialog;
this.removeCategory = removeCategory;
this.selectedCardFiles = selectedCardFiles;
putValue(NAME, removeCategory.getName());
// putValue(SMALL_ICON, null);
// putValue(SHORT_DESCRIPTION, "cuts the selected category");
// putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_D, KeyEvent.CTRL_DOWN_MASK));
// putValue(MNEMONIC_KEY, 2);
}
public void actionPerformed(ActionEvent e) {
int status = JOptionPane.showConfirmDialog(ownerDialog, Utils.getRB().getString("CardFileTableModel.reallyRemove") + " '" + removeCategory + "'?");
if (status != JOptionPane.YES_OPTION) {
return;
}
for (CardFile selectedCardFile : selectedCardFiles) {
removeCategory.unregisterCardSet(selectedCardFile);
}
}
}