net.pms.newgui.TracesTab.java Source code

Java tutorial

Introduction

Here is the source code for net.pms.newgui.TracesTab.java

Source

/*
 * PS3 Media Server, for streaming any medias to your PS3.
 * Copyright (C) 2008  A.Brochard
 *
 * 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; version 2
 * of the License only.
 *
 * 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package net.pms.newgui;

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import net.pms.Messages;
import net.pms.configuration.PmsConfiguration;
import net.pms.logging.LoggingConfigFileLoader;
import net.pms.util.FormLayoutUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Locale;

public class TracesTab {
    private static final Logger logger = LoggerFactory.getLogger(TracesTab.class);
    private PmsConfiguration configuration;
    private JTextArea jList;
    protected JScrollPane jListPane;

    class PopupTriggerMouseListener extends MouseAdapter {
        private JPopupMenu popup;
        private JComponent component;

        public PopupTriggerMouseListener(JPopupMenu popup, JComponent component) {
            this.popup = popup;
            this.component = component;
        }

        // Some systems trigger popup on mouse press, others on mouse release, we want to cater for both
        private void showMenuIfPopupTrigger(MouseEvent e) {
            if (e.isPopupTrigger()) {
                popup.show(component, e.getX() + 3, e.getY() + 3);
            }
        }

        // According to the javadocs on isPopupTrigger, checking for popup trigger on mousePressed and mouseReleased 
        // Should be all that is required

        public void mousePressed(MouseEvent e) {
            showMenuIfPopupTrigger(e);
        }

        public void mouseReleased(MouseEvent e) {
            showMenuIfPopupTrigger(e);
        }
    }

    TracesTab(PmsConfiguration configuration) {
        this.configuration = configuration;
    }

    public JTextArea getList() {
        return jList;
    }

    public void append(String msg) {
        getList().append(msg);
        final JScrollBar vbar = jListPane.getVerticalScrollBar();
        // if scroll bar already was at the bottom we schedule
        // a new scroll event to again scroll to the bottom
        if (vbar.getMaximum() == vbar.getValue() + vbar.getVisibleAmount()) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    vbar.setValue(vbar.getMaximum());
                }
            });
        }
    }

    public JComponent build() {
        // Apply the orientation for the locale
        Locale locale = new Locale(configuration.getLanguage());
        ComponentOrientation orientation = ComponentOrientation.getOrientation(locale);
        String colSpec = FormLayoutUtil.getColSpec("left:pref, 10:grow", orientation);

        FormLayout layout = new FormLayout(colSpec, "fill:10:grow, p");
        PanelBuilder builder = new PanelBuilder(layout);
        builder.opaque(true);

        CellConstraints cc = new CellConstraints();

        // create trace text box
        jList = new JTextArea();
        jList.setEditable(false);
        jList.setBackground(Color.WHITE);
        jList.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
        final JPopupMenu popup = new JPopupMenu();
        JMenuItem defaultItem = new JMenuItem(Messages.getString("TracesTab.3"));

        defaultItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                jList.setText("");
            }
        });

        popup.add(defaultItem);
        jList.addMouseListener(new PopupTriggerMouseListener(popup, jList));

        jListPane = new JScrollPane(jList, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        jListPane.setBorder(BorderFactory.createEmptyBorder());
        builder.add(jListPane, cc.xyw(1, 1, 2));

        // Add buttons to open logfiles (there may be more than one)
        JPanel pLogfileButtons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        HashMap<String, String> logfiles = LoggingConfigFileLoader.getLogFilePaths();

        for (String loggerName : logfiles.keySet()) {
            JButton b = new JButton(loggerName);
            b.setToolTipText(logfiles.get(loggerName));

            b.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    File logfile = new File(((JButton) e.getSource()).getToolTipText());
                    try {
                        java.awt.Desktop.getDesktop().open(logfile);
                    } catch (IOException ioe) {
                        logger.error(String.format("Failed to open file %s in default editor", logfile), ioe);
                    } catch (UnsupportedOperationException usoe) {
                        logger.error(String.format("Failed to open file %s in default editor", logfile), usoe);
                    }
                }
            });

            pLogfileButtons.add(b);
        }

        builder.add(pLogfileButtons, cc.xy(2, 2));
        return builder.getPanel();
    }
}