/* * LanguageChooserDialog.java * Copyright 2010 Connor Petty <cpmeister@users.sourceforge.net> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Created on Jul 8, 2010, 3:35:32 PM */ package pcgen.gui2.dialog; import java.awt.BorderLayout; import java.awt.Container; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.ListSelectionModel; import javax.swing.WindowConstants; import pcgen.facade.core.LanguageChooserFacade; import pcgen.facade.core.LanguageFacade; import pcgen.facade.util.event.ReferenceEvent; import pcgen.facade.util.event.ReferenceListener; import pcgen.facade.util.DefaultListFacade; import pcgen.facade.util.DelegatingListFacade; import pcgen.facade.util.ListFacade; import pcgen.gui2.tools.Icons; import pcgen.gui2.tools.Utility; import pcgen.gui2.util.FacadeListModel; import pcgen.gui2.util.JListEx; import pcgen.gui2.util.JTreeViewTable; import pcgen.gui2.util.treeview.DataView; import pcgen.gui2.util.treeview.DataViewColumn; import pcgen.gui2.util.treeview.TreeView; import pcgen.gui2.util.treeview.TreeViewModel; import pcgen.gui2.util.treeview.TreeViewPath; import pcgen.system.LanguageBundle; /** * * @author Connor Petty <cpmeister@users.sourceforge.net> */ public class LanguageChooserDialog extends JDialog implements ActionListener, ReferenceListener<Integer> { private final LanguageChooserFacade chooser; private final JTreeViewTable<LanguageFacade> availTable; private final JLabel remainingLabel; private final LangTreeViewModel treeViewModel; private final FacadeListModel<LanguageFacade> listModel; private final JListEx list; public LanguageChooserDialog(Frame frame, LanguageChooserFacade chooser) { super(frame, true); this.chooser = chooser; this.availTable = new JTreeViewTable<>(); this.remainingLabel = new JLabel(); this.treeViewModel = new LangTreeViewModel(); this.list = new JListEx(); this.listModel = new FacadeListModel<>(); treeViewModel.setDelegate(chooser.getAvailableList()); listModel.setListFacade(chooser.getSelectedList()); chooser.getRemainingSelections().addReferenceListener(this); initComponents(); pack(); Utility.installEscapeCloseOperation(this); } private void initComponents() { setTitle(chooser.getName()); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { //detach listeners from the chooser treeViewModel.setDelegate(null); listModel.setListFacade(null); chooser.getRemainingSelections().removeReferenceListener(LanguageChooserDialog.this); } }); Container pane = getContentPane(); pane.setLayout(new BorderLayout()); JSplitPane split = new JSplitPane(); JPanel leftPane = new JPanel(new BorderLayout()); //leftPane.add(new JLabel("Available Languages"), BorderLayout.NORTH); availTable.setAutoCreateRowSorter(true); availTable.setTreeViewModel(treeViewModel); availTable.getRowSorter().toggleSortOrder(0); availTable.addActionListener(this); leftPane.add(new JScrollPane(availTable), BorderLayout.CENTER); JPanel buttonPane1 = new JPanel(new FlowLayout()); JButton addButton = new JButton(LanguageBundle.getString("in_sumLangAddLanguage")); //$NON-NLS-1$ addButton.setActionCommand("ADD"); addButton.addActionListener(this); buttonPane1.add(addButton); buttonPane1.add(new JLabel(Icons.Forward16.getImageIcon())); leftPane.add(buttonPane1, BorderLayout.SOUTH); split.setLeftComponent(leftPane); JPanel rightPane = new JPanel(new BorderLayout()); JPanel labelPane = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth = GridBagConstraints.REMAINDER; labelPane.add(new JLabel(LanguageBundle.getString("in_sumLangRemain")), //$NON-NLS-1$ new GridBagConstraints()); remainingLabel.setText(chooser.getRemainingSelections().get().toString()); labelPane.add(remainingLabel, gbc); labelPane.add(new JLabel(LanguageBundle.getString("in_sumSelectedLang")), gbc); //$NON-NLS-1$ rightPane.add(labelPane, BorderLayout.NORTH); list.setModel(listModel); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.addActionListener(this); rightPane.add(new JScrollPane(list), BorderLayout.CENTER); JPanel buttonPane2 = new JPanel(new FlowLayout()); buttonPane2.add(new JLabel(Icons.Back16.getImageIcon())); JButton removeButton = new JButton(LanguageBundle.getString("in_sumLangRemoveLanguage")); //$NON-NLS-1$ removeButton.setActionCommand("REMOVE"); removeButton.addActionListener(this); buttonPane2.add(removeButton); rightPane.add(buttonPane2, BorderLayout.SOUTH); split.setRightComponent(rightPane); pane.add(split, BorderLayout.CENTER); JPanel bottomPane = new JPanel(new FlowLayout()); JButton button = new JButton(LanguageBundle.getString("in_ok")); //$NON-NLS-1$ button.setMnemonic(LanguageBundle.getMnemonic("in_mn_ok")); //$NON-NLS-1$ button.setActionCommand("OK"); button.addActionListener(this); bottomPane.add(button); button = new JButton(LanguageBundle.getString("in_cancel")); //$NON-NLS-1$ button.setMnemonic(LanguageBundle.getMnemonic("in_mn_cancel")); //$NON-NLS-1$ button.setActionCommand("CANCEL"); button.addActionListener(this); bottomPane.add(button); pane.add(bottomPane, BorderLayout.SOUTH); } @Override public void referenceChanged(ReferenceEvent<Integer> e) { remainingLabel.setText(e.getNewReference().toString()); } @Override public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("ADD") || e.getSource() == availTable) { List<Object> data = availTable.getSelectedData(); if (!data.isEmpty()) { for (Object object : data) { if (object instanceof LanguageFacade) { chooser.addSelected((LanguageFacade) object); } } } return; } if (e.getActionCommand().equals("REMOVE") || e.getSource() == list) { Object value = list.getSelectedValue(); if (value != null) { chooser.removeSelected((LanguageFacade) value); } return; } if (e.getActionCommand().equals("OK")) { chooser.commit(); } else { chooser.rollback(); } dispose(); } private static class LangTreeViewModel extends DelegatingListFacade<LanguageFacade> implements TreeViewModel<LanguageFacade>, DataView<LanguageFacade>//, TreeView<LanguageFacade> { private static final ListFacade<TreeView<LanguageFacade>> views = new DefaultListFacade<>(Arrays.asList(LanguageTreeView.values())); @Override public ListFacade<? extends TreeView<LanguageFacade>> getTreeViews() { return views; } @Override public int getDefaultTreeViewIndex() { return 0; } @Override public DataView<LanguageFacade> getDataView() { return this; } @Override public ListFacade<LanguageFacade> getDataModel() { return this; } @Override public Object getData(LanguageFacade element, int column) { return null; } @Override public void setData(Object value, LanguageFacade element, int column) { } @Override public List<? extends DataViewColumn> getDataColumns() { return Collections.emptyList(); } @Override public String getPrefsKey() { return LanguageBundle.getString("in_sumLangAvailable"); //$NON-NLS-1$; } } private enum LanguageTreeView implements TreeView<LanguageFacade> { NAME("in_nameLabel"), //$NON-NLS-1$ TYPE_NAME("in_typeName"); //$NON-NLS-1$ private final String name; private LanguageTreeView(String name) { this.name = LanguageBundle.getString(name); } @Override public String getViewName() { return name; } @Override public List<TreeViewPath<LanguageFacade>> getPaths(LanguageFacade pobj) { List<TreeViewPath<LanguageFacade>> paths = new ArrayList<>(); switch (this) { case NAME: return Collections.singletonList(new TreeViewPath<>(pobj)); case TYPE_NAME: for(String type : pobj.getTypes()) { paths.add(new TreeViewPath<>(pobj, type)); } return paths; default: throw new InternalError(); } } } }