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

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;

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.DefaultFloatAction;
import de.javasoft.swing.plaf.jydocking.DefaultMaximizeAction;
import de.javasoft.swing.plaf.jydocking.DefaultMinimizeAction;

/**
 * Polished simple docking application with icons for each view.
 */
@SuppressWarnings("serial")
public class PolishedDocking extends JFrame
{
  public static final String MAIN_VIEW = "mainViewID-PolishedDocking";
  public static final String EXPLORER_VIEW = "explorerViewID-PolishedDocking";
  public static final String INFO_VIEW = "infoViewID-PolishedDocking";

  public PolishedDocking()
    {
      super("Polished Docking Demo");
//@highlight
      //enable floating - drag and drop a view as a separate window 
      DockingManager.setFloatingEnabled(true);
//@/highlight
      add(createContentPane());
      
      //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 content pane with three different views.
     */
    private JPanel createContentPane()
    {
//@highlight
      //each view ID has to be unique within your application
      JYDockingView mainView = createMainView(MAIN_VIEW, "MainTitle", "MainTabText", "/resources/icons/file.gif");
      JYDockingView explorerView = createView(EXPLORER_VIEW, "ExplorerTitle", "ExplorerTabText", "/resources/icons/explorer.gif");
      JYDockingView infoView = createView(INFO_VIEW, "InfoTitle", "InfoTabText", "/resources/icons/tip.png");
//@/highlight

      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, String iconLocation)
    {
      JYDockingView view = createView(name, title, tabText, iconLocation);
      //avoid dragging in the center region of the main view
      view.setTerritoryBlocked(DockingManager.CENTER_REGION, true);
      return view;
    }

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

    /**
     * Initialize specified view.
     */
    private static void initView(JYDockingView view, String iconLocation)
    {
//@highlight
      if (view.getID().equals(MAIN_VIEW))
        view.addAction(new DefaultMaximizeAction(view));
      else
      {  
        //add needed action buttons
        view.addAction(new DefaultMinimizeAction(view));
        view.addAction(new DefaultMaximizeAction(view));
        view.addAction(new DefaultFloatAction(view));
        view.addAction(new DefaultCloseAction(view));
      }  

      //add double-click support for maximization 
      view.getTitlebar().addMouseListener(new MouseAdapter(){
        @Override
        public void mousePressed(MouseEvent evt)
        {
          if (evt.getClickCount() == 2)
          {
            JYDockingView view = (JYDockingView)evt.getComponent().getParent();
            DockingManager.setMaximized(view, !DockingManager.isMaximized(view));
          }
        }
      });

      Icon icon = new ImageIcon(PolishedDocking.class.getResource(iconLocation));
      view.setIcon(icon);
//@/highlight

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

}
