/* Copyright (C) 2006 Christian Schneider * * This file is part of Nomad. * * Nomad is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Nomad is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Nomad; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package net.sf.nmedit.jsynth.nomad.forms; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import net.sf.nmedit.nomad.core.service.ServiceRegistry; import net.sf.nmedit.nomad.core.service.synthService.NewSynthService; public class NomadSynthDeviceDialogHandler extends JPanel implements ActionListener { /** * */ private static final long serialVersionUID = -7101533839902727059L; public static final String UNKNOWN_VENDOR = "unknown"; private JTree deviceTree; private JPanel btnPane; private JButton btnCreate; private JButton btnCancel; public NomadSynthDeviceDialogHandler() { setLayout(new BorderLayout()); deviceTree = new JTree(createModel()); deviceTree.setRootVisible(false); btnPane = new JPanel(); add(deviceTree, BorderLayout.CENTER); add(btnPane, BorderLayout.SOUTH); btnCreate = new JButton("Create"); btnCancel = new JButton("Cancel"); btnPane.setLayout(new BoxLayout(btnPane, BoxLayout.X_AXIS)); btnPane.add(Box.createHorizontalGlue()); btnPane.add(btnCreate); btnPane.add(Box.createHorizontalStrut(6)); btnPane.add(btnCancel); } private TreeModel createModel() { DefaultMutableTreeNode root = new DefaultMutableTreeNode(); populate(root); return new DefaultTreeModel(root); } private void populate(DefaultMutableTreeNode root) { List<NewSynthService> list = new ArrayList<NewSynthService>(); { Iterator<NewSynthService> i = ServiceRegistry.getServices(NewSynthService.class); while (i.hasNext()) list.add(i.next()); } Collections.sort(list, new SortByVendor()); int index = 0; while (index<list.size()) { NewSynthService s = list.get(index); String vendorName = vendor(s); int end = index; while (++end<list.size() && vendorName.equals(vendor(list.get(end)))); DefaultMutableTreeNode vendorNode = new DefaultMutableTreeNode(vendorName); root.add(vendorNode); for (int i=index;i<end;i++) vendorNode.add(new SynthNode(list.get(i))); index = end; } } private static class SynthNode extends DefaultMutableTreeNode { /** * */ private static final long serialVersionUID = 8011062922142830497L; public SynthNode(NewSynthService s) { super(s); } public NewSynthService getService() { return (NewSynthService) getUserObject(); } public String toString() { return getService() .getSynthName(); } } private static String vendor(NewSynthService s) { String name = s.getSynthVendor(); if (name == null) name = UNKNOWN_VENDOR; return name; } private class SortByVendor implements Comparator<NewSynthService> { public int compare(NewSynthService o1, NewSynthService o2) { return vendor(o1).compareTo(vendor(o2)); } } public static void main(String[] args) { NomadSynthDeviceDialogHandler form = new NomadSynthDeviceDialogHandler(); JFrame f = new JFrame("Devices"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setBounds(10, 10, 400, 300); f.getContentPane().setLayout(new BorderLayout()); f.getContentPane().add(form, BorderLayout.CENTER); f.setVisible(true); } public void actionPerformed(ActionEvent e) { if (e.getSource() == btnCreate) { createSelected(); } } private void createSelected() { TreePath selectedPath = deviceTree.getSelectionPath(); if (selectedPath == null) return; //DefaultTreeModel model = ((DefaultTreeModel)deviceTree.getModel()); TreeNode node = (TreeNode) selectedPath.getLastPathComponent(); if (node == null) return ; SynthNode snode = (SynthNode) node; snode.getService().newSynth(); } }