Package net.ftb.gui

Source Code of net.ftb.gui.LauncherConsole

/*
* This file is part of FTB Launcher.
*
* Copyright © 2012-2014, FTB Launcher Contributors <https://github.com/Slowpoke101/FTBLaunch/>
* FTB Launcher is licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*  http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.ftb.gui;

import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.swing.*;
import javax.swing.text.*;

import net.ftb.data.Constants;
import net.ftb.download.Locations;
import net.ftb.locale.I18N;
import net.ftb.log.ILogListener;
import net.ftb.log.LogEntry;
import net.ftb.log.LogLevel;
import net.ftb.log.LogSource;
import net.ftb.log.LogType;
import net.ftb.log.Logger;
import net.ftb.tools.PastebinPoster;
import net.ftb.util.GameUtils;
import net.ftb.util.OSUtils;

@SuppressWarnings("serial")
public class LauncherConsole extends JFrame implements ILogListener {
    private final JTextPane displayArea;
    private final JComboBox logTypeComboBox;
    private LogType logType = LogType.MINIMAL;
    private final JComboBox logSourceComboBox;
    private LogSource logSource = LogSource.ALL;
    private LogLevel logLevel = LogLevel.INFO;
    private JButton killMCButton;
    private final Document displayAreaDoc;
    private final Font FONT = new Font("Monospaced", 0, 12);

    private SimpleAttributeSet RED = new SimpleAttributeSet();
    private SimpleAttributeSet YELLOW = new SimpleAttributeSet();

    public LauncherConsole () {
        setTitle(Constants.name + " " + I18N.getLocaleString("CONSOLE_TITLE"));
        setMinimumSize(new Dimension(800, 400));
        setPreferredSize(new Dimension(800, 400));
        setIconImage(Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("/image/logo_ftb.png")));
        getContentPane().setLayout(new BorderLayout(0, 0));

        StyleConstants.setForeground(RED, Color.RED);
        StyleConstants.setForeground(YELLOW, Color.YELLOW);

        // setup buttons
        JPanel panel = new JPanel();

        getContentPane().add(panel, BorderLayout.SOUTH);
        panel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));

        JButton paste = new JButton(I18N.getLocaleString("CONSOLE_PASTE"));
        paste.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed (ActionEvent arg0) {
                JOptionPane pane = new JOptionPane("The log will be sent to the FTB paste site and opened in your browser");
                Object[] options = new String[] { "Yes do it", "Cancel" };
                pane.setOptions(options);
                JDialog dialog = pane.createDialog(new JFrame(), I18N.getLocaleString("CONSOLE_PASTE"));
                dialog.setVisible(true);
                Object obj = pane.getValue();
                int result = -1;
                for (int i = 0; i < options.length; i++) {
                    if (options[i].equals(obj)) {
                        result = i;
                    }
                }
                if (result == 0) {
                    PastebinPoster thread = new PastebinPoster();
                    thread.start();
                }
            }
        });
        panel.add(paste);

        JButton clipboard = new JButton(I18N.getLocaleString("CONSOLE_COPYCLIP"));
        clipboard.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed (ActionEvent arg0) {
                JOptionPane pane = new JOptionPane(I18N.getLocaleString("CONSOLE_CLIP_CONFIRM"));
                Object[] options = new String[] { I18N.getLocaleString("MAIN_YES"), I18N.getLocaleString("MAIN_CANCEL") };
                pane.setOptions(options);
                JDialog dialog = pane.createDialog(new JFrame(), I18N.getLocaleString("CONSOLE_COPYCLIP"));
                dialog.setVisible(true);
                Object obj = pane.getValue();
                int result = -1;
                for (int i = 0; i < options.length; i++) {
                    if (options[i].equals(obj)) {
                        result = i;
                    }
                }
                if (result == 0) {
                    StringSelection stringSelection = new StringSelection("FTB Launcher logs:\n" + Logger.getLogs()
                            + "[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "]" + " Logs copied to clipboard");
                    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
                    clipboard.setContents(stringSelection, null);
                }
            }
        });
        panel.add(clipboard);

        logTypeComboBox = new JComboBox(LogType.values());
        logTypeComboBox.setSelectedItem(logType);
        logTypeComboBox.addActionListener(new ActionListener() {
            public void actionPerformed (ActionEvent arg0) {
                logType = (LogType) logTypeComboBox.getSelectedItem();

                // setup loglevel. If DEBUG selected show also DEBUG messages
                switch (logType) {
                case MINIMAL:
                    logLevel = LogLevel.INFO;
                    break;
                case EXTENDED:
                    logLevel = LogLevel.INFO;
                    break;
                case DEBUG:
                    logLevel = LogLevel.DEBUG;
                    break;
                }

                refreshLogs();
            }
        });
        panel.add(logTypeComboBox);

        logSourceComboBox = new JComboBox(LogSource.values());
        logSourceComboBox.setSelectedItem(logSource);
        logSourceComboBox.addActionListener(new ActionListener() {
            public void actionPerformed (ActionEvent arg0) {
                logSource = (LogSource) logSourceComboBox.getSelectedItem();
                refreshLogs();
            }
        });
        panel.add(logSourceComboBox);

        JButton ircButton = new JButton(I18N.getLocaleString("CONSOLE_SUPPORT"));
        ircButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed (ActionEvent arg0) {
                OSUtils.browse(Locations.SUPPORTSITE);
            }
        });
        panel.add(ircButton);

        killMCButton = new JButton(I18N.getLocaleString("KILL_MC"));
        killMCButton.setEnabled(false);
        killMCButton.setVisible(true);
        killMCButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed (ActionEvent arg0) {
                GameUtils.killMC();
            }
        });
        panel.add(killMCButton);

        // setup log area
        displayArea = new JTextPane() {
            @Override
            public boolean getScrollableTracksViewportWidth () {
                return true;
            }
        };

        displayArea.setFont(FONT);
        displayArea.setEditable(false);
        displayAreaDoc = this.displayArea.getDocument();
        displayArea.setMargin(null);

        JScrollPane scrollPane = new JScrollPane(displayArea);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

        // Use third party library to implement autoscroll
        new SmartScroller(scrollPane);

        getContentPane().add(scrollPane);
        pack();

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing (WindowEvent e) {
                Logger.removeListener(LaunchFrame.con);
                if (LaunchFrame.trayMenu != null) {
                    LaunchFrame.trayMenu.updateShowConsole(false);
                }
                dispose();
            }
        });

    }

    synchronized public void refreshLogs () {
        try {
            displayAreaDoc.remove(0, displayAreaDoc.getLength());
        } catch (Exception e) {
            // ignore
        }

        List<LogEntry> entries = Logger.getLogEntries();
        for (LogEntry entry : entries) {
            if ((logSource == LogSource.ALL || entry.source == logSource) && (logLevel == LogLevel.DEBUG || logLevel.includes(entry.level))) {
                addMessage(entry, this.displayAreaDoc);
            }
        }
        try {
            displayAreaDoc.remove(0, 1);
        } catch (Exception e) {
            //ignore
        }
    }

    public void scrollToBottom () {
        displayArea.setCaretPosition(displayArea.getDocument().getLength());
    }

    synchronized private void addMessage (LogEntry entry, Document d) {
        SimpleAttributeSet color = null;
        switch (entry.level) {
        case ERROR:
            color = RED;
            break;
        case WARN:
            color = YELLOW;
        case INFO:
            break;
        case DEBUG:
            break;
        case UNKNOWN:
            break;
        default:
            break;
        }
        try {
            d.insertString(d.getLength(), "\n" + entry.toString(logType), color);
        } catch (Exception e) {
            //ignore
        }
    }

    public void minecraftStarted () {
        killMCButton.setEnabled(true);
    }

    public void minecraftStopped () {
        killMCButton.setEnabled(false);
    }

    @Override
    public void onLogEvent (final LogEntry entry) {
        // drop unneeded messages as soon as possible
        if ((logSource == LogSource.ALL || entry.source == logSource) && (logLevel == LogLevel.DEBUG || logLevel.includes(entry.level))) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run () {
                    addMessage(entry, LaunchFrame.con.displayAreaDoc);
                }
            });
        }
    }
}
TOP

Related Classes of net.ftb.gui.LauncherConsole

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.