package de.zigapeda.flowspring.controller;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Date;
import javax.swing.JViewport;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import de.zigapeda.flowspring.Main;
import de.zigapeda.flowspring.data.PlaylistTrack;
import de.zigapeda.flowspring.data.Title;
import de.zigapeda.flowspring.data.YoutubeVideo;
import de.zigapeda.flowspring.gui.treetable.TreeTable;
import de.zigapeda.flowspring.gui.treetable.TreeTableCellRenderer;
import de.zigapeda.flowspring.interfaces.TreeRow;
public class MediaLibraryListener implements MouseListener, KeyListener, TreeExpansionListener {
private TreeTable medialibrary;
private Date lastpress;
private String searchstring;
private boolean control;
public MediaLibraryListener(TreeTable medialibrary) {
this.medialibrary = medialibrary;
this.lastpress = new Date();
this.searchstring = new String();
}
public void mouseClicked(MouseEvent e) {
if(e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
TreeRow selrow = this.medialibrary.getValueAt(this.medialibrary.getSelectedRow());
if(selrow != null) {
if(selrow.getType() == TreeRow.Title) {
Main.getWindow().getPlaylist().addTrack(new PlaylistTrack(selrow.getId(), selrow.getArtist() + " - " + selrow.getName(),selrow.getInt(),((Title)selrow).getPath()));
} else if(selrow.getType() == TreeRow.YoutubeVideo) {
Main.getWindow().getPlaylist().addTrack(new PlaylistTrack(selrow.getName(),selrow.getInt(),((YoutubeVideo)selrow).getVideoUrl()));
} else {
int temp = this.medialibrary.getSelectedRow();
TreeTableCellRenderer ttcr = ((TreeTableCellRenderer)this.medialibrary.getCellRenderer(this.medialibrary.getSelectedRow(), 0));
if(ttcr.isCollapsed(this.medialibrary.getSelectedRow())) {
ttcr.expandRow(this.medialibrary.getSelectedRow());
this.medialibrary.getSelectionModel().setSelectionInterval(temp + 1, temp + 1);
this.scrollTo(temp + this.medialibrary.getNodeAt(temp).getChildren().size());
this.scrollTo(temp);
} else {
ttcr.collapseRow(this.medialibrary.getSelectedRow());
}
}
}
} else if(e.getButton() == MouseEvent.BUTTON3) {
int temp = this.medialibrary.rowAtPoint(e.getPoint());
this.medialibrary.getSelectionModel().setSelectionInterval(temp, temp);
TreeRow selrow = this.medialibrary.getValueAt(temp);
Main.getWindow().showMedialibraryMenu(selrow, e.getX(), e.getY());
}
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void treeExpanded(TreeExpansionEvent event) {
int temp = this.medialibrary.getTree().getRowForPath(event.getPath());
this.scrollTo(temp + this.medialibrary.getNodeAt(temp).getChildren().size());
this.scrollTo(temp);
}
public void treeCollapsed(TreeExpansionEvent event) {
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_RIGHT:
if(this.medialibrary.getValueAt(this.medialibrary.getSelectedRow()).getType() != 1) {
int temp = this.medialibrary.getSelectedRow();
((TreeTableCellRenderer)this.medialibrary.getCellRenderer(this.medialibrary.getSelectedRow(), 0)).expandRow(this.medialibrary.getSelectedRow());
this.medialibrary.getSelectionModel().setSelectionInterval(temp + 1, temp + 1);
this.scrollTo(temp + this.medialibrary.getNodeAt(temp).getChildren().size());
this.scrollTo(temp);
}
e.consume();
break;
case KeyEvent.VK_LEFT:
System.out.println(this.medialibrary.getNodeAt(this.medialibrary.getSelectedRow()).isRoot());
if(this.medialibrary.getNodeAt(this.medialibrary.getSelectedRow()).isRoot() == true) {
if(this.medialibrary.getValueAt(this.medialibrary.getSelectedRow()).getType() != TreeRow.Title
&& this.medialibrary.getValueAt(this.medialibrary.getSelectedRow()).getType() != TreeRow.YoutubeVideo) {
int temp = this.medialibrary.getSelectedRow();
((TreeTableCellRenderer)this.medialibrary.getCellRenderer(this.medialibrary.getSelectedRow(), 0)).collapseRow(this.medialibrary.getSelectedRow());
this.medialibrary.getSelectionModel().setSelectionInterval(temp, temp);
this.scrollTo(temp);
}
} else {
if(this.medialibrary.getValueAt(this.medialibrary.getSelectedRow()).getType() != TreeRow.Title
&& this.medialibrary.getValueAt(this.medialibrary.getSelectedRow()).getType() != TreeRow.YoutubeVideo) {
if(((TreeTableCellRenderer)this.medialibrary.getCellRenderer(this.medialibrary.getSelectedRow(), 0)).isExpanded(this.medialibrary.getSelectedRow())) {
int temp = this.medialibrary.getSelectedRow();
((TreeTableCellRenderer)this.medialibrary.getCellRenderer(this.medialibrary.getSelectedRow(), 0)).collapseRow(this.medialibrary.getSelectedRow());
this.medialibrary.getSelectionModel().setSelectionInterval(temp, temp);
this.scrollTo(temp);
} else {
int temp = this.medialibrary.getParentRowAt(this.medialibrary.getSelectedRow());
((TreeTableCellRenderer)this.medialibrary.getCellRenderer(temp, 0)).collapseRow(temp);
this.medialibrary.getSelectionModel().setSelectionInterval(temp, temp);
this.scrollTo(temp);
}
} else {
int temp = this.medialibrary.getParentRowAt(this.medialibrary.getSelectedRow());
((TreeTableCellRenderer)this.medialibrary.getCellRenderer(temp, 0)).collapseRow(temp);
this.medialibrary.getSelectionModel().setSelectionInterval(temp, temp);
this.scrollTo(temp);
}
}
e.consume();
break;
case KeyEvent.VK_CONTROL:
this.control = true;
break;
case KeyEvent.VK_ENTER:
if(this.medialibrary.getValueAt(this.medialibrary.getSelectedRow()).getType() == TreeRow.Title) {
int temp = this.medialibrary.getSelectedRow();
TreeRow selrow = this.medialibrary.getValueAt(temp);
Main.getWindow().getPlaylist().addTrack(new PlaylistTrack(selrow.getId(), selrow.getArtist() + " - " + selrow.getName(),selrow.getInt(),((Title)selrow).getPath()));
this.medialibrary.getSelectionModel().setSelectionInterval(temp + 1, temp + 1);
} else if(this.medialibrary.getValueAt(this.medialibrary.getSelectedRow()).getType() == TreeRow.YoutubeVideo) {
int temp = this.medialibrary.getSelectedRow();
TreeRow selrow = this.medialibrary.getValueAt(temp);
Main.getWindow().getPlaylist().addTrack(new PlaylistTrack(selrow.getName(),selrow.getInt(),((YoutubeVideo)selrow).getVideoUrl()));
this.medialibrary.getSelectionModel().setSelectionInterval(temp + 1, temp + 1);
} else {
int temp = this.medialibrary.getSelectedRow();
((TreeTableCellRenderer)this.medialibrary.getCellRenderer(temp, 0)).expandRow(temp);
this.medialibrary.getSelectionModel().setSelectionInterval(temp + 1, temp + 1);
}
e.consume();
break;
}
if(e.getKeyChar() != 65535 && e.getKeyChar() != 10) {
if(this.control) {
if(e.getKeyCode() == 70) {
Main.getWindow().setSearch("");
}
} else {
if(this.lastpress.getTime() + 2000 < new Date().getTime()) {
this.searchstring = "";
}
this.searchstring = this.searchstring + e.getKeyChar();
this.lastpress = new Date();
int currow = this.medialibrary.getSelectedRow();
if(!this.medialibrary.getValueAt(currow).getName().toLowerCase().startsWith(this.searchstring)) {
int newrow = currow + 1;
if(this.medialibrary.getRowCount() == newrow) {
newrow = 0;
}
while(this.medialibrary.getValueAt(newrow).getName().toLowerCase().startsWith(this.searchstring) == false && newrow != currow) {
newrow++;
if(this.medialibrary.getRowCount() == newrow) {
newrow = 0;
}
}
if(newrow == currow) {
Main.getWindow().setSearch(this.searchstring);
this.searchstring = "";
} else {
this.medialibrary.getSelectionModel().setSelectionInterval(newrow, newrow);
}
this.scrollTo(newrow);
}
}
} else {
this.searchstring = "";
}
}
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_CONTROL) {
this.control = false;
}
}
private void scrollTo(int newrow) {
JViewport viewport = (JViewport)this.medialibrary.getParent();
Rectangle rect = this.medialibrary.getCellRect(newrow, 0, true);
Point pt = viewport.getViewPosition();
rect.setLocation(rect.x-pt.x, rect.y-pt.y);
viewport.scrollRectToVisible(rect);
}
}