package de.javasoft.synthetica.democenter.examples.systemmonitor;

import static de.javasoft.synthetica.addons.systemmonitor.CollectorFactory.CollectorID.CPU_USAGE;
import static de.javasoft.synthetica.addons.systemmonitor.CollectorFactory.CollectorID.HEAP_MEMORY_USAGE;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSeparator;
import javax.swing.UIManager;
import javax.swing.border.LineBorder;

import org.jdesktop.swingx.JXStatusBar;
import org.jdesktop.swingx.plaf.basic.BasicStatusBarUI;

import de.javasoft.swing.SystemMonitor;
import de.javasoft.synthetica.addons.systemmonitor.CollectorFactory;

/**
 * Application to demonstrate the SystemMonitor use within a StatusBar.  
 */
@SuppressWarnings("serial")
public class StatusBarMonitor extends JFrame
{
  public StatusBarMonitor()
  {
    super("StatusBarMonitor");
    //add statusbar at the bottom of the frame (contentpane has BorderLayout)
    
    JXStatusBar statusBar = createStatusBar(); 
    add(statusBar, BorderLayout.SOUTH);
    //add the statusbar to the rootPane - some themes require this for proper appearance
    getRootPane().putClientProperty("Synthetica.statusBar", statusBar);
    
    //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setSize(400, 300);
    setLocationRelativeTo(null);        //center
    setVisible(true);
  }

  /**
   * Create statusbar.
   */
  private JXStatusBar createStatusBar()
  {
    JXStatusBar statusBar = new JXStatusBar();
    //do not add separators automatically
    statusBar.putClientProperty(BasicStatusBarUI.AUTO_ADD_SEPARATOR, Boolean.FALSE);
    statusBar.add(new JLabel("Ready"));
    //use dummy label to fill empty space
    statusBar.add(new JLabel(""), JXStatusBar.Constraint.ResizeBehavior.FILL);
    //create constraint to add space of 5 at components left and right side 
    JXStatusBar.Constraint ct = new JXStatusBar.Constraint(new Insets(0, 5, 0, 5));
    statusBar.add(new JSeparator(JSeparator.VERTICAL), ct);
    statusBar.add(new JLabel("INS"), ct);
    statusBar.add(new JSeparator(JSeparator.VERTICAL), ct);
    statusBar.add(new JLabel("Monitor"), ct);

//@highlight
    SystemMonitor monitor = new SystemMonitor();
    //set monitor width
    monitor.setPreferredSize(new Dimension(40, 0));
    //add all needed collectors to the monitor
    monitor.addCollector(HEAP_MEMORY_USAGE.id, CollectorFactory.getFactory().createCollector(HEAP_MEMORY_USAGE.id));
    monitor.addCollector(CPU_USAGE.id, CollectorFactory.getFactory().createCollector(CPU_USAGE.id));
    //add all captions to the monitor popup - last param true
    monitor.addCaption(CPU_USAGE.id, "CPU Usage:", "%{percentValue}.0f%%", true);
    monitor.addCaption(HEAP_MEMORY_USAGE.id, "Heap Usage:", "%{value},.2fMB / %{maxValue},.2fMB", true);    
    //disable light effect - doesn't look good at small monitors
    monitor.setSpotlightEnabled(false);
    monitor.setGridSize(4);
    //replace default border by a small border
    monitor.setBorder(new LineBorder(new Color(0,0,0,128)));
    //enable tool tip popup to get closer monitor informations
    monitor.setPopupEnabled(true);
//@/highlight
    
    statusBar.add(monitor);
    return statusBar;
  }

  /**
   * Static main method for application startup. 
   */
  public static void main(String[] args)
  {
    EventQueue.invokeLater(new Runnable()
    {
      public void run()
      {
        try
        {
          UIManager.setLookAndFeel("de.javasoft.plaf.synthetica.SyntheticaStandardLookAndFeel");
          new StatusBarMonitor();
        }
        catch (Exception e)
        {
          e.printStackTrace();
        }
      }
    });
  }
}
