package me.chenyi.mm.ui;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.util.*;
import java.util.List;
import org.pushingpixels.trident.Timeline;
/**
* Class description goes here
*
* @author $Author:$
* @version $Revision:$
*/
public class CurtainPanel2 extends JPanel implements ICurtainController
{
private int currentComponentIndex;
private java.util.List<CurtainPagePanel> componentList;
private java.util.List<CurtainPagePanel> componentListByLayerOrder;
private final Timeline timeline;
// private CurtainControlPanel controllerPanel;
/**
*/
public CurtainPanel2()
{
componentList = new ArrayList();
componentListByLayerOrder = new ArrayList(componentList);
setLayout(new OverlayLayout(this));
// controllerPanel = new CurtainControlPanel(this);
// controllerPanel.setBorder(BorderFactory.createLineBorder(Color.red));
// add(controllerPanel);
// controllerPanel.setAlignmentX(0.5f);
// controllerPanel.setAlignmentY(0f);
// controllerPanel.setMaximumSize(new Dimension(0, 0));
// for(JComponent component : componentList)
// {
// component.setAlignmentX(0.5f);
// component.setAlignmentY(0f);
// component.setMaximumSize(new Dimension(0, 0));
//// component.setVisible(false);
// add(component);
// }
timeline = new Timeline(this);
timeline.setDuration(600);
addComponentListener(new ComponentAdapter()
{
@Override
public void componentResized(ComponentEvent e)
{
System.out.println("CurtainPanel2.componentResized");
refreshSize();
}
});
}
public void addComponentList(List<CurtainPagePanel> componentList)
{
this.componentList.addAll(componentList);
for(CurtainPagePanel curtainPagePanel : componentList)
{
curtainPagePanel.setAlignmentX(0.5f);
curtainPagePanel.setAlignmentY(0f);
curtainPagePanel.setMaximumSize(new Dimension(0, 0));
add(curtainPagePanel);
}
}
public void removeComponentList(List<CurtainPagePanel> componentList)
{
this.componentList.removeAll(componentList);
for(CurtainPagePanel curtainPagePanel : componentList)
{
remove(curtainPagePanel);
}
}
@Override
public boolean isOptimizedDrawingEnabled()
{
return false;
}
public void setCurrentComponentSize(Dimension size)
{
// System.out.println("size = " + size);
JComponent component = componentList.get(currentComponentIndex);
component.setMaximumSize(size);
revalidate();
}
public Dimension getCurrentComponentSize()
{
return componentList.get(currentComponentIndex).getMaximumSize();
}
public void refreshSize()
{
// controllerPanel.setMaximumSize(CurtainPanel2.this.getSize());
for(JComponent component : CurtainPanel2.this.componentList)
{
if(component.getMaximumSize().width > 10)
{
component.setMaximumSize(CurtainPanel2.this.getSize());
}
}
}
/**
* WARNNING: this method only works the Windows already setVisible!
* @param index
*/
public void setBottomComponent(int index)
{
if (index < 0 || index >= componentList.size())
return;
currentComponentIndex = index;
final CurtainPagePanel component = componentList.get(index);
// component.setVisible(true);
componentListByLayerOrder.remove(component);
componentListByLayerOrder.add(component);
this.removeAll();
// this.add(controllerPanel);
for(JComponent jcomponent : componentListByLayerOrder)
{
this.add(jcomponent);
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run()
{
// controllerPanel.setMaximumSize(getSize());
component.setMaximumSize(getSize());
revalidate();
}
});
}
// public void setTopComponent(int index)
// {
// if (index < 0 || index >= componentList.size())
// return;
//
// currentComponentIndex = index;
//
// final JComponent component = componentList.get(index);
//
// componentListByLayerOrder.remove(component);
// componentListByLayerOrder.add(0, component);
//
// this.removeAll();
// for(JComponent jcomponent : componentListByLayerOrder)
// {
// this.add(jcomponent);
// }
//
// SwingUtilities.invokeLater(new Runnable() {
// @Override
// public void run()
// {
// component.setMaximumSize(getSize());
// revalidate();
// }
// });
// }
public void pull(int index, boolean isDown)
{
//todo: should use state pattern here, refuse request if it is impossible.
if (index < 0 || index >= componentList.size())
return;
timeline.cancel();
CurtainPagePanel previousComponent = componentList.get(index);
previousComponent.curtainDeactivate();
currentComponentIndex = index;
CurtainPagePanel component = componentList.get(index);
// component.setVisible(true);
componentListByLayerOrder.remove(component);
componentListByLayerOrder.add(0, component);
this.removeAll();
// this.add(controllerPanel);
for(JComponent jcomponent : componentListByLayerOrder)
{
this.add(jcomponent);
}
//todo: use call back to activate the new panel.
// timeline.addCallback();
timeline.clearPropertyToInterpolate();
Dimension size = getSize();
timeline.addPropertyToInterpolate("currentComponentSize", new Dimension(size.width/2, 1), size);
if (isDown)
timeline.play();
else
timeline.playReverse();
//todo: need to fire property change once panel changed.
}
@Override
public void pullUpAllComponent(boolean includeBottomComponent)
{
JComponent excludeComponent = componentListByLayerOrder.get(componentListByLayerOrder.size() - 1);
for(JComponent component : componentList)
{
if (!includeBottomComponent)
if (component == excludeComponent)
continue;
component.setMaximumSize(new Dimension(1, 1));
}
}
}