Java tutorial
/* * SimpleMarkerPlugin by Ren Mach * * 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 3 of the License, 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, see <http://www.gnu.org/licenses/>. * * SVN information: * $Date: 2010-02-08 12:46:00 +0100 (Mon, 08 Feb 2010) $ * $Author: ds10 $ * $Revision: 6462 $ */ package simplemarkerplugin; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Rectangle; import java.awt.Window; 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.Enumeration; import java.util.Hashtable; import java.util.LinkedList; import javax.swing.ButtonGroup; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import util.settings.PluginPictureSettings; import util.settings.ProgramPanelSettings; import util.ui.Localizer; import util.ui.ProgramList; import util.ui.SendToPluginDialog; import util.ui.TVBrowserIcons; import util.ui.UiUtilities; import util.ui.WindowClosingIf; import com.jgoodies.forms.factories.Borders; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; import devplugin.Plugin; import devplugin.Program; /** * SimpleMarkerPlugin 1.4 Plugin for TV-Browser since version 2.3 to only mark * programs and add them to the Plugin tree. * * (Formerly known as Just_Mark ;-)) * * License: GNU General Public License (GPL) * * @author Ren Mach */ public class ManagePanel { private static final long serialVersionUID = 1L; private JList mMarkListsList; private ProgramList mProgramsList; private DefaultListModel mProgramListModel; private JScrollPane mMarkListsScrolPane, mProgramsScrollPane; private MarkListsVector mMarkListVector; private JButton mSend, mDelete, mSettings, mClose, mUndo; private JRadioButton mShowPrograms, mShowTitles; private JDialog mParent; private Program[] mDeletedPrograms; private MarkList mLastDeletingList; private JSplitPane mSplitPane; /** * Creates an instance of this panel. * * @param parent The parent dialog. * @param markListVector The MarkListsVector. */ public ManagePanel(JDialog parent, MarkListsVector markListVector) { mParent = parent; mMarkListVector = markListVector; mShowPrograms = new JRadioButton(SimpleMarkerPlugin.getLocalizer().msg("list.programs", "List programs"), true); mShowTitles = new JRadioButton( SimpleMarkerPlugin.getLocalizer().msg("list.titles", "List for program titles")); ButtonGroup bg = new ButtonGroup(); bg.add(mShowPrograms); bg.add(mShowTitles); mProgramListModel = new DefaultListModel(); mMarkListsList = new JList(mMarkListVector/*.getMarkListNames()*/); mMarkListsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); mMarkListsList.setCellRenderer(new MarkListCellRenderer()); mProgramsList = new ProgramList(mProgramListModel, new ProgramPanelSettings(new PluginPictureSettings(PluginPictureSettings.ALL_PLUGINS_SETTINGS_TYPE), false, ProgramPanelSettings.X_AXIS)); mProgramsList.addMouseListeners(null); mMarkListsScrolPane = new JScrollPane(mMarkListsList); mProgramsScrollPane = new JScrollPane(mProgramsList); mMarkListsScrolPane.setBorder(null); mProgramsScrollPane.setBorder(null); JPanel panel = (JPanel) mParent.getContentPane(); panel.setBorder(Borders.createEmptyBorder("6dlu,6dlu,5dlu,6dlu")); FormLayout layout = new FormLayout("default:grow", "pref,pref,4dlu,fill:default:grow,4dlu,pref"); panel.setLayout(layout); CellConstraints cc = new CellConstraints(); panel.add(mShowPrograms, cc.xy(1, 1)); panel.add(mShowTitles, cc.xy(1, 2)); if (markListVector.size() > 1) { mSplitPane = new JSplitPane(); mSplitPane.setLeftComponent(mMarkListsScrolPane); mSplitPane.setRightComponent(mProgramsScrollPane); mSplitPane.setContinuousLayout(true); panel.add(mSplitPane, cc.xy(1, 4)); int pos = SimpleMarkerPlugin.getInstance().getSettings().getSplitPosition(); if (pos >= 0) { mSplitPane.setDividerLocation(pos); } } else { JPanel innerPanel = new JPanel(new FormLayout("fill:default:grow", "fill:default:grow")); mProgramsScrollPane.setBorder(new JScrollPane().getBorder()); innerPanel.add(mProgramsScrollPane, cc.xy(1, 1)); panel.add(innerPanel, cc.xy(1, 4)); } panel.add(getButtonPanel(cc), cc.xy(1, 6)); mShowPrograms.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { selectPrograms(true); mDelete.setToolTipText( SimpleMarkerPlugin.getLocalizer().msg("tooltip.deletePrograms", "Delete selected progams")); } }); mShowTitles.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { selectPrograms(true); mDelete.setToolTipText(SimpleMarkerPlugin.getLocalizer().msg("tooltip.deleteTitles", "Delete programs with selected titles/all programs")); } }); mSend.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { send(); } }); mDelete.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { delete(); } }); mClose.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { closeDialog(); } }); mUndo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { undo(); } }); mSettings.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { closeDialog(); Plugin.getPluginManager().showSettings(SimpleMarkerPlugin.getInstance()); } }); mMarkListsList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { selectPrograms(true); } } }); mProgramsList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent arg0) { mDelete.setEnabled(true); } }); mMarkListsList.setSelectedIndex(0); selectPrograms(true); mParent.getRootPane().setDefaultButton(mClose); UiUtilities.registerForClosing(new WindowClosingIf() { public void close() { closeDialog(); } public JRootPane getRootPane() { return mParent.getRootPane(); } }); mParent.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { closeDialog(); } }); } private void closeDialog() { mParent.dispose(); if (mSplitPane != null) { SimpleMarkerPlugin.getInstance().getSettings().setSplitPosition(mSplitPane.getDividerLocation()); } SimpleMarkerPlugin.getInstance().resetManagePanel(); } private void send() { Program[] programs = null; MarkList list = (MarkList) mMarkListsList.getSelectedValue(); if (mProgramsList.getSelectedValue() != null && mProgramsList.getSelectedValue() instanceof Program) { programs = mProgramsList.getSelectedPrograms(); } else if (mProgramsList.getSelectedValue() != null) { Object[] values = mProgramsList.getSelectedValues(); ArrayList<Program> progList = new ArrayList<Program>(); for (Object o : values) { Program[] progs = list.getProgramsWithTitle((String) o); for (Program p : progs) { progList.add(p); } } programs = progList.toArray(new Program[progList.size()]); } else if (mProgramsList.getSelectedValue() == null) { ArrayList<Program> expiredProgs = new ArrayList<Program>(); ArrayList<Program> notExpiredProgs = new ArrayList<Program>(); for (int i = 0; i < mProgramListModel.size(); i++) { Program prog = (Program) mProgramListModel.get(i); if (prog.isExpired()) { expiredProgs.add(prog); } else { notExpiredProgs.add(prog); } } if (notExpiredProgs.isEmpty()) { programs = expiredProgs.toArray(new Program[expiredProgs.size()]); } else { programs = notExpiredProgs.toArray(new Program[notExpiredProgs.size()]); } } if (programs != null) { SendToPluginDialog send = new SendToPluginDialog(SimpleMarkerPlugin.getInstance(), list.getReceiveTarget(), (Window) mParent, programs); send.setVisible(true); } } protected void selectPrograms(boolean scroll) { mProgramListModel.clear(); MarkList list = (MarkList) mMarkListsList.getSelectedValue(); int index = -1; if (mShowPrograms.isSelected()) { for (int i = 0; i < list.size(); i++) { Program prog = list.get(i); if (prog != null) { mProgramListModel.addElement(prog); if (!list.get(i).isExpired() && index == -1) { index = i; } } } } else { Hashtable<String, LinkedList<Program>> table = list.getSortedPrograms(); Enumeration<String> keys = table.keys(); while (keys.hasMoreElements()) { mProgramListModel.addElement(keys.nextElement()); } } final int scrollIndex = index; if (scroll) { SwingUtilities.invokeLater(new Runnable() { public void run() { mProgramsScrollPane.getVerticalScrollBar().setValue(0); mProgramsScrollPane.getHorizontalScrollBar().setValue(0); if (scrollIndex != -1) { Rectangle cellBounds = mProgramsList.getCellBounds(scrollIndex, scrollIndex); cellBounds.setLocation(cellBounds.x, cellBounds.y + mProgramsScrollPane.getHeight() - cellBounds.height); mProgramsList.scrollRectToVisible(cellBounds); } } }); } mSend.setEnabled(mProgramListModel.size() > 0); mDelete.setEnabled(mProgramListModel.size() > 0); mUndo.setEnabled(mLastDeletingList != null && mDeletedPrograms != null && mDeletedPrograms.length > 0); if (mParent.isVisible()) { mMarkListsList.repaint(); } } private void delete() { if (mProgramsList.getSelectedIndex() == -1) { mProgramsList.setSelectionInterval(0, mProgramListModel.getSize() - 1); } mLastDeletingList = (MarkList) mMarkListsList.getSelectedValue(); if (mShowPrograms.isSelected()) { mDeletedPrograms = (mProgramsList).getSelectedPrograms(); for (Program p : mDeletedPrograms) { mLastDeletingList.remove(p); } } else { Object[] programs = mProgramsList.getSelectedValues(); ArrayList<Program> deletedPrograms = new ArrayList<Program>(); for (Object o : programs) { Program[] deletedArr = mLastDeletingList.removeProgramsWithTitle((String) o); for (Program deleted : deletedArr) { deletedPrograms.add(deleted); } } mDeletedPrograms = deletedPrograms.toArray(new Program[deletedPrograms.size()]); } SimpleMarkerPlugin.getInstance().revalidate(mDeletedPrograms); mLastDeletingList.updateNode(); SimpleMarkerPlugin.getInstance().refreshManagePanel(false); } private void undo() { if (mLastDeletingList != null && mDeletedPrograms != null && mDeletedPrograms.length > 0) { for (Program p : mDeletedPrograms) { mLastDeletingList.addElement(p); } } SimpleMarkerPlugin.getInstance().revalidate(mDeletedPrograms); SwingUtilities.invokeLater(new Runnable() { public void run() { mLastDeletingList.updateNode(); } }); mLastDeletingList = null; mDeletedPrograms = null; SimpleMarkerPlugin.getInstance().refreshManagePanel(true); } private JPanel getButtonPanel(CellConstraints cc) { JPanel p = new JPanel(new FormLayout("pref,5dlu,pref,5dlu,pref,5dlu,pref", "pref")); mSettings = new JButton(TVBrowserIcons.preferences(TVBrowserIcons.SIZE_SMALL)); mSend = new JButton(TVBrowserIcons.copy(TVBrowserIcons.SIZE_SMALL)); mDelete = new JButton(TVBrowserIcons.delete(TVBrowserIcons.SIZE_SMALL)); mUndo = new JButton(SimpleMarkerPlugin.getInstance().createImageIcon("actions", "edit-undo", 16)); mSettings.setToolTipText(SimpleMarkerPlugin.getLocalizer().msg("tooltip.settings", "Open settings")); mSend.setToolTipText( SimpleMarkerPlugin.getLocalizer().msg("tooltip.send", "Send programs to other plugins")); mDelete.setToolTipText( SimpleMarkerPlugin.getLocalizer().msg("tooltip.deletePrograms", "Delete all/selected progams")); mUndo.setToolTipText(SimpleMarkerPlugin.getLocalizer().msg("tooltip.undo", "Undo")); mUndo.setEnabled(false); p.add(mSettings, cc.xy(1, 1)); p.add(mSend, cc.xy(3, 1)); p.add(mDelete, cc.xy(5, 1)); p.add(mUndo, cc.xy(7, 1)); mClose = new JButton(Localizer.getLocalization(Localizer.I18N_CLOSE)); JPanel buttons = new JPanel(new BorderLayout()); buttons.add(p, BorderLayout.WEST); buttons.add(mClose, BorderLayout.EAST); return buttons; } private static class MarkListCellRenderer extends DefaultListCellRenderer { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { simplemarkerplugin.ManagePanel.MarkListCellRenderer c = (simplemarkerplugin.ManagePanel.MarkListCellRenderer) super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus); if (!((MarkList) value).isEmpty()) { c.setText(c.getText() + " [" + ((MarkList) value).size() + "]"); } return c; } } }