/* * App.java * * Created on __DATE__, __TIME__ */ package org.crosswire.mss.transcript.reconcile; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.FontFormatException; import java.awt.GridLayout; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URL; import java.net.URLConnection; import java.util.Map; import java.util.Map.Entry; import java.util.SortedMap; import java.util.SortedSet; import java.util.Vector; import javax.swing.DefaultListModel; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JTextPane; import javax.swing.ListCellRenderer; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.Border; import javax.swing.event.TableModelEvent; import javax.swing.table.AbstractTableModel; import javax.swing.text.MutableAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; import org.crosswire.mss.transcript.Convert; import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import eu.interedition.collatex2.implementation.CollateXEngine; import eu.interedition.collatex2.implementation.output.apparatus.ApparatusEntry; import eu.interedition.collatex2.implementation.output.apparatus.ParallelSegmentationApparatus; import eu.interedition.collatex2.interfaces.IAlignmentTable; import eu.interedition.collatex2.interfaces.ICell; import eu.interedition.collatex2.interfaces.IRow; import eu.interedition.collatex2.interfaces.IWitness; /** * * @author __USER__ */ public class App extends javax.swing.JFrame { boolean bgreekTransform = false; boolean useUnicode = false; File transFolderPath1 = new File("./"); File transFolderPath2 = new File("./"); DefaultListModel transFileNameModel1 = new DefaultListModel(); DefaultListModel transFileNameModel2 = new DefaultListModel(); CollateXTableModel alignmentTableModel = new CollateXTableModel(); Font symbolGreek = null; /** Creates new form App */ public App() { initComponents(); transFileName1.setModel(transFileNameModel1); transFileName2.setModel(transFileNameModel2); this.setPreferredSize(new Dimension(400, 700)); this.setMinimumSize(new java.awt.Dimension(700, 700)); Vector columnData = new Vector(); outputList.setListData(columnData); outputList.setModel(new DefaultListModel()); // try { String fontName = "/symbol.ttf"; symbolGreek = outputList.getFont(); // symbolGreek = loadFont(getClass().getResourceAsStream(fontName)); // symbolGreek = new Font("SymbolGreekII", 0, 16); outputList.setCellRenderer(new MyCellRenderer(symbolGreek)); // outputList.setCellRenderer(new MyCellRenderer(loadFont(new FileInputStream("./res/symbol.ttf")))); /* } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FontFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } */ jRadioButton1.setSelected(true); jRadioButton4.setSelected(true); jRadioButton5.setSelected(true); alignmentTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); new FileDrop(this, new FileDrop.Listener() { public void filesDropped(java.io.File[] files) { int dirCount = 0; int fileCount = 0; if (files.length == 1) { dirCount = (transFolderName1.getText().length() > 0) ? 1 : 0; fileCount = dirCount; } for (File f : files) { if (f.isDirectory()) { if (dirCount == 0) { transFolderPath1 = setTransFolderPath(f, transFolderName1, transFileNameModel1, transFileName1); transFolderPath2 = setTransFolderPath(f, transFolderName2, transFileNameModel2, transFileName2); } else { transFolderPath2 = setTransFolderPath(f, transFolderName2, transFileNameModel2, transFileName2); } ++dirCount; } else { if (dirCount == 0) { transFolderPath1 = setTransFolderPath( f.getParentFile(), transFolderName1, transFileNameModel1, transFileName1); transFolderPath2 = setTransFolderPath( f.getParentFile(), transFolderName2, transFileNameModel2, transFileName2); transFileName1.setSelectedValue(f.getName(), true); ++dirCount; } else { transFolderPath2 = setTransFolderPath( f.getParentFile(), transFolderName2, transFileNameModel2, transFileName2); transFileName2.setSelectedValue(f.getName(), true); ++dirCount; } ++fileCount; } System.out.println(f.getAbsolutePath()); } } }); } static String books[] = new String[] { "Mt", "Mk", "Lk", "John", "Acts", "Rom", "1Cor", "2Cor", "Gal", "Eph", "Phil", "Col", "1Thess", "2Thess", "1Tim", "2Tim", "Titus", "Phlm", "Heb", "Jas", "1Pet", "2Pet", "1John", "2John", "3John", "Jude", "Rev" }; static String chapters[] = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50" }; //GEN-BEGIN:initComponents // private void initComponents() { buttonGroup1 = new javax.swing.ButtonGroup(); buttonGroup2 = new javax.swing.ButtonGroup(); buttonGroup3 = new javax.swing.ButtonGroup(); jTabbedPane1 = new javax.swing.JTabbedPane(); jPanel1 = new javax.swing.JPanel(); jPanel3 = new javax.swing.JPanel(); jPanel7 = new javax.swing.JPanel(); jSplitPane1 = new javax.swing.JSplitPane(); jPanel8 = new javax.swing.JPanel(); jPanel9 = new javax.swing.JPanel(); jPanel10 = new javax.swing.JPanel(); jPanel11 = new javax.swing.JPanel(); transFolderName1 = new javax.swing.JLabel(); jButton4 = new javax.swing.JButton(); jLabel4 = new javax.swing.JLabel(); jScrollPane2 = new javax.swing.JScrollPane(); transFileName1 = new javax.swing.JList(); jPanel12 = new javax.swing.JPanel(); jPanel13 = new javax.swing.JPanel(); jPanel14 = new javax.swing.JPanel(); transFolderName2 = new javax.swing.JLabel(); jButton5 = new javax.swing.JButton(); jLabel5 = new javax.swing.JLabel(); jScrollPane3 = new javax.swing.JScrollPane(); transFileName2 = new javax.swing.JList(); displayPane = new javax.swing.JPanel(); apparatusPane = new javax.swing.JScrollPane(); outputList = new javax.swing.JList(); tablePane = new javax.swing.JScrollPane(); alignmentTable = new javax.swing.JTable(); jPanel4 = new javax.swing.JPanel(); jPanel16 = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); jRadioButton3 = new javax.swing.JRadioButton(); jRadioButton4 = new javax.swing.JRadioButton(); jPanel6 = new javax.swing.JPanel(); jRadioButton1 = new javax.swing.JRadioButton(); jRadioButton2 = new javax.swing.JRadioButton(); jPanel5 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); jComboBox1 = new javax.swing.JComboBox(); jComboBox2 = new javax.swing.JComboBox(); jPanel17 = new javax.swing.JPanel(); jRadioButton5 = new javax.swing.JRadioButton(); jRadioButton6 = new javax.swing.JRadioButton(); jPanel15 = new javax.swing.JPanel(); jButton3 = new javax.swing.JButton(); jButton1 = new javax.swing.JButton(); menuBar = new javax.swing.JMenuBar(); fileMenu = new javax.swing.JMenu(); openMenuItem = new javax.swing.JMenuItem(); saveMenuItem = new javax.swing.JMenuItem(); saveAsMenuItem = new javax.swing.JMenuItem(); exitMenuItem = new javax.swing.JMenuItem(); editMenu = new javax.swing.JMenu(); cutMenuItem = new javax.swing.JMenuItem(); copyMenuItem = new javax.swing.JMenuItem(); pasteMenuItem = new javax.swing.JMenuItem(); deleteMenuItem = new javax.swing.JMenuItem(); helpMenu = new javax.swing.JMenu(); contentsMenuItem = new javax.swing.JMenuItem(); aboutMenuItem = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jPanel1.setLayout(new java.awt.BorderLayout()); jPanel3.setLayout(new java.awt.BorderLayout()); jPanel7.setLayout(new java.awt.BorderLayout()); jPanel8.setLayout(new javax.swing.BoxLayout(jPanel8, javax.swing.BoxLayout.PAGE_AXIS)); jPanel9.setLayout(new java.awt.BorderLayout()); jPanel10.setLayout(new java.awt.BorderLayout(3, 0)); jPanel11.setLayout(new java.awt.BorderLayout()); transFolderName1.setBorder(javax.swing.BorderFactory .createLineBorder(new java.awt.Color(0, 0, 0))); transFolderName1 .setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); jPanel11.add(transFolderName1, java.awt.BorderLayout.CENTER); jButton4.setLabel("..."); jButton4.setMargin(new java.awt.Insets(2, 4, 2, 4)); jButton4.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton4ActionPerformed(evt); } }); jPanel11.add(jButton4, java.awt.BorderLayout.EAST); jLabel4.setFont(new java.awt.Font("Ubuntu", 1, 15)); jLabel4.setText("Transcription 1"); jPanel11.add(jLabel4, java.awt.BorderLayout.NORTH); jPanel10.add(jPanel11, java.awt.BorderLayout.NORTH); transFileName1.setModel(new javax.swing.AbstractListModel() { String[] strings = { " " }; public int getSize() { return strings.length; } public Object getElementAt(int i) { return strings[i]; } }); transFileName1.setMaximumSize(new java.awt.Dimension(20, 20)); transFileName1.setMinimumSize(new java.awt.Dimension(20, 20)); transFileName1.setPreferredSize(new java.awt.Dimension(20, 20)); transFileName1 .addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged( javax.swing.event.ListSelectionEvent evt) { transFileName1ValueChanged(evt); } }); jScrollPane2.setViewportView(transFileName1); jPanel10.add(jScrollPane2, java.awt.BorderLayout.CENTER); jPanel9.add(jPanel10, java.awt.BorderLayout.CENTER); jPanel8.add(jPanel9); jPanel12.setLayout(new java.awt.BorderLayout()); jPanel13.setLayout(new java.awt.BorderLayout(3, 0)); jPanel14.setLayout(new java.awt.BorderLayout()); transFolderName2.setBorder(javax.swing.BorderFactory .createLineBorder(new java.awt.Color(0, 0, 0))); jPanel14.add(transFolderName2, java.awt.BorderLayout.CENTER); jButton5.setLabel("..."); jButton5.setMargin(new java.awt.Insets(2, 4, 2, 4)); jButton5.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton5ActionPerformed(evt); } }); jPanel14.add(jButton5, java.awt.BorderLayout.EAST); jLabel5.setFont(new java.awt.Font("Ubuntu", 1, 15)); jLabel5.setText("Transcription 2"); jPanel14.add(jLabel5, java.awt.BorderLayout.NORTH); jPanel13.add(jPanel14, java.awt.BorderLayout.NORTH); transFileName2.setModel(new javax.swing.AbstractListModel() { String[] strings = { " " }; public int getSize() { return strings.length; } public Object getElementAt(int i) { return strings[i]; } }); transFileName2.setMinimumSize(new java.awt.Dimension(20, 20)); transFileName2.setPreferredSize(new java.awt.Dimension(20, 20)); jScrollPane3.setViewportView(transFileName2); jPanel13.add(jScrollPane3, java.awt.BorderLayout.CENTER); jPanel12.add(jPanel13, java.awt.BorderLayout.CENTER); jPanel8.add(jPanel12); jSplitPane1.setLeftComponent(jPanel8); displayPane.setLayout(new java.awt.CardLayout()); outputList.setModel(new javax.swing.AbstractListModel() { String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" }; public int getSize() { return strings.length; } public Object getElementAt(int i) { return strings[i]; } }); apparatusPane.setViewportView(outputList); displayPane.add(apparatusPane, "card2"); tablePane .setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); alignmentTable.setModel(alignmentTableModel); tablePane.setViewportView(alignmentTable); displayPane.add(tablePane, "card3"); jSplitPane1.setRightComponent(displayPane); jPanel7.add(jSplitPane1, java.awt.BorderLayout.CENTER); jPanel3.add(jPanel7, java.awt.BorderLayout.CENTER); jPanel1.add(jPanel3, java.awt.BorderLayout.CENTER); jPanel4.setLayout(new java.awt.BorderLayout()); jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder()); jPanel2.setLayout(new javax.swing.BoxLayout(jPanel2, javax.swing.BoxLayout.Y_AXIS)); buttonGroup2.add(jRadioButton3); jRadioButton3.setText("Plain Text"); jPanel2.add(jRadioButton3); buttonGroup2.add(jRadioButton4); jRadioButton4.setText("XML"); jPanel2.add(jRadioButton4); jPanel16.add(jPanel2); jPanel6.setBorder(javax.swing.BorderFactory.createEtchedBorder()); jPanel6.setLayout(new javax.swing.BoxLayout(jPanel6, javax.swing.BoxLayout.Y_AXIS)); buttonGroup1.add(jRadioButton1); jRadioButton1.setText("Unicode"); jPanel6.add(jRadioButton1); buttonGroup1.add(jRadioButton2); jRadioButton2.setText("Symbol Greek Transform"); jRadioButton2.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { jRadioButton2StateChanged(evt); } }); jPanel6.add(jRadioButton2); jPanel16.add(jPanel6); jLabel1.setText("Limit Range"); jPanel5.add(jLabel1); jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(books)); jPanel5.add(jComboBox1); jComboBox2.setModel(new javax.swing.DefaultComboBoxModel(chapters)); jPanel5.add(jComboBox2); jPanel16.add(jPanel5); jPanel17.setBorder(javax.swing.BorderFactory.createEtchedBorder()); jPanel17.setLayout(new javax.swing.BoxLayout(jPanel17, javax.swing.BoxLayout.Y_AXIS)); buttonGroup3.add(jRadioButton5); jRadioButton5.setText("Error List"); jRadioButton5.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jRadioButton5ActionPerformed(evt); } }); jPanel17.add(jRadioButton5); buttonGroup3.add(jRadioButton6); jRadioButton6.setText("Alignment Table"); jRadioButton6.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { jRadioButton6StateChanged(evt); } }); jRadioButton6.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jRadioButton6ActionPerformed(evt); } }); jPanel17.add(jRadioButton6); jPanel16.add(jPanel17); jPanel4.add(jPanel16, java.awt.BorderLayout.WEST); jPanel15.setLayout(new java.awt.GridLayout(2, 0)); jButton3.setText("Check Transcriptions"); jButton3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton3ActionPerformed(evt); } }); jPanel15.add(jButton3); jButton1.setText("Export..."); jPanel15.add(jButton1); jPanel4.add(jPanel15, java.awt.BorderLayout.EAST); jPanel1.add(jPanel4, java.awt.BorderLayout.NORTH); jTabbedPane1.addTab("Reconcile Transcriptions", jPanel1); getContentPane().add(jTabbedPane1, java.awt.BorderLayout.CENTER); fileMenu.setText("File"); openMenuItem.setText("Open"); fileMenu.add(openMenuItem); saveMenuItem.setText("Save"); fileMenu.add(saveMenuItem); saveAsMenuItem.setText("Save As ..."); fileMenu.add(saveAsMenuItem); exitMenuItem.setText("Exit"); exitMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { exitMenuItemActionPerformed(evt); } }); fileMenu.add(exitMenuItem); menuBar.add(fileMenu); editMenu.setText("Edit"); cutMenuItem.setText("Cut"); editMenu.add(cutMenuItem); copyMenuItem.setText("Copy"); editMenu.add(copyMenuItem); pasteMenuItem.setText("Paste"); editMenu.add(pasteMenuItem); deleteMenuItem.setText("Delete"); editMenu.add(deleteMenuItem); menuBar.add(editMenu); helpMenu.setText("Help"); contentsMenuItem.setText("Contents"); helpMenu.add(contentsMenuItem); aboutMenuItem.setText("About"); helpMenu.add(aboutMenuItem); menuBar.add(helpMenu); setJMenuBar(menuBar); pack(); }// //GEN-END:initComponents private void jRadioButton6ActionPerformed(java.awt.event.ActionEvent evt) { ((CardLayout) displayPane.getLayout()).show(displayPane, jRadioButton5.isSelected() ? "card2" : "card3"); } private void jRadioButton5ActionPerformed(java.awt.event.ActionEvent evt) { ((CardLayout) displayPane.getLayout()).show(displayPane, jRadioButton5.isSelected() ? "card2" : "card3"); } private void jRadioButton6StateChanged(javax.swing.event.ChangeEvent evt) { // TODO add your handling code here: } private void transFileName1ValueChanged( javax.swing.event.ListSelectionEvent evt) { if (transFileName1.getSelectedValues().length == 1 && transFileName2.getSelectedValues().length == 0 && transFolderName2.getText() .equals(transFolderName1.getText())) { transFileName2.ensureIndexIsVisible(transFileName1 .getSelectedIndex()); } } private void jRadioButton2StateChanged(javax.swing.event.ChangeEvent evt) { bgreekTransform = jRadioButton2.isSelected(); outputList.updateUI(); } private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) { JFileChooser dialog = new JFileChooser(); dialog.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); dialog.setAcceptAllFileFilterUsed(false); // dialog.setFileFilter(); dialog.setCurrentDirectory(transFolderPath2); if (dialog.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { try { transFolderPath2 = setTransFolderPath(dialog.getSelectedFile(), transFolderName2, transFileNameModel2, transFileName2); } catch (Exception e) { e.printStackTrace(); } } } private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: JFileChooser dialog = new JFileChooser(); dialog.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); dialog.setAcceptAllFileFilterUsed(false); // dialog.setFileFilter(); dialog.setCurrentDirectory(transFolderPath1); if (dialog.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { try { transFolderPath1 = setTransFolderPath(dialog.getSelectedFile(), transFolderName1, transFileNameModel1, transFileName1); if (transFolderName2.getText().length() < 1) { transFolderPath2 = setTransFolderPath( dialog.getSelectedFile(), transFolderName2, transFileNameModel2, transFileName2); } } catch (Exception e) { e.printStackTrace(); } } } File setTransFolderPath(File newTransFolderPath, JLabel nameDisplay, DefaultListModel filesDisplayModel, JList filesDisplay) { if (".".equals(newTransFolderPath.getName())) newTransFolderPath = newTransFolderPath.getParentFile(); nameDisplay.setText(newTransFolderPath.getName()); filesDisplayModel.clear(); File files[] = newTransFolderPath.listFiles(); java.util.Arrays.sort(files); for (File f : files) { if (f.isFile() && !f.isHidden()) { filesDisplayModel.addElement(f.getName()); } } return newTransFolderPath; } private static StringBuffer loadInputStream(InputStream is) throws Exception { StringBuffer data = new StringBuffer(); byte[] buffer = new byte[2048]; int len = 0; while ((len = is.read(buffer)) > -1) { data.append(new String(buffer, 0, len, "iso8859-1")); } is.close(); return data; } class CollateXTableModel extends AbstractTableModel { IAlignmentTable alignmentTable = null; public void setAlignmentTable(IAlignmentTable alignmentTable) { this.alignmentTable = alignmentTable; // fireTableChanged(new TableModelEvent(this)); // fireTableDataChanged(); } CollateXTableModel() { } CollateXTableModel(IAlignmentTable alignmentTable) { setAlignmentTable(alignmentTable); } public int getRowCount() { return alignmentTable != null ? alignmentTable.getRows().size() : 0; } public int getColumnCount() { return alignmentTable != null ? alignmentTable.getColumns().size() : 0; } public Object getValueAt(int rowIndex, int columnIndex) { // assert we have an alignment table set if (alignmentTable == null) return ""; IRow row = alignmentTable.getRows().get(rowIndex); int i = 0; for (ICell c : row) { if (i++ == columnIndex) { return c.isEmpty() ? "" : c.getToken().getContent(); } } return null; } } private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) { StringBuffer tText = null; File transFile = null; Vector out = new Vector(); CollateXEngine engine = new CollateXEngine(); Vector witnesses = new Vector(); int docCount = 0; for (Object o : transFileName1.getSelectedValues()) { try { transFile = new File(transFolderPath1, o.toString()); tText = (jRadioButton4.isSelected()) ? Convert.processWitness( new FileReader(transFile), jComboBox1.getSelectedIndex() + 1, jComboBox2.getSelectedIndex() + 1) : loadInputStream(new FileInputStream(transFile)); if (jRadioButton5.isSelected()) { tText = new StringBuffer(tText.toString().replaceAll( "[\\x0a\\x0d]{1,}", "
")); } witnesses .add(engine.createWitness( "T" + Integer.toString(docCount + 1), tText.toString())); ++docCount; } catch (Exception e) { } } for (Object o : transFileName2.getSelectedValues()) { try { transFile = new File(transFolderPath2, o.toString()); tText = (jRadioButton4.isSelected()) ? Convert.processWitness( new FileReader(transFile), jComboBox1.getSelectedIndex() + 1, jComboBox2.getSelectedIndex() + 1) : loadInputStream(new FileInputStream(transFile)); if (jRadioButton5.isSelected()) { tText = new StringBuffer(tText.toString().replaceAll( "[\\x0a\\x0d]{1,}", "
")); } witnesses .add(engine.createWitness( "T" + Integer.toString(docCount + 1), tText.toString())); ++docCount; } catch (Exception e) { } } if (witnesses.size() < 2) { out.add(new String[] { "Please select 2 transcriptions (min)\nusing the controls \non the left.", "", "" }); outputList.setListData(out); return; } IAlignmentTable table = engine .align(witnesses.toArray(new IWitness[0])); // alignmentTableModel.setAlignmentTable(table); // alignmentTable.setModel(alignmentTable.getModel()); alignmentTable.setModel(new CollateXTableModel(table)); alignmentTable.revalidate(); ParallelSegmentationApparatus apparatus = engine.createApparatus(table); int line = 0; String lastLine = ""; for (final ApparatusEntry entry : apparatus.getEntries()) { // group together similar phrases final Multimap content2WitMap = ArrayListMultimap .create(); for (String sigil : entry.getSigla()) { content2WitMap.put(entry.getPhrase(sigil).getContent(), sigil); } if ((content2WitMap.keySet().size() == 1) && !entry.hasEmptyCells()) { // common content, there is no apparatus tag needed, just output the // segment String segment = content2WitMap.keys().iterator().next(); for (int offset = 0; offset == 0 || offset > 1; offset = segment .indexOf("
", offset) + 2) { line++; } int index = segment.lastIndexOf("
"); lastLine = segment.substring((index > 0) ? index + 5 : 0); // out.append(content2WitMap.keys().iterator().next()); } else { // convert the multimap to a normal map indexed by segment content and // containing a sorted set of witness identifiers Map> readings = Maps.newHashMap(); for (final String content : content2WitMap.keySet()) { readings.put(content, Sets.newTreeSet(content2WitMap.get(content))); } SortedMap readingMap = Maps.newTreeMap(); for (Entry> reading : readings .entrySet()) { readingMap.put( Joiner.on(" ").join( Iterables.transform(reading.getValue(), new Function() { public String apply(String from) { return (from .startsWith("#") ? from : ("#" + from)); } } )), reading.getKey()); } out.add(new String[] { "", "", "" }); out.add(new String[] { "______________________________", "", "" }); out.add(new String[] { (jRadioButton4.isSelected() ? "verse " : "line ") + line + ":", "", "" }); for (Entry reading : readingMap.entrySet()) { String content = reading.getValue(); out.add(new String[] { reading.getKey().replaceAll("\n", "") + ": ", lastLine + " ", (content.isEmpty() ? "" : content) }); } --line; } } if (out.size() < 1) { out.add(new String[] { "Documents have no differences.", "", "" }); } /* for (int i = 0; i < 109999; i++) { if (symbolGreek.canDisplay(i)) { StringBuffer character = new StringBuffer(); character.append((char) i); out.add(new String[] { Integer.toString(i), character.toString(), "" }); } } */ outputList.setListData(out); } private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed System.exit(0); }//GEN-LAST:event_exitMenuItemActionPerformed /** * @param args the command line arguments * @throws UnsupportedLookAndFeelException * @throws IllegalAccessException * @throws InstantiationException * @throws ClassNotFoundException */ public static void main(String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException { // UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new App().setVisible(true); } }); } //GEN-BEGIN:variables // Variables declaration - do not modify private javax.swing.JMenuItem aboutMenuItem; private javax.swing.JTable alignmentTable; private javax.swing.JScrollPane apparatusPane; private javax.swing.ButtonGroup buttonGroup1; private javax.swing.ButtonGroup buttonGroup2; private javax.swing.ButtonGroup buttonGroup3; private javax.swing.JMenuItem contentsMenuItem; private javax.swing.JMenuItem copyMenuItem; private javax.swing.JMenuItem cutMenuItem; private javax.swing.JMenuItem deleteMenuItem; private javax.swing.JPanel displayPane; private javax.swing.JMenu editMenu; private javax.swing.JMenuItem exitMenuItem; private javax.swing.JMenu fileMenu; private javax.swing.JMenu helpMenu; private javax.swing.JButton jButton1; private javax.swing.JButton jButton3; private javax.swing.JButton jButton4; private javax.swing.JButton jButton5; private javax.swing.JComboBox jComboBox1; private javax.swing.JComboBox jComboBox2; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel10; private javax.swing.JPanel jPanel11; private javax.swing.JPanel jPanel12; private javax.swing.JPanel jPanel13; private javax.swing.JPanel jPanel14; private javax.swing.JPanel jPanel15; private javax.swing.JPanel jPanel16; private javax.swing.JPanel jPanel17; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; private javax.swing.JPanel jPanel5; private javax.swing.JPanel jPanel6; private javax.swing.JPanel jPanel7; private javax.swing.JPanel jPanel8; private javax.swing.JPanel jPanel9; private javax.swing.JRadioButton jRadioButton1; private javax.swing.JRadioButton jRadioButton2; private javax.swing.JRadioButton jRadioButton3; private javax.swing.JRadioButton jRadioButton4; private javax.swing.JRadioButton jRadioButton5; private javax.swing.JRadioButton jRadioButton6; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JScrollPane jScrollPane3; private javax.swing.JSplitPane jSplitPane1; private javax.swing.JTabbedPane jTabbedPane1; private javax.swing.JMenuBar menuBar; private javax.swing.JMenuItem openMenuItem; private javax.swing.JList outputList; private javax.swing.JMenuItem pasteMenuItem; private javax.swing.JMenuItem saveAsMenuItem; private javax.swing.JMenuItem saveMenuItem; private javax.swing.JScrollPane tablePane; private javax.swing.JList transFileName1; private javax.swing.JList transFileName2; private javax.swing.JLabel transFolderName1; private javax.swing.JLabel transFolderName2; // End of variables declaration//GEN-END:variables class MyCellRenderer extends JPanel implements ListCellRenderer { JLabel left; JTextArea middle; JTextArea error; Font font; MyCellRenderer(Font inFont) { this.font = inFont.deriveFont(16.0f); FlowLayout layout = new FlowLayout(FlowLayout.LEFT); setLayout(layout); left = new JLabel(); left.setMinimumSize(new Dimension(40, 10)); middle = new JTextArea(); error = new JTextArea(); // middle.setForeground(getForeground()); // error.setForeground(getForeground()); // error.setBackground(this.getBackground()); /* middle.setEditable(false); error.setEditable(false); */ left.setOpaque(false); middle.setOpaque(false); error.setOpaque(false); error.setForeground(Color.RED); // setJTextPaneFont(middle, this.font, getForeground()); // setJTextPaneFont(error, this.font, Color.RED); add(left); add(middle); add(error); } public void setJTextPaneFont(JTextPane jtp, Font font, Color c) { // Start with the current input attributes for the JTextPane. This // should ensure that we do not wipe out any existing attributes // (such as alignment or other paragraph attributes) currently // set on the text area. MutableAttributeSet attrs = jtp.getInputAttributes(); // Set the font family, size, and style, based on properties of // the Font object. Note that JTextPane supports a number of // character attributes beyond those supported by the Font class. // For example, underline, strike-through, super- and sub-script. StyleConstants.setFontFamily(attrs, font.getFamily()); StyleConstants.setFontSize(attrs, font.getSize()); StyleConstants.setItalic(attrs, (font.getStyle() & Font.ITALIC) != 0); StyleConstants.setBold(attrs, (font.getStyle() & Font.BOLD) != 0); // Set the font color StyleConstants.setForeground(attrs, c); // Retrieve the pane's document object StyledDocument doc = jtp.getStyledDocument(); // Replace the style for the entire document. We exceed the length // of the document by 1 so that text entered at the end of the // document uses the attributes. doc.setCharacterAttributes(0, doc.getLength() + 1, attrs, false); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { String leftData = ((String[]) value)[0]; String middleData = ((String[]) value)[1]; String errData = ((String[]) value)[2]; left.setText(leftData); middle.setText(bgreekTransform ? Convert.translate(middleData) : middleData); error.setText(bgreekTransform ? Convert.translate(errData) : errData); /* try { middle.setText(new String(middleData.getBytes("iso8859-1"), "UTF-8")); error.setText(new String(errData.getBytes("iso8859-1"), "UTF-8")); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } */ /* if (isSelected) { left.setBackground(list.getSelectionBackground()); left.setForeground(list.getSelectionForeground()); middle.setBackground(list.getSelectionBackground()); middle.setForeground(list.getSelectionForeground()); error.setBackground(list.getSelectionBackground()); error.setForeground(list.getSelectionForeground()); } else { left.setBackground(list.getBackground()); left.setForeground(list.getForeground()); middle.setBackground(list.getBackground()); middle.setForeground(list.getForeground()); error.setBackground(list.getBackground()); error.setForeground(list.getForeground()); } */ // setEnabled(list.isEnabled()); // setFont(list.getFont()); return this; } } public Font loadFont(String url) { Font font = null; if (url.length() > 2) { InputStream is = null; try { URLConnection connection = new URL(url).openConnection(); is = connection.getInputStream(); font = loadFont(is); } catch (IOException ex) { ex.printStackTrace(System.err); } catch (FontFormatException e) { e.printStackTrace(System.err); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(System.err); } } } } return font; } public Font loadFont(InputStream is) throws FontFormatException, IOException { Font font = Font.createFont(Font.TRUETYPE_FONT, is); /* int count = 0; for (int i = 0; i < 109999; i++) { if (font.canDisplay(i)) { System.out.println(i); ++count; } } System.out.println("count: " + count); */ return font; } }