package de.zigapeda.flowspring.gui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.awt.image.BufferedImage; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.LinkedList; import javax.imageio.ImageIO; import javax.swing.JButton; import javax.swing.JCheckBoxMenuItem; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.event.ChangeEvent; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.TableColumnModelEvent; import javax.swing.event.TableColumnModelListener; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.JTableHeader; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.tree.TreePath; import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; import de.zigapeda.flowspring.Main; import de.zigapeda.flowspring.controller.MediaLibraryListener; import de.zigapeda.flowspring.controller.Settings; import de.zigapeda.flowspring.data.Column; import de.zigapeda.flowspring.data.DataNode; import de.zigapeda.flowspring.data.Title; import de.zigapeda.flowspring.gui.treetable.AbstractTreeTableModel; import de.zigapeda.flowspring.gui.treetable.DataModel; import de.zigapeda.flowspring.gui.treetable.TreeTable; import de.zigapeda.flowspring.gui.treetable.TreeTableCellRenderer; import de.zigapeda.flowspring.interfaces.TreeRow; import de.zigapeda.flowspring.player.PlayerController; public class MainWindow extends JFrame implements ActionListener, TableColumnModelListener, KeyListener, DocumentListener, WindowListener, MouseListener { private static final long serialVersionUID = 1L; private AbstractTreeTableModel medialibrarymodel; private TreeTable medialibrary; private Playlist playlist; private Controllbar controllbar; private Searchbar searchbar; private Progressbar progressbar; private Volumebar volumebar; // private Balancebar balancebar; private PlayerController playercontroller; private JButton menubutton; private JButton playbutton; private JButton previousbutton; private JButton nextbutton; private JButton stopbutton; private DefaultTableColumnModel medialibrarycolumns; private JPopupMenu columnmenu; private JPopupMenu menu; private MedialibraryRenderer medialibraryrenderer; private JSplitPane splitpane; private JPopupMenu medialibrarymenu; private JPanel controlllayout; private boolean sortdirection; private int sortindex; private int sortcolumn; private JButton layoutbutton; private Container oldpane; private JPanel left; public MainWindow() { super("flowspring"); BufferedImage image; try { image = ImageIO.read(Main.class.getClass().getResource("/de/zigapeda/flowspring/res/icon.png")); this.setIconImage(image); } catch (IOException e) { e.printStackTrace(); } this.addWindowListener(this); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setLayout(new BorderLayout()); left = new JPanel(); left.setLayout(new BorderLayout()); this.controlllayout = this.setupControlllayout(); left.add(this.controlllayout, BorderLayout.PAGE_START); EmbeddedMediaPlayerComponent empc = new EmbeddedMediaPlayerComponent(); empc.setBounds(0, 0, 0, 0); this.add(empc); this.playercontroller = new PlayerController(this.progressbar, this.playlist, empc); playercontroller.setGain(this.volumebar.getValue()); left.add(new JScrollPane(this.medialibrary)); this.playlist.setMinimumSize(new Dimension(179,560)); splitpane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, this.playlist); splitpane.setResizeWeight(0.9); splitpane.setDividerSize(3); this.add(splitpane); String windowbounds = Settings.loadSettings("window.bounds"); int dividerlocation = 601; if(windowbounds != null) { String[] wba = windowbounds.split(","); this.setBounds(Integer.valueOf(wba[2]), Integer.valueOf(wba[3]), Integer.valueOf(wba[0]), Integer.valueOf(wba[1])); if(Integer.valueOf(wba[4]) != JFrame.ICONIFIED) { this.setExtendedState(Integer.valueOf(wba[4])); } dividerlocation = Integer.valueOf(wba[5]); } else { Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize(); this.setBounds(screensize.width/2 - 400, screensize.height/2 - 300, 800, 600); } this.setMinimumSize(new Dimension(800, 600)); splitpane.setDividerLocation(dividerlocation); columnmenu = new JPopupMenu(); this.menu = new JPopupMenu(); JMenuItem item = new JMenuItem(); item.setText("Read Mediafiles"); item.setActionCommand("read"); item.addActionListener(this); this.menu.add(item); } private JPanel setupControlllayout() { JPanel controlls = new JPanel(); this.playlist = new Playlist(); this.setupMedialibrary(); controlls.setLayout(null); Insets noinset = new Insets(-10, -10, -10, -10); this.controllbar = new Controllbar(); this.searchbar = new Searchbar(); this.progressbar = new Progressbar(); this.volumebar = new Volumebar(); // this.balancebar = new Balancebar(); menubutton = new JButton("▾"); playbutton = new JButton("►"); previousbutton = new JButton("◄◄"); nextbutton = new JButton("►►"); stopbutton = new JButton("■"); layoutbutton = new JButton("M"); Font small = new Font(playbutton.getFont().getName(), playbutton.getFont().getStyle(), playbutton.getFont().getSize() - 2); Font big = new Font(playbutton.getFont().getName(), playbutton.getFont().getStyle(), playbutton.getFont().getSize() + 11); menubutton.setMargin(noinset); playbutton.setMargin(noinset); playbutton.setFont(big); previousbutton.setMargin(noinset); previousbutton.setFont(small); nextbutton.setMargin(noinset); nextbutton.setFont(small); stopbutton.setMargin(noinset); stopbutton.setFont(small); layoutbutton.setMargin(noinset); this.searchbar.addKeyListener(this); this.searchbar.getDocument().addDocumentListener(this); playbutton.addActionListener(this); previousbutton.addActionListener(this); nextbutton.addActionListener(this); stopbutton.addActionListener(this); menubutton.addActionListener(this); layoutbutton.addActionListener(this); controllbar.setBounds(30, 90, 380, 30); this.searchbar.setBounds(415,95,185,25); this.progressbar.setBounds(100, 56, 500, 28); //this.progressbar.setBounds(100, 70, 500, 14); this.volumebar.setBounds(100, 29, 100, 28); // this.balancebar.setBounds(100,29,100,28); menubutton.setBounds(5, 95, 25, 25); playbutton.setBounds(5, 5, 90, 60); previousbutton.setBounds(5,65,30,24); nextbutton.setBounds(65,65,30,24); stopbutton.setBounds(35,65,30,24); layoutbutton.setBounds(580,0,20,20); controlls.setPreferredSize(new Dimension(600, 120)); controlls.setMinimumSize(new Dimension(600, 120)); controlls.add(controllbar); controlls.add(this.progressbar); controlls.add(this.volumebar); // controlls.add(this.balancebar); controlls.add(this.searchbar); controlls.add(menubutton); controlls.add(playbutton); controlls.add(previousbutton); controlls.add(nextbutton); controlls.add(stopbutton); controlls.add(layoutbutton); return controlls; } private void setupMedialibrary() { this.medialibrarymodel = new DataModel(DataNode.getLibrary()); this.medialibrarycolumns = new DefaultTableColumnModel(); this.medialibraryrenderer = new MedialibraryRenderer(); this.medialibrary = new TreeTable(this.medialibrarymodel); MediaLibraryListener medialibrarylistener = new MediaLibraryListener(this.medialibrary); this.medialibrary.setListener(medialibrarylistener); this.medialibrary.setColumnModel(this.medialibrarycolumns); this.medialibrarycolumns.addColumnModelListener(this); this.medialibrary.addMouseListener(medialibrarylistener); this.medialibrary.addKeyListener(medialibrarylistener); this.medialibrary.getTableHeader().addMouseListener(this); this.medialibrary.setShowGrid(true); } public void setPlaybuttonpause(boolean pause) { if(pause == true) { this.playbutton.setText("ǁ"); } else { this.playbutton.setText("►"); } } public Controllbar getControlllayout() { return this.controllbar; } public void setSearch(String search) { this.searchbar.setText(search); this.searchbar.requestFocus(); } public void refreshMedialib() { LinkedList<TreePath> list = new LinkedList<>(); if(this.medialibrarymodel.getRoot() == DataNode.getLibrary()) { for(int i = 0; i < this.medialibrary.getRowCount(); i++) { if(((TreeTableCellRenderer)this.medialibrary.getCellRenderer(i, 0)).isExpanded(i)) { list.add(this.medialibrary.getPathAt(i)); } } } this.searchbar.setText(""); this.medialibrarymodel = new DataModel(DataNode.getLibrary()); this.medialibrary.setModel(this.medialibrarymodel); this.setColumns(); for(TreePath path: list) { this.medialibrary.getTree().expandPath(path); } } public void refreshMedialibAfterRegroup() { this.searchbar.setText(""); this.medialibrarymodel = new DataModel(DataNode.getLibrary()); this.medialibrary.setModel(this.medialibrarymodel); this.setColumns(); } public void refreshSearch() { this.medialibrarymodel = new DataModel(DataNode.getSearch()); this.medialibrary.setModel(this.medialibrarymodel); this.setColumns(); } private void setColumns() { do { if(Column.getMedialibrarycolumns() == null) { LinkedList<Column> list = new LinkedList<>(); System.out.println(this.medialibrarycolumns.getColumnCount()); for(int i = 0; i < this.medialibrarycolumns.getColumnCount(); i++) { list.add(new Column(this.medialibrarycolumns.getColumn(i), this.medialibrarycolumns.getColumn(i).getWidth(), true)); } System.out.println(list.size()); String medialibcolumns = Settings.loadSettings("medialib.columns"); if(medialibcolumns != null) { // medialibcolumns = ""; if(medialibcolumns.contains("Name")) { System.out.println("load settings succeed"); LinkedList<Column> newlist = new LinkedList<>(); String[] mca = medialibcolumns.split(","); for(String s: mca) { TableColumn tc = null; for(Column c: list) { if(DataModel.columnNames[c.getColumn().getModelIndex()].equals(s.substring(5))) { tc = c.getColumn(); break; } } if(s.substring(0,1).equals("t")) { newlist.add(new Column(tc, Integer.valueOf(s.substring(1,5)), true)); } else { newlist.add(new Column(tc, Integer.valueOf(s.substring(1,5)), false)); } } System.out.println(newlist.size()); Column.setMedialibrarycolumns(newlist); } else { Column.setMedialibrarycolumns(list); } } else { Column.setMedialibrarycolumns(list); } System.out.println(Column.getMedialibrarycolumns().size()); } while (this.medialibrarycolumns.getColumnCount() > 0) { if(Column.getMedialibrarycolumns().size() < 10) { System.out.println("fehler"); Column.setMedialibrarycolumns(null); } this.medialibrarycolumns.removeColumn(this.medialibrarycolumns.getColumn(0)); } if(Column.getMedialibrarycolumns() == null) { for(int i = 0; i < 10; i++) { this.medialibrarycolumns.addColumn(new TableColumn(i)); } } System.out.println("durchlauf"); } while (Column.getMedialibrarycolumns() == null); System.out.println("---"); System.out.println(Column.getMedialibrarycolumns().size()); for(Column c: Column.getMedialibrarycolumns()) { if(c.isVisible()) { c.getColumn().setPreferredWidth(c.getWidth()); this.medialibrarycolumns.addColumn(c.getColumn()); if(c.getColumn().getModelIndex() != 0) { c.getColumn().setCellRenderer(this.medialibraryrenderer); } } } } public TreeTable getMediaLibrary() { return this.medialibrary; } public Playlist getPlaylist() { return this.playlist; } public PlayerController getPlayercontroller() { return this.playercontroller; } public void showMedialibraryMenu(TreeRow row, int x, int y) { this.medialibrarymenu = new JPopupMenu(); this.medialibrarymenu.add(new JMenuItem(row.getType().toString())); this.medialibrarymenu.show(this.medialibrary, x, y); } public void actionPerformed(ActionEvent e) { if(e.getSource() == this.playbutton) { this.playercontroller.play(); } else if(e.getSource() == this.stopbutton) { this.playercontroller.stop(); } else if(e.getSource() == this.nextbutton) { this.playercontroller.next(); } else if(e.getSource() == this.previousbutton) { this.playercontroller.previous(); } else if(e.getSource() == this.menubutton) { this.menu.show(this.menubutton, 10, 10); } else if(e.getSource() == this.layoutbutton) { changeLayout(); } else if(e.getSource() instanceof JCheckBoxMenuItem) { if(this.columnmenu.getComponentIndex((Component)e.getSource()) != -1) { Column c = Column.getColumnByName(Column.getMedialibrarycolumns(),((JCheckBoxMenuItem)e.getSource()).getText()); if(c != null) { c.setVisible(!c.isVisible()); this.setColumns(); } } } else if(e.getSource() instanceof JMenuItem) { switch(e.getActionCommand()) { case "read": if(Main.getReadWindow() != null) { Main.getReadWindow().toFront(); } else { Main.setReadWindow(new ReadWindow()); } break; } } } private void changeLayout() { if(this.getMinimumSize().getHeight() == 600) { //big layout to small layout this.setMinimumSize(new Dimension(605, 120)); this.setResizable(false); this.setSize(600, 120); this.oldpane = this.getContentPane(); this.setContentPane(this.controlllayout); } else { //small layout to big layout this.setResizable(true); this.setMinimumSize(new Dimension(800, 600)); this.setContentPane(this.oldpane); this.left.add(this.controlllayout,BorderLayout.PAGE_START); } } public void columnAdded(TableColumnModelEvent e) { } public void columnRemoved(TableColumnModelEvent e) { } public void columnMoved(TableColumnModelEvent e) { if(this.medialibrarycolumns.getColumn(0).getModelIndex() == 0) { LinkedList<Column> list = new LinkedList<>(); for(int i = 0; i < this.medialibrarycolumns.getColumnCount(); i++) { list.add(new Column(this.medialibrarycolumns.getColumn(i), this.medialibrarycolumns.getColumn(i).getWidth(), true)); } list.addAll(Column.getHiddenColumns(Column.getMedialibrarycolumns())); Column.setMedialibrarycolumns(list); } else { this.setColumns(); } } public void columnMarginChanged(ChangeEvent e) { LinkedList<Column> list = new LinkedList<>(); for(int i = 0; i < this.medialibrarycolumns.getColumnCount(); i++) { list.add(new Column(this.medialibrarycolumns.getColumn(i), this.medialibrarycolumns.getColumn(i).getWidth(), true)); } list.addAll(Column.getHiddenColumns(Column.getMedialibrarycolumns())); Column.setMedialibrarycolumns(list); } public void columnSelectionChanged(ListSelectionEvent e) { } public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { if(e.getSource() == this.searchbar) { if(e.getKeyCode() == KeyEvent.VK_ENTER) { searchbarchange(false); this.medialibrary.getSelectionModel().setSelectionInterval(0, 0); this.medialibrary.requestFocus(); } } } public void keyReleased(KeyEvent e) { } public void insertUpdate(DocumentEvent e) { this.searchbarchange(true); } public void removeUpdate(DocumentEvent e) { this.searchbarchange(true); } public void changedUpdate(DocumentEvent e) { this.searchbarchange(true); } private void searchbarchange(boolean length) { if(this.searchbar.getText().length() >= 3 || length == false) { DataNode.getSearch().setChildren(Title.getTitlesBySearchstring(this.searchbar.getText())); this.refreshSearch(); } else if(this.searchbar.getText().length() == 0) { this.refreshMedialib(); } } private String getPositionString() { String temp = new String(); int ext = this.getExtendedState(); this.setExtendedState(0); temp = temp + String.valueOf(this.getWidth()) + ","; temp = temp + String.valueOf(this.getHeight()) + ","; temp = temp + String.valueOf(this.getX()) + ","; temp = temp + String.valueOf(this.getY()) + ","; temp = temp + String.valueOf(ext) + ","; temp = temp + String.valueOf(this.splitpane.getDividerLocation()); return temp; } public void windowOpened(WindowEvent e) { } public void windowClosing(WindowEvent evt) { Settings.saveSettings("window.bounds", this.getPositionString()); Settings.saveSettings("medialib.columns", Column.getColumnlistString(Column.getMedialibrarycolumns())); Settings.saveSettings("volume", String.valueOf(this.volumebar.getValue())); // Settings.saveSettings("balance", String.valueOf(this.balancebar.getValue())); Connection c = Main.getDatabase(); try { Statement s = c.createStatement(); s.executeUpdate("shutdown"); s.close(); } catch (SQLException e) { e.printStackTrace(); } } public void windowClosed(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowActivated(WindowEvent e) { if(Main.getOntopwindow() != null) { Main.getOntopwindow().requestFocus(); } } public void windowDeactivated(WindowEvent e) { } public int getSortIndex() { return this.sortindex; } public boolean getSortDirection() { return this.sortdirection; } public void mouseClicked(MouseEvent e) { if(e.getButton() == MouseEvent.BUTTON1) { TableColumnModel cm = ((JTableHeader)e.getSource()).getColumnModel(); int colindex = cm.getColumnIndexAtX(e.getX()); int modindex = cm.getColumn(colindex).getModelIndex(); this.medialibrarycolumns.getColumn(this.sortcolumn).setHeaderValue(DataModel.columnNames[this.sortindex]); if(modindex == this.sortindex) { this.sortdirection = !this.sortdirection; } else { this.sortcolumn = colindex; this.sortindex = modindex; this.sortdirection = false; } if(this.sortdirection) { this.medialibrarycolumns.getColumn(colindex).setHeaderValue(DataModel.columnNames[modindex] + " ▼"); } else { this.medialibrarycolumns.getColumn(colindex).setHeaderValue(DataModel.columnNames[modindex] + " ▲"); } this.refreshMedialib(); } else if(e.getButton() == MouseEvent.BUTTON3) { this.columnmenu.removeAll(); LinkedList<Column> list = Column.getMedialibrarycolumns(); if(list != null) { for(Column c: list) { if(c.getColumn().getModelIndex() != 0) { this.columnmenu.add(new JCheckBoxMenuItem(DataModel.columnNames[c.getColumn().getModelIndex()], c.isVisible())).addActionListener(this); } } } this.columnmenu.show(this.medialibrary.getTableHeader(), e.getX(), e.getY()); } } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }