package edu.harvard.wcfia.yoshikoder.ui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.util.Iterator; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.DefaultListModel; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; import edu.harvard.wcfia.yoshikoder.concordance.Concordance; import edu.harvard.wcfia.yoshikoder.concordance.ConcordanceLine; public class ListConcordancePanel extends JPanel { class RightListRenderer extends JLabel implements ListCellRenderer{ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus){ setHorizontalAlignment(JLabel.LEFT); setHorizontalTextPosition(SwingConstants.LEFT); setText(value.toString()); setFont(list.getFont()); return this; } } class MiddleListRenderer extends JLabel implements ListCellRenderer{ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus){ setHorizontalAlignment(JLabel.CENTER); setHorizontalTextPosition(SwingConstants.CENTER); setText(value.toString()); setFont(list.getFont().deriveFont(Font.BOLD)); return this; } } class LeftListRenderer extends JLabel implements ListCellRenderer{ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus){ setHorizontalAlignment(JLabel.RIGHT); setHorizontalTextPosition(SwingConstants.RIGHT); setText(value.toString()); setFont(list.getFont()); return this; } } private Concordance concordance; private JList conc1list; private JList conc2list; private JList conc3list; private DefaultListModel model1; private DefaultListModel model2; private DefaultListModel model3; private String[] concat(ConcordanceLine line){ String lhs = line.getLeftHandSideView(); String rhs = line.getRightHandSideView(); // empty left or right hand sides get a space added to visually // balance the jlist String[] arr = new String[]{(lhs.length()>0 ? lhs : " "), line.getTargetView(), rhs.length()>0 ? rhs : " "}; return arr; } public Concordance getConcordance(){ return concordance; } public void setConcordance(Concordance conc){ concordance = conc; model1.clear(); model2.clear(); model3.clear(); if (conc != null) { for (Iterator iter = conc.iterator(); iter.hasNext();) { ConcordanceLine line = (ConcordanceLine) iter.next(); String[] els = concat(line); model1.addElement(els[0]); model2.addElement(els[1]); model3.addElement(els[2]); } } } public void setDisplayFont(Font f){ conc1list.setFont(f); conc2list.setFont(f.deriveFont(Font.BOLD)); conc3list.setFont(f); } public ListConcordancePanel(Concordance conc){ this(); setConcordance(conc); } public ListConcordancePanel() { super(new BorderLayout()); model1 = new DefaultListModel(); model2 = new DefaultListModel(); model3 = new DefaultListModel(); conc1list = new JList(model1); conc1list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); conc1list.setCellRenderer(new LeftListRenderer()); conc2list = new JList(model2); conc2list.setFont(conc2list.getFont().deriveFont(Font.BOLD)); conc2list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); conc2list.setCellRenderer(new MiddleListRenderer()); conc3list = new JList(model3); conc3list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); conc3list.setCellRenderer(new RightListRenderer()); JPanel cont = new JPanel(); cont.setLayout(new BoxLayout(cont, BoxLayout.X_AXIS)); cont.setBackground(Color.white); cont.add(Box.createHorizontalGlue()); cont.add(conc1list); cont.add(Box.createHorizontalStrut(10)); cont.add(conc2list); cont.add(Box.createHorizontalStrut(10)); cont.add(conc3list); cont.add(Box.createHorizontalGlue()); JScrollPane contscroll = new JScrollPane(cont); contscroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); contscroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); contscroll.setPreferredSize(new Dimension(600,200)); add(contscroll, BorderLayout.CENTER); } public static void main(String[] args) { JOptionPane.showMessageDialog((JFrame)null, new ListConcordancePanel() ); } }