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

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Insets;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JSeparator;
import javax.swing.JToolBar;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;

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

import de.javasoft.swing.JYDockingPort;
import de.javasoft.swing.JYDockingView;
import de.javasoft.swing.jydocking.DockingManager;
import de.javasoft.swing.plaf.jydocking.DefaultCloseAction;
import de.javasoft.swing.plaf.jydocking.DefaultMinimizeAction;

/**
 * Demonstrates how to use a statusbar together with the JYDocking framework.
 */
@SuppressWarnings("serial")
public class StatusBarDemo extends JFrame
{  
  public static final String MAIN_VIEW = "mainView-StatusBarDemo";
  public static final String EXPLORER_VIEW = "explorerView-StatusBarDemo";
  public static final String INFO_VIEW = "infoView-StatusBarDemo";

  public StatusBarDemo()
  {
    super("Docking StatusBar Demo");
    add(createContentPane(), BorderLayout.CENTER);
    add(createToolBar(), BorderLayout.NORTH);
//@highlight
    //add a statusbar at the bottom
    add(createStatusBar(), BorderLayout.SOUTH);
//@/highlight

    //clean up resources, recommended when Docking framework is used 
    //for a separate window just like the examples in the DemoCenter
    addWindowListener(new WindowAdapter()
    {
      @Override
      public void windowClosed(WindowEvent evt)
      {
        DockingManager.unregisterDockable(MAIN_VIEW);
        DockingManager.unregisterDockable(EXPLORER_VIEW);
        DockingManager.unregisterDockable(INFO_VIEW);
      }
    });
    
    //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setSize(640, 480);
    setLocationRelativeTo(null);        //center
    setVisible(true);    
  }
  
  /**
   * Create a simple toolbar.
   */
  private JToolBar createToolBar()
  {
    JToolBar toolBar = new JToolBar();
    JButton button = new JButton("ToolBar Button");
    button.setFocusable(false);
    toolBar.add(button);
    return toolBar;
  }

  /**
   * Create a simple 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("Load"), ct);
    JProgressBar progressBar = new JProgressBar();
    //use statusbar style if available
    progressBar.setName("StatusProgressBar");    
    statusBar.add(progressBar);
//@highlight
    //add the statusbar to the rootPane - some themes require this for proper appearance
    getRootPane().putClientProperty("Synthetica.statusBar", statusBar);    
//@/highlight
    return statusBar;
  }

  /**
   * Create content pane with three different views.
   */
  private JPanel createContentPane()
  {
    //each view ID has to be unique within your application
    JYDockingView mainView = createMainView(MAIN_VIEW, "MainTitle", "MainTabText");
    JYDockingView explorerView = createView(EXPLORER_VIEW, "ExplorerTitle", "ExplorerTabText");
    JYDockingView infoView = createView(INFO_VIEW, "InfoTitle", "InfoTabText");

    JYDockingPort viewport = new JYDockingPort();
    viewport.dock(mainView);
    
    mainView.dock(explorerView, DockingManager.WEST_REGION, .3f);
    mainView.dock(infoView, DockingManager.SOUTH_REGION, .3f);
    
    JPanel p = new JPanel(new BorderLayout(0, 0));
    p.setBorder(new EmptyBorder(5, 5, 5, 5));     
    p.add(viewport, BorderLayout.CENTER);

    return p;
  }

  /**
   * Create the main view - with blocked center region.
   */
  public static JYDockingView createMainView(String name, String title, String tabText)
  {
    JYDockingView view = createView(name, title, tabText);
    view.setTerritoryBlocked(DockingManager.CENTER_REGION, true);
    return view;
  }

  /**
   * Create additional views.
   */
  public static JYDockingView createView(String name, String title, String tabText)
  {
    JYDockingView view = new JYDockingView(name, title, tabText);
    initView(view);
    return view;
  }

  /**
   * Initialize specified view.
   */
  private static void initView(JYDockingView view)
  {
    view.addAction(new DefaultMinimizeAction(view));
    view.addAction(new DefaultCloseAction(view));

    JPanel p = new JPanel(new BorderLayout());
    view.setContentPane(p);
  }

  /**
   * 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 StatusBarDemo();
        }
        catch (Exception e)
        {
          e.printStackTrace();
        }
      }
    });
  }
}
