package org.phylowidget.ui;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Container;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GraphicsEnvironment;
import java.awt.Insets;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
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.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Set;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.andrewberman.ui.FontLoader;
import org.phylowidget.PWContext;
import org.phylowidget.PWPlatform;
import org.phylowidget.PhyloWidget;
import org.phylowidget.tree.PhyloNode;
import processing.core.PApplet;
public class FontChooserDialog extends Dialog implements ActionListener, KeyListener
{
PWContext pwc;
PhyloWidget p;
private Button apply;
private Button ok;
private Button cancel;
private String originalFontName;
protected InputList fontNameInputList;
public String[] fontNames;
public FontChooserDialog(Frame owner, PWContext pwc)
{
super(owner, "Please choose a font for the tree labels.");
setLayout(new BorderLayout());
this.pwc = pwc;
this.p = pwc.getPW();
addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent e)
{
super.windowClosing(e);
// cancel();
setVisible(false);
}
});
addKeyListener(this);
Container c = new Container();
c.setLayout(new FlowLayout());
Label l = new Label("Select a font.");
c.add(l);
add(c, BorderLayout.NORTH);
if (fontNames == null)
{
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
fontNames = ge.getAvailableFontFamilyNames();
}
fontNameInputList = new InputList(fontNames, "Font name:");
add(fontNameInputList, BorderLayout.CENTER);
ListSelectionListener listSelectListener = new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent e)
{
// if (e.getValueIsAdjusting())
// return;
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
updatePreview();
}
});
}
};
fontNameInputList.addListSelectionListener(listSelectListener);
addButtons();
setPreferredSize(new Dimension(250, 500));
pack();
}
void updatePreview()
{
commit();
}
void addButtons()
{
Panel p = new Panel(new FlowLayout(FlowLayout.RIGHT));
Dimension buttonSize = new Dimension(50, 30);
apply = new Button("Apply");
apply.setPreferredSize(buttonSize);
apply.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
commit();
}
});
ok = new Button("Ok");
ok.setPreferredSize(buttonSize);
ok.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
commit();
setVisible(false);
}
});
cancel = new Button("Cancel");
cancel.setPreferredSize(buttonSize);
cancel.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
cancel();
}
});
// p.add(new Label("Esc to cancel, \nCtrl-Enter to commit. "));
// p.add(apply);
p.add(ok);
p.add(cancel);
add(p, BorderLayout.SOUTH);
}
String origText;
void cancel()
{
p.changeSetting("font", originalFontName);
setVisible(false);
}
void commit()
{
p.changeSetting("font", fontNameInputList.getSelected());
}
public void setVisible(boolean visible)
{
super.setVisible(visible);
if (visible == true)
{
// Reset the original font name.
this.originalFontName = pwc.trees().getRenderer().getFontLoader().getFontName();
}
}
public void actionPerformed(ActionEvent e)
{
}
public void keyPressed(KeyEvent e)
{
// System.out.println(e);
// int code = e.getKeyChar();
// if (code == KeyEvent.VK_ENTER)
// {
// if (e.isControlDown())
// {
// commit();
// setVisible(false);
// }
// } else if (code == KeyEvent.VK_ESCAPE)
// cancel();
}
public void keyReleased(KeyEvent e)
{
}
public void keyTyped(KeyEvent e)
{
}
class InputList extends JPanel implements ListSelectionListener, ActionListener
{
protected JLabel label = new JLabel();
protected JTextField textfield;
protected JList list;
protected JScrollPane scroll;
public InputList(String[] data, String title)
{
setLayout(null);
add(label);
textfield = new OpelListText();
textfield.addActionListener(this);
label.setLabelFor(textfield);
add(textfield);
list = new OpelListList(data);
list.setVisibleRowCount(10);
list.addListSelectionListener(this);
scroll = new JScrollPane(list);
add(scroll);
}
public InputList(String title, int numCols)
{
setLayout(null);
label = new OpelListLabel(title, JLabel.LEFT);
add(label);
textfield = new OpelListText(numCols);
textfield.addActionListener(this);
label.setLabelFor(textfield);
add(textfield);
list = new OpelListList();
list.setVisibleRowCount(4);
list.addListSelectionListener(this);
scroll = new JScrollPane(list);
add(scroll);
}
public void setToolTipText(String text)
{
super.setToolTipText(text);
label.setToolTipText(text);
textfield.setToolTipText(text);
list.setToolTipText(text);
}
public void setDisplayedMnemonic(char ch)
{
label.setDisplayedMnemonic(ch);
}
public void setSelected(String sel)
{
list.setSelectedValue(sel, true);
textfield.setText(sel);
}
public String getSelected()
{
return textfield.getText();
}
public void setSelectedInt(int value)
{
setSelected(Integer.toString(value));
}
public int getSelectedInt()
{
try
{
return Integer.parseInt(getSelected());
} catch (NumberFormatException ex)
{
return -1;
}
}
public void valueChanged(ListSelectionEvent e)
{
Object obj = list.getSelectedValue();
if (obj != null)
textfield.setText(obj.toString());
}
public void actionPerformed(ActionEvent e)
{
ListModel model = list.getModel();
String key = textfield.getText().toLowerCase();
for (int k = 0; k < model.getSize(); k++)
{
String data = (String) model.getElementAt(k);
if (data.toLowerCase().startsWith(key))
{
list.setSelectedValue(data, true);
break;
}
}
}
public void addListSelectionListener(ListSelectionListener lst)
{
list.addListSelectionListener(lst);
}
public Dimension getPreferredSize()
{
Insets ins = getInsets();
Dimension labelSize = label.getPreferredSize();
Dimension textfieldSize = textfield.getPreferredSize();
Dimension scrollPaneSize = scroll.getPreferredSize();
int w = Math.max(Math.max(labelSize.width, textfieldSize.width), scrollPaneSize.width);
int h = labelSize.height + textfieldSize.height + scrollPaneSize.height;
return new Dimension(w + ins.left + ins.right, h + ins.top + ins.bottom);
}
public Dimension getMaximumSize()
{
return getPreferredSize();
}
public Dimension getMinimumSize()
{
return getPreferredSize();
}
public void doLayout()
{
Insets ins = getInsets();
Dimension size = getSize();
int x = ins.left;
int y = ins.top;
int w = size.width - ins.left - ins.right;
int h = size.height - ins.top - ins.bottom;
Dimension labelSize = label.getPreferredSize();
label.setBounds(x, y, w, labelSize.height);
y += labelSize.height;
Dimension textfieldSize = textfield.getPreferredSize();
textfield.setBounds(x, y, w, textfieldSize.height);
y += textfieldSize.height;
scroll.setBounds(x, y, w, h - y);
}
public void appendResultSet(ResultSet results, int index, boolean toTitleCase)
{
textfield.setText("");
DefaultListModel model = new DefaultListModel();
try
{
while (results.next())
{
String str = results.getString(index);
if (toTitleCase)
{
str = Character.toUpperCase(str.charAt(0)) + str.substring(1);
}
model.addElement(str);
}
} catch (SQLException ex)
{
System.err.println("appendResultSet: " + ex.toString());
}
list.setModel(model);
if (model.getSize() > 0)
list.setSelectedIndex(0);
}
class OpelListLabel extends JLabel
{
public OpelListLabel(String text, int alignment)
{
super(text, alignment);
}
public AccessibleContext getAccessibleContext()
{
return InputList.this.getAccessibleContext();
}
}
class OpelListText extends JTextField
{
public OpelListText()
{
}
public OpelListText(int numCols)
{
super(numCols);
}
public AccessibleContext getAccessibleContext()
{
return InputList.this.getAccessibleContext();
}
}
class OpelListList extends JList
{
public OpelListList()
{
}
public OpelListList(String[] data)
{
super(data);
}
public AccessibleContext getAccessibleContext()
{
return InputList.this.getAccessibleContext();
}
}
// Accessibility Support
public AccessibleContext getAccessibleContext()
{
if (accessibleContext == null)
accessibleContext = new AccessibleOpenList();
return accessibleContext;
}
protected class AccessibleOpenList extends AccessibleJComponent
{
public String getAccessibleName()
{
System.out.println("getAccessibleName: " + accessibleName);
if (accessibleName != null)
return accessibleName;
return label.getText();
}
public AccessibleRole getAccessibleRole()
{
return AccessibleRole.LIST;
}
}
}
}