/*
 * Copyright (c) 2002-2007 TeamDev Ltd. All rights reserved.
 *
 * Use is subject to license terms.
 *
 * The complete licence text can be found at
 * http://www.teamdev.com/winpack/license.jsf
 */
package com.jniwrapper.win32.samples.demo;

import com.jniwrapper.samples.shell.components.LazyPanel;
import com.jniwrapper.samples.shell.components.HTMLText;
import com.jniwrapper.win32.system.eventlog.EventLog;
import com.jniwrapper.win32.system.eventlog.EventLogMessage;
import com.jniwrapper.win32.system.VersionInfo;
import com.sun.java.swing.plaf.windows.WindowsTabbedPaneUI;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

/**
 @author Vladimir Kondrashchenko
 */
public class EventLogSample extends LazyPanel
{
    private JLabel lblAdvisoryText;
    private JLabel lblNotSupported;
    private JTabbedPane _eventLogPane;
    private JPanel _applicationLog;
    private JPanel _systemLog;
    private JPanel _securityLog;
    private JButton btnUpdate;
    private boolean _isWinNT;

    public EventLogSample(Window parent)
    {
        super(parent);
    }

    public void initialize() throws Exception
    {
        VersionInfo versionInfo = new VersionInfo();
        _isWinNT = false;
        boolean _isSecurityProblem = false;
        if (versionInfo.isNT())
        {
            _isWinNT = true;
        }

        lblAdvisoryText = new HTMLText("The page demonstrates the WinPack ability to manage NT event logs, " +
                "using the Event Logging API.<br>Press the \"Update\" button to update the list.");
        lblAdvisoryText.setBorder(BorderFactory.createEmptyBorder(10101010));

        if (!_isWinNT)
        {
            lblNotSupported = new HTMLText("<b><FONT color = red>NOTE:</FONT> Event logging functionality " +
                    "is not supported by the current version of operation system.");
            lblNotSupported.setBorder(BorderFactory.createEmptyBorder(10101010));
        }
        else
        {
            lblNotSupported = new JLabel();
        }

        try
        {
            _applicationLog = new EventLogPanel("Application");
            _systemLog = new EventLogPanel("System");
            _securityLog = new EventLogPanel("Security");
        }
        catch(Exception ex)
        {
            lblAdvisoryText.setText("The page demonstrates the WinPack ability to manage NT event logs, " +
                "using the Event Logging API.<br>Press the \"Update\" button to update the list." +
                "<br><br>&nbsp;<b><FONT color = red>NOTE:</FONT> You should have " +
                "Administrator rights to have the events displayed.</b>");
            _isSecurityProblem =true;
        }

        _eventLogPane = new JTabbedPane();
        _eventLogPane.setUI(new WindowsTabbedPaneUI());

        _eventLogPane.addTab("Application", _applicationLog);
        _eventLogPane.addTab("System", _systemLog);
        _eventLogPane.addTab("Security", _securityLog);
        _eventLogPane.setBorder(BorderFactory.createEmptyBorder(010010));

        btnUpdate = new JButton("Update");
        btnUpdate.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                EventLogPanel logPanel = (EventLogPanel_eventLogPane.getSelectedComponent();
                if (logPanel != null)
                {
                    logPanel.update();
                }
            }
        });

        JPanel updatePanel = new JPanel();
        updatePanel.add(btnUpdate);
        updatePanel.setBorder(BorderFactory.createEmptyBorder(010010));

        setLayout(new BorderLayout());

        add(lblAdvisoryText, BorderLayout.NORTH);

        if (_isWinNT)
        {
            add(_eventLogPane, BorderLayout.CENTER);
            add(updatePanel, BorderLayout.SOUTH);
        }
        else
        {
            add(lblNotSupported, BorderLayout.CENTER);
        }

        if(_isSecurityProblem)
        {
            add(lblNotSupported, BorderLayout.CENTER);
        }

        super.initialize();
    }

    private static class EventLogPanel extends JPanel
    {
        private JTable _table;
        private java.util.List _messages;
        private String _logName;

        public EventLogPanel(String logName)
        {
            super(new BorderLayout());

            _logName = logName;
            prepareMessageList(logName);
            fillTable();

            add(new JScrollPane(_table), BorderLayout.CENTER);
        }

        private void prepareMessageList(String logName)
        {
            EventLog eventLog = new EventLog(logName);
            _messages = eventLog.getMessages();
            eventLog.close();
        }

        private void fillTable()
        {
            String[] columnNames = new String[]
            {"Computer",
             "User",
             "Source",
             "Date",
             "Type",
             "Message"};

            String[][] values = new String[_messages.size()][6];

            for (int i = 0; i < _messages.size(); i++)
            {
                EventLogMessage message = (EventLogMessage_messages.get(i);
                values[i][0= message.getComputer();
                values[i][1= message.getUser() == null "N/A" : message.getUser();
                values[i][2= message.getSource();
                values[i][3= message.getDate().toString();
                values[i][4= message.getEventType().toString();
                values[i][5= message.getMessage();
            }

            _table = new JTable(values, columnNames);
            _table.setEnabled(false);
        }

        public void update()
        {
            prepareMessageList(_logName);
            fillTable();
        }
    }
}