/* * jMemorize - Learning made easy (and fun) - A Leitner flashcards tool * Copyright(C) 2004-2008 Riad Djemili and contributors * * This program 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 1, or (at your option) * any later version. * * This program 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, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package jmemorize.gui.swing.frames; import java.awt.BorderLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JToolBar; import javax.swing.border.EmptyBorder; import javax.swing.border.EtchedBorder; import jmemorize.core.Card; import jmemorize.core.Category; import jmemorize.core.FormattedText; import jmemorize.core.ImageRepository; import jmemorize.core.Main; import jmemorize.core.Settings; import jmemorize.gui.LC; import jmemorize.gui.Localization; import jmemorize.gui.swing.NewCardFramesManager; import jmemorize.gui.swing.actions.AbstractAction2; import jmemorize.gui.swing.panels.TwoSidesCardPanel; import jmemorize.gui.swing.widgets.CategoryComboBox; import jmemorize.util.EscapableFrame; import com.jgoodies.forms.builder.ButtonBarBuilder; import com.jgoodies.forms.factories.Borders; /** * A frame that is used to create new cards. * * @author djemili */ public class NewCardFrame extends EscapableFrame { private class NewWindowAction extends AbstractAction2 { public NewWindowAction() { setName(Localization.get(LC.NEW_CARD_NEW_WINDOW)); setDescription(Localization.get(LC.NEW_CARD_NEW_WINDOW_DESC)); setIcon("/resource/icons/card_add.gif"); //$NON-NLS-1$ setAccelerator(KeyEvent.VK_N, InputEvent.CTRL_MASK); setMnemonic(7); } public void actionPerformed(ActionEvent e) { m_manager.addNewCardWindow(NewCardFrame.this, m_cardPanel.getCategoryComboBox().getSelectedCategory()); } } private class EditRecentCardAction extends AbstractAction2 { public EditRecentCardAction() { setName(Localization.get(LC.NEW_CARD_EDIT_RECENTLY)); setDescription(Localization.get(LC.NEW_CARD_EDIT_RECENTLY_DESC)); setIcon("/resource/icons/card_edit.gif"); //$NON-NLS-1$ setAccelerator(KeyEvent.VK_ENTER, 0); setMnemonic(1); } public void actionPerformed(ActionEvent e) { m_manager.editRecentlyCreatedCards(); } } // swing elements private NewCardFramesManager m_manager; private TwoSidesCardPanel m_cardPanel = new TwoSidesCardPanel(true); private JButton m_createMoreButton; private Action m_editRecentAction = new EditRecentCardAction(); /** * Creates new form NewCardFrame */ public NewCardFrame(NewCardFramesManager manager, Category currentCategory) { m_manager = manager; initComponents(); CategoryComboBox categoryComboBox = m_cardPanel.getCategoryComboBox(); categoryComboBox.setRootCategory(Main.getInstance().getLesson().getRootCategory()); categoryComboBox.setSelectedCategory(currentCategory); m_cardPanel.reset(); pack(); } /** * @return True if window was closed. False if it was left open by user * decision. */ public boolean close() { if (m_cardPanel.getFrontText().getUnformatted().trim().length() > 0 || m_cardPanel.getBackText().getUnformatted().trim().length() > 0) { int n = JOptionPane.showConfirmDialog(this, Localization.get(LC.NEW_CARD_DISMISS_WARN), Localization.get(LC.NEW_CARD_CLOSE_WARN), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); if (n == JOptionPane.CANCEL_OPTION) { return false; //window isnt closed } if (n == JOptionPane.YES_OPTION) { return createCard(false); } } // if card was empty or NO was chosen closeWindow(); return true; } private void initComponents() { getContentPane().add(buildToolBar(), BorderLayout.NORTH); getContentPane().add(buildMainPanel(), BorderLayout.CENTER); getContentPane().add(buildButtonBar(), BorderLayout.SOUTH); getRootPane().setDefaultButton(m_createMoreButton); pack(); setTitle(Localization.get(LC.NEW_CARD_TITLE)); setIconImage(Toolkit.getDefaultToolkit().getImage( getClass().getResource("/resource/icons/card_add.gif"))); //$NON-NLS-1$ } private JToolBar buildToolBar() { JToolBar toolBar = new JToolBar(); toolBar.setFloatable(false); toolBar.setBorder(new EtchedBorder()); toolBar.add(new JButton(new NewWindowAction())); toolBar.add(new JButton(m_editRecentAction)); return toolBar; } private JPanel buildMainPanel() { m_cardPanel.setBorder(Borders.DIALOG_BORDER); return m_cardPanel; } private JPanel buildButtonBar() { // buttons m_createMoreButton = new JButton( Localization.get("NewCard.ADD_AND_NEXT")); //$NON-NLS-1$ m_createMoreButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { createCard(true); } }); JButton createButton = new JButton( Localization.get("NewCard.ADD")); //$NON-NLS-1$ createButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { createCard(false); } }); JButton cancelButton = new JButton( Localization.get(LC.CANCEL)); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { // directly close without confirmation closeWindow(); } }); // button bar ButtonBarBuilder builder = new ButtonBarBuilder(); builder.addGlue(); builder.addFixedNarrow(m_createMoreButton); builder.addRelatedGap(); builder.addGridded(createButton); builder.addRelatedGap(); builder.addGridded(cancelButton); builder.setBorder(new EmptyBorder(5, 5, 5, 5)); return builder.getPanel(); } /** * @return <code>true</code> if card was created. */ private boolean createCard(boolean keepOpen) { if (m_cardPanel.isValidCard()) { FormattedText frontside = m_cardPanel.getFrontText(); FormattedText backside = m_cardPanel.getBackText(); Category category = m_cardPanel.getCategoryComboBox().getSelectedCategory(); Card card = new Card(frontside, backside); ImageRepository repo = ImageRepository.getInstance(); card.getFrontSide().setImages(repo.addImages(m_cardPanel.getFrontImages())); card.getBackSide().setImages(repo.addImages(m_cardPanel.getBackImages())); category.addCard(card); m_manager.newCardCreated(card); m_cardPanel.reset(); if (!keepOpen) { closeWindow(); } return !keepOpen; } else { JOptionPane.showMessageDialog(this, Localization.get(LC.EMPTY_SIDES_ALERT), Localization.get(LC.EMPTY_SIDES_ALERT_TITLE), JOptionPane.ERROR_MESSAGE); return false; } } private void closeWindow() { m_manager.newCardFrameClosed(this); Settings.removedCardFontObserver(m_cardPanel); dispose(); } }