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

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Box;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;

import org.jdesktop.swingx.JXTaskPaneContainer;

import de.javasoft.plaf.synthetica.SyntheticaLookAndFeel;
import de.javasoft.swing.JYCheckBox;
import de.javasoft.swing.JYSearchField;
import de.javasoft.swing.JYTaskPane;

/**
 * A simple TaskPane application used to demonstrate and explain  
 * basic functionality.
 */
@SuppressWarnings("serial")
public class CustomTaskPane extends JFrame
{
  public CustomTaskPane()
  {
    super("Custom JYTaskPane");
//@highlight
    //add taskPane at the left
    add(createTaskPaneContainer(), BorderLayout.WEST);
//@/highlight
    JPanel p = new JPanel();
    p.add(new JButton("Button"));
    add(p);
    //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setSize(640, 480);
    setLocationRelativeTo(null);
    setVisible(true);
    p.getComponent(0).requestFocus();
  }

  /**
   * Create a simple taskPaneContainer including all taskPanes. The taskPaneContainer
   * is placed in a scrollpane.
   */
  private Component createTaskPaneContainer()
  {
    Icon iconOpen = new ImageIcon(this.getClass().getResource("/resources/icons/fileopen.png"));
//@highlight
    JYTaskPane taskPane = new JYTaskPane("Custom TaskPane", iconOpen);
    taskPane.setMnemonic(KeyEvent.VK_S);    
//@/highlight

    Icon iconNew = new ImageIcon(this.getClass().getResource("/resources/icons/filenew.png"));
    taskPane.add(createTaskPaneAction("Hyperlink Button 1", iconNew));
    taskPane.add(createTaskPaneAction("Hyperlink Button 2", iconOpen));
    Icon iconSave = new ImageIcon(this.getClass().getResource("/resources/icons/filesave.png"));
    taskPane.add(createTaskPaneAction("Hyperlink Button 3", iconSave));
    taskPane.add(Box.createVerticalStrut(5));
    taskPane.add(new JSeparator());
    taskPane.add(Box.createVerticalStrut(5));
    taskPane.add(new JYCheckBox("JYCheckBox component", true));
    
//@highlight
    JComponent titlePane = taskPane.getTitlePane();
    insertComponentAt(0, Box.createHorizontalStrut(10), titlePane);
    insertComponentAt(3, new JYSearchField(10), titlePane);
    insertComponentAt(4, Box.createHorizontalStrut(10), titlePane);
    //remove arrow button
    Component c = SyntheticaLookAndFeel.findComponent(JButton.class, titlePane);
    titlePane.remove(c);
//@/highlight

    JXTaskPaneContainer taskPaneContainer = new JXTaskPaneContainer();    
    taskPaneContainer.add(taskPane);

    JScrollPane scrollPane = new JScrollPane(taskPaneContainer);
    scrollPane.setBorder(new EmptyBorder(0,0,0,0));
    
    return scrollPane; 
  }

  private void insertComponentAt(int index, Component comp, Container container)
  {
    GridBagLayout layout = (GridBagLayout)container.getLayout();
    for (int i=0; i<container.getComponentCount(); i++)
    {
      Component c = container.getComponent(i);
      GridBagConstraints gbc = layout.getConstraints(c);
      if (gbc.gridx >= index)
      {  
        gbc.gridx += 1;
        layout.setConstraints(c, gbc);
      }  
    }     
    GridBagConstraints gbc = new GridBagConstraints(index, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0,0,0,0), 0, 0);
    container.add(comp, gbc);    
  }
  
  /**
   * Method for creating a dummy action. 
   */
  private Action createTaskPaneAction(String name, Icon icon)
  {
    return new AbstractAction(name, icon)
    {
      public void actionPerformed(ActionEvent e)
      {        
      }
    };
  }
  
  /**
   * 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 CustomTaskPane();
        }
        catch (Exception e)
        {
          e.printStackTrace();
        }
      }
    });
  }
}
