package com.frinika.sequencer.gui.partview;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JPanel;
import javax.swing.Timer;
import com.frinika.project.gui.ProjectFrame;
import com.frinika.sequencer.gui.Layout;
import com.frinika.sequencer.model.EditHistoryAction;
import com.frinika.sequencer.model.EditHistoryRecordableAction;
import com.frinika.sequencer.model.EditHistoryListener;
import com.frinika.sequencer.model.EditHistoryRecordable;
import com.frinika.sequencer.model.Lane;
import com.frinika.sequencer.model.LaneTreeListener;
import com.frinika.sequencer.model.ViewableLaneList;
public class LaneHeaderPanel extends JPanel implements ComponentListener,
AdjustmentListener, EditHistoryListener, LaneTreeListener {
/**
*
*/
private static final long serialVersionUID = 1L;
// Box.Filler filler;
PartView partView;
int preferredWidth = 200;
ProjectFrame project;
ViewableLaneList visibleLanes;
private Timer timer;
public LaneHeaderPanel(PartView partView, ProjectFrame project) {
this.partView = partView;
setLayout(null);
setPreferredSize(new Dimension(preferredWidth, 1000));
// this.setBackground(Color.PINK);
// validate();
visibleLanes = new ViewableLaneList(project.getProjectContainer());
rebuild();
rePositionItems();
addComponentListener(this);
project.getProjectContainer().getEditHistoryContainer()
.addEditHistoryListener(this);
timer = new Timer(50, new ActionListener() {
public void actionPerformed(ActionEvent ae) {
updateMeters();
}
});
timer.start();
}
private void updateMeters() {
if (!isVisible()) return;
for (Component comp : getComponents()) {
assert (comp instanceof LaneHeaderItem);
LaneHeaderItem item= (LaneHeaderItem)comp;
item.updateMeter();
}
}
void dispose() {
timer.stop();
timer=null;
removeComponentListener(this);
project.getProjectContainer().getEditHistoryContainer()
.removeEditHistoryListener(this);
}
void rebuild() {
removeAll();
visibleLanes.rebuild();
int i = 0;
for (Lane lane : visibleLanes) {
Component c = new LaneHeaderItem(partView.getProjectFrame(),this, lane, i);
c.setSize(new Dimension(getWidth(), lane.getHeight()
* Layout.getLaneHeightScale()));
add(c);
i++;
}
validate();
repaint();
}
void rePositionItems() {
int n = getComponentCount();
if (n == 0)
return;
int widthOld = getComponent(0).getWidth();
int widthNew = getWidth();
int yRef = Layout.timePanelHeight - partView.getVirtualScreenRect().y;
for (Component comp : getComponents()) {
assert (comp instanceof LaneHeaderItem);
// if (widthOld == widthNew) comp.setLocation(0,yRef);
// else
int h = ((LaneHeaderItem) comp).lane.getDisplayH();
comp.setBounds(0, yRef, widthNew, h);
yRef += h;
}
validate();
repaint();
}
public void componentResized(ComponentEvent e) {
rePositionItems();
}
public void componentMoved(ComponentEvent e) {
}
public void componentShown(ComponentEvent e) {
System.out.println("SHWON");
timer.start();
}
public void componentHidden(ComponentEvent e) {
timer.stop();
}
public void adjustmentValueChanged(AdjustmentEvent e) {
rePositionItems();
}
public void fireSequenceDataChanged(EditHistoryAction[] edithistoryActions) {
boolean doit = false;
for (EditHistoryAction e : edithistoryActions) {
if (e instanceof EditHistoryRecordableAction) {
EditHistoryRecordable r = ((EditHistoryRecordableAction) e)
.getRecordable();
if (r instanceof Lane) {
doit = true;
break;
}
}
}
if (doit) {
rebuild();
rePositionItems();
}
}
public void fireLaneTreeChanged() {
rebuild();
rePositionItems();
}
}