All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jdesktop.swingx.demos.tree.MusicTreeModel Maven / Gradle / Ivy

package org.jdesktop.swingx.demos.tree;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Locale;

import javax.swing.JComponent;
import javax.swing.event.TreeModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

import org.jdesktop.swingx.treetable.TreeTableModel;

// interface TreeTableModel extends TreeModel
// interface javax.swing.table.TableModel
public class MusicTreeModel extends AbstractTableModel implements TreeTableModel, TableModel {

	/*
# Key:                                                                         #
#     Popular   / Classical                                                    #
# ----------------------------                                                 #
# A = Artist    / Composer                                                     #
# R = Record    / Style                                                        #
# S = Song Name / Composition                                                  #
# C = Catagory                                                                 #
	 */
    static public class MusicEntry {
    	static char SEPARATOR = ';';
    	private Integer id; // root == 0 or Null
    	String nameOrTitle; // Category: Classical, Jazz, ... ; Artist: Name; Album/Record: Title or Style
        String url; // wikimedia audio url of the song/composition or wikimedia image url of the album
        // f.i. "https://upload.wikimedia.org/wikipedia/en/a/ac/My_Name_Is_Albert_Ayler.jpg"
        
    	MusicEntry(String nameTitle) {
    		nameOrTitle = nameTitle;
    	}
    	MusicEntry(int id, String line) {
    		this.id = id;
			String titlePlusUrl = line.substring(2);
			int separator = titlePlusUrl.indexOf(SEPARATOR);
			url = null;
			if (separator == -1) {
				nameOrTitle = titlePlusUrl;
			} else {
				nameOrTitle = titlePlusUrl.substring(0, separator);
				url = titlePlusUrl.substring(separator+1);
			}
    	}
    	
		public URL getURL() {
			return null;
		}
		public URI getURI() {
			return null;
		}
		public String toString() {
			return nameOrTitle;
		}
    }
    static URL getURL(String url) {
		try {
			return url==null ? null : new URL(url);
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;		
    }
    
    static public class Artist extends MusicEntry {
        
    	Artist(int id, String line) {
			super(id, line);
		}

		public URL getURL() {
			return MusicTreeModel.getURL(url);
		}

		public URI getURI() {
			if(url==null) return null;
			try {
				Locale defaultLocale = JComponent.getDefaultLocale();
				return new URI(url.replace("{language}", defaultLocale.getLanguage()));
			} catch (URISyntaxException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return null;
		}

    }
    
    static public class Album extends MusicEntry {
        
		Album(int id, String line) {
			super(id, line);
		}

		public URL getURL() {
			return MusicTreeModel.getURL(url);
		}
		
		public String getHtmlSrc() {
			if(url==null) return null;
			return "" + ""+ "";
		}

    }
    
    static public class Song extends MusicEntry { // or Composition
        
        Song(int id, String line) {
        	super(id, line);
		}

		public URL getURL() {
			return MusicTreeModel.getURL(url);
		}
		
/*
    
or
	
	
    setToolTipText("
" + utl + "
"); */ public String getHtmlSrc() { if(url==null) return null; return "" + "
"+url+"
" + ""; } public URI getURI() { if(url==null) return null; try { return new URI(url); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } // public JXHyperlink getHyperlink() { // if(url==null) return null; // JXHyperlink song = new JXHyperlink(); // song.setName("song"); // try { // song.setURI(new URI(url)); // } catch (URISyntaxException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // return song; // } } int rowCount = 0; DefaultMutableTreeNode top; DefaultMutableTreeNode catagory; DefaultMutableTreeNode artist; DefaultMutableTreeNode record; DefaultMutableTreeNode song; private MusicTreeModel() { super(); } MusicTreeModel(String topName, URL url) { this(); // LOG.info(top + " tree data url="+url); // use url.getProtocol() or url.getPath() top = new DefaultMutableTreeNode(new MusicEntry(topName==null ? url.getPath() : topName)); try { // convert url to buffered string InputStream is = url.openStream(); InputStreamReader isr = new InputStreamReader(is, "UTF-8"); BufferedReader reader = new BufferedReader(isr); // read one line at a time, put into tree String line = reader.readLine(); while(line != null) { // LOG.fine("reading in: ->" + line + "<-"); char linetype = line.charAt(0); switch(linetype) { case 'C': rowCount++; catagory = new DefaultMutableTreeNode(new MusicEntry(rowCount, line)); top.add(catagory); break; case 'A': if(catagory != null) { rowCount++; catagory.add(artist = new DefaultMutableTreeNode(new Artist(rowCount, line))); } break; case 'R': if(artist != null) { rowCount++; artist.add(record = new DefaultMutableTreeNode(new Album(rowCount, line))); } break; case 'S': if(record != null) { rowCount++; record.add(song = new DefaultMutableTreeNode(new Song(rowCount, line))); } break; default: break; } line = reader.readLine(); } } catch (IOException e) { } } // implements abstract methods of AbstractTableModel ---------------------------- @Override public int getRowCount() { return rowCount; } @Override public Object getValueAt(int rowIndex, int columnIndex) { if(rowIndex==0) { Object o = getRoot(); MusicEntry me = (MusicEntry)o; switch(columnIndex) { case 0: return me.id; case 1: return me.toString(); case 2: return me.getURL(); default: break; } } // System.out.println("rowIndex="+rowIndex + ", columnIndex="+columnIndex); Enumeration nodes = top.breadthFirstEnumeration(); while(nodes.hasMoreElements()) { TreeNode next = nodes.nextElement(); if(next instanceof DefaultMutableTreeNode dmtn) { Object o = dmtn.getUserObject(); MusicEntry me = (MusicEntry)o; if(me.id!=null && rowIndex==me.id.intValue()) { switch(columnIndex) { case 0: return me.id; case 1: return me.toString(); case 2: return me.getURL(); //break; default: break; } } } } return null; } // implements interface TreeModel and TreeTableModel --------------------------------- @Override public Object getRoot() { return top.getUserObject(); } @Override public Object getChild(Object parent, int index) { Enumeration nodes = top.breadthFirstEnumeration(); while(nodes.hasMoreElements()) { TreeNode next = nodes.nextElement(); if(next instanceof DefaultMutableTreeNode dmtn) { if(parent==dmtn.getUserObject()) { return ((DefaultMutableTreeNode)dmtn.getChildAt(index)).getUserObject(); } } } return null; } @Override public int getChildCount(Object parent) { Enumeration nodes = top.breadthFirstEnumeration(); while(nodes.hasMoreElements()) { TreeNode next = nodes.nextElement(); if(next instanceof DefaultMutableTreeNode dmtn) { if(parent==dmtn.getUserObject()) { return dmtn.getChildCount(); } } } return -1; } @Override public boolean isLeaf(Object node) { return getChildCount(node) == 0; // liefert bei node nicht im Baum false! } @Override public void valueForPathChanged(TreePath path, Object newValue) { // TODO Auto-generated method stub } @Override public int getIndexOfChild(Object parent, Object child) { Enumeration nodes = top.breadthFirstEnumeration(); while(nodes.hasMoreElements()) { TreeNode next = nodes.nextElement(); if(next instanceof DefaultMutableTreeNode dmtn) { if(parent==dmtn.getUserObject()) { Enumeration children = dmtn.children(); int ret = 0; while(children.hasMoreElements()) { if(child==((DefaultMutableTreeNode)children.nextElement()).getUserObject()) return ret; ret++; } } } } return -1; } @Override public void addTreeModelListener(TreeModelListener l) { // TODO Auto-generated method stub } @Override public void removeTreeModelListener(TreeModelListener l) { // TODO Auto-generated method stub } // P-S. TableModelListener management provided by AbstractTableModel superclass: // public void addTableModelListener(TableModelListener l); // public void removeTableModelListener(TableModelListener l); // ab hier TreeTableModel >>>>>>>>>>>>>>>>>>>>>> @Override public Class getColumnClass(int columnIndex) { if(columnIndex==0) return Integer.class; if(columnIndex==1) return String.class; if(columnIndex==2) return String.class; // nicht URL.class; return super.getColumnClass(columnIndex); } @Override public int getColumnCount() { return 3; } @Override public String getColumnName(int column) { if(column==0) return "id"; if(column==1) return "name"; if(column==2) return "url"; return super.getColumnName(column); } @Override public int getHierarchicalColumn() { return 1; } @Override public Object getValueAt(Object node, int column) { if(column<0 || column>=getColumnCount()) return null; Enumeration nodes = top.breadthFirstEnumeration(); while(nodes.hasMoreElements()) { TreeNode next = nodes.nextElement(); if(next instanceof DefaultMutableTreeNode dmtn) { if(node==dmtn.getUserObject()) { if(column==0) return ((MusicEntry)node).id; if(column==1) return ((MusicEntry)node).nameOrTitle; if(column==2) return ((MusicEntry)node).url; } } } return null; } @Override public boolean isCellEditable(Object node, int column) { // TODO Auto-generated method stub return false; } @Override public void setValueAt(Object value, Object node, int column) { // TODO Auto-generated method stub } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy