/*
* @(#)BasicJMD.java 1.8 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package com.sun.media;
import java.lang.*;
import javax.media.*;
import javax.media.Format;
import com.sun.media.*;
import java.awt.*;
import java.util.Vector;
import java.util.Enumeration;
import java.awt.event.*;
public final class BasicJMD extends Panel
implements com.sun.media.JMD, java.awt.event.WindowListener
{
Vector modList = new Vector();
Vector conList = new Vector();
boolean graphic = true;
Panel center;
Label status;
Frame frame = null;
boolean activated = false;
Button button = null;
Dimension preferredSize = new Dimension(512, 140);
public BasicJMD(String title) {
setLayout(new BorderLayout());
setBackground(Color.lightGray);
center = new Panel() {
public Dimension getPreferredSize() {
return preferredSize;
}
};
center.setLayout(null);
add("North", center);
status = new Label();
add("South", status);
setSize(512, 200);
}
public Component getControlComponent() {
if (button == null) {
button = new Button("PlugIn Viewer") {
public void removeNotify() {
super.removeNotify();
dispose();
}
};
button.setName("PlugIns");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
BasicJMD.this.setVisible( true );
}
} );
}
return button;
}
public synchronized void dispose() {
if (frame != null) {
frame.dispose();
frame = null;
}
}
public synchronized void setVisible(boolean visible) {
if (getParent() == null) {
if (visible) {
if (frame == null) {
frame = new Frame("PlugIn Viewer");
frame.setLayout( new BorderLayout() );
frame.add("Center", this);
frame.addWindowListener(this);
frame.pack();
frame.setVisible(true);
}
}
} else if (getParent() == frame) {
frame.setVisible(visible);
} else
super.setVisible(visible);
}
int ro, col;
int colMax = 1;
int roMax = 1;
int wrapWidth = 200;
int wrapHeight = 50;
int offX = 0, offY = 0;
int fill = 10;
int cSize = 10;
public void initGraph(BasicModule source) {
center.removeAll();
modList = new Vector();
conList = new Vector();
drawGraph(source);
ro = 0;
col = 0;
preferredSize = new Dimension((colMax + 1) * wrapWidth + offX * 2,
(roMax) * wrapHeight + offY * 2);
//pack();
}
public void drawGraph(BasicModule source) {
Module m;
OutputConnector oc;
InputConnector ic;
String names[];
names = source.getOutputConnectorNames();
int height = names.length;
if (height == 0)
height = 1;
createModuleWrap(source, ro, col, height);
if (roMax < names.length)
roMax = names.length;
for (int i = 0; i < names.length; i++) {
oc = source.getOutputConnector(names[i]);
if ((ic = oc.getInputConnector()) == null) {
if (col == 0)
ro++;
continue;
}
if ((m = ic.getModule()) == null) {
if (col == 0)
ro++;
continue;
}
col++;
if (col > colMax)
colMax = col;
drawGraph((BasicModule)m);
col--;
if (col == 0)
ro++;
}
}
public void createModuleWrap(BasicModule m, int row, int column, int h) {
//System.err.println(m + " " + row + " " + column);
Object plugin = m;
if (m instanceof BasicSourceModule)
plugin = ((BasicSourceModule)m).getDemultiplexer();
else if (m instanceof BasicFilterModule)
plugin = ((BasicFilterModule)m).getCodec();
else if (m instanceof BasicRendererModule)
plugin = ((BasicRendererModule)m).getRenderer();
else if (m instanceof BasicMuxModule)
plugin = ((BasicMuxModule)m).getMultiplexer();
String name = ((PlugIn)plugin).getName();
//name = name.substring(name.lastIndexOf(".") + 1);
Button b = new ModButton(name, m, (PlugIn)plugin);
b.setName("M" + m.hashCode());
modList.addElement(b);
b.setBackground(new Color(192, 192, 128));
b.setForeground(Color.black);
center.add(b);
b.setBounds(offX + column * wrapWidth + fill,
offY + row * wrapHeight + fill,
wrapWidth - fill * 2, h * wrapHeight - fill * 2);
b.setVisible(true);
center.invalidate();
}
public void moduleIn(BasicModule bm, int index, Buffer d, boolean here) {
updateConnector(bm, index, d, here, 0);
}
public void updateConnector(BasicModule bm, int index,
Buffer d, boolean here,
int inOut) {
if (!activated)
return;
Con c = findConnector(bm, index, inOut);
if (c == null)
return;
c.setData(d);
// System.out.println("upd " + c.getName());
if (true) {
if (here) {
if (d.isEOM())
c.flash(Color.red);
else if (d.isDiscard())
c.flash(Color.yellow);
else
c.flash(Color.green);
} else
c.flash(Color.gray);
// c.repaint();
}
}
public void moduleOut(BasicModule bm, int index, Buffer d, boolean here) {
updateConnector(bm, index, d, here, 1);
}
public Con findConnector(BasicModule bm, int index,
int inOut)
{
String name = "C" + bm.hashCode() + index + inOut;
Enumeration e = conList.elements();
while (e.hasMoreElements()) {
Con c = (Con) e.nextElement();
if (c.getName().equals(name))
return c;
}
Component m = findModule(bm);
if (m == null)
return null;
Point p = m.getLocation();
Con c = new Con();
center.add(c);
c.setBounds(p.x - fill + (wrapWidth - fill) * inOut,
p.y + (wrapHeight-2*fill-cSize) / 2 + wrapHeight * index,
cSize, cSize);
c.setName(name);
conList.addElement(c);
return c;
}
public Component findModule(BasicModule bm) {
String name = "M" + bm.hashCode();
Enumeration e = modList.elements();
while (e.hasMoreElements()) {
Component c = (Component) e.nextElement();
if (c.getName().equals(name))
return c;
}
return null;
}
public void windowActivated(WindowEvent we) {
activated = true;
}
public void windowOpened(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
public void windowClosing(WindowEvent we) {
setVisible(false);
}
public void windowClosed(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
activated = false;
}
class ModButton extends Button {
BasicModule module;
boolean mouseHere = false;
PlugIn plugin;
public String cropName(String name) {
int length;
boolean appendDots;
int box_width;
box_width= 120;
FontMetrics fm= getFontMetrics( new Font( "Dialog", Font.PLAIN, 11));
String cropped= name;
int width= fm.stringWidth( cropped);
if( width > box_width) {
appendDots= true;
} else {
appendDots= false;
}
while( width > box_width) {
length= cropped.length();
cropped= name.substring( 0, length - 1);
width= fm.stringWidth( cropped);
}
if( appendDots) {
cropped= cropped + "...";
}
return cropped;
}
public ModButton(String name, BasicModule m, PlugIn p) {
super();
name= cropName( name);
super.setLabel( name);
this.module = m;
this.plugin = p;
addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent me) {
updateStatus();
mouseHere = true;
}
public void mouseExited(MouseEvent me) {
mouseHere = false;
}
}
);
}
public void updateStatus() {
status.setText(plugin.getClass().getName() + " , " + plugin.getName());
}
}
class Con extends Button {
Graphics g = null;
Buffer data = null;
boolean mouseHere = false;
public Con() {
addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent me) {
updateStatus();
mouseHere = true;
}
public void mouseExited(MouseEvent me) {
mouseHere = false;
}
});
}
public void flash(Color c) {
Graphics g = getGraphics();
if (g == null)
return;
g.setColor(c);
g.fillRect(1, 1, cSize - 2, cSize - 2);
}
public Graphics getGraphics() {
//if (g == null)
g = super.getGraphics();
return g;
}
public void paint(Graphics g) {
g.setColor(Color.black);
g.drawRect(0, 0, cSize - 1, cSize - 1);
g.setColor(Color.gray);
g.fillRect(1, 1, cSize - 2, cSize - 2);
}
public void setData(Buffer d) {
if (mouseHere)
updateStatus();
this.data = d;
}
void updateStatus() {
String s;
Format f = data.getFormat();
if (f == null)
s = "null";
else
s = f.toString();
status.setText(s + ", Length = " + data.getLength());
}
}
}
|