1 package net.sourceforge.xmlfit.fit.stepper.gui; 2 3 import java.awt.BorderLayout; 4 import java.awt.Color; 5 import java.awt.Rectangle; 6 import java.awt.event.ActionEvent; 7 import java.awt.event.ActionListener; 8 import java.util.ArrayList; 9 import java.util.HashMap; 10 import java.util.List; 11 12 import javax.swing.JButton; 13 import javax.swing.JDialog; 14 import javax.swing.JFrame; 15 import javax.swing.JPanel; 16 import javax.swing.JScrollPane; 17 import javax.swing.JTable; 18 import javax.swing.ListSelectionModel; 19 import javax.swing.text.StyleConstants.ColorConstants; 20 21 import fit.Parse; 22 23 public class DebuggerFrame extends JFrame 24 { 25 26 private static final String TITEL_DEBUGGER_FRAME = "FIT Action Fixture Debugger"; 27 28 private int maxCellCount = 0; 29 30 private JButton nextStepButton = new JButton("step"); 31 32 private JButton runButtonp = new JButton("run"); 33 34 private JPanel buttonPanel = new JPanel(); 35 36 private HashMap<Parse, Integer> parseToCount = new HashMap<Parse, Integer>(); 37 38 private JTable tableView; 39 40 private boolean isStepMode = false; 41 42 private static Boolean lock = false; 43 44 public DebuggerFrame() 45 { 46 super(TITEL_DEBUGGER_FRAME); 47 initButtons(); 48 } 49 50 public void initTabeles(Parse tables) 51 { 52 int count = 1; 53 Parse table = tables; 54 ArrayList<List<String>> rowList = new ArrayList<List<String>>(); 55 while (table != null) 56 { 57 Parse rows = table.parts; 58 count = doRows(count, rowList, rows); 59 count++; 60 rowList.add(new ArrayList<String>()); 61 table = table.more; 62 } 63 initTableView(rowList); 64 pack(); 65 setVisible(true); 66 warten(); 67 } 68 69 private int doRows(int count, ArrayList<List<String>> rowList, Parse rows) 70 { 71 while (rows != null) 72 { 73 parseToCount.put(rows.parts, count++); 74 ArrayList<String> cellList = doCells(rows.parts); 75 rowList.add(cellList); 76 rows = rows.more; 77 } 78 return count; 79 } 80 81 private ArrayList<String> doCells(Parse cells) 82 { 83 ArrayList<String> cellList = new ArrayList<String>(); 84 int tmpCellCount = 0; 85 while (cells != null) 86 { 87 cellList.add(cells.text()); 88 cells = cells.more; 89 tmpCellCount++; 90 } 91 setMaxCellCount(tmpCellCount); 92 return cellList; 93 } 94 95 private void setMaxCellCount(int count) 96 { 97 if (count > maxCellCount) 98 { 99 maxCellCount = count; 100 } 101 } 102 103 private void initTableView(ArrayList<List<String>> rowList) 104 { 105 tableView = new JTable(new DebuggerViewModel(rowList, maxCellCount)); 106 tableView.getColumnModel().getColumn(0).setWidth(20); 107 tableView.getColumnModel().getColumn(0).setPreferredWidth(20); 108 tableView.getColumnModel().getColumn(0).setMaxWidth(20); 109 tableView.getColumnModel().getColumn(0).setMinWidth(20); 110 getContentPane().add(new JScrollPane(tableView), BorderLayout.CENTER); 111 } 112 113 private void initButtons() 114 { 115 getContentPane().add(buttonPanel, BorderLayout.SOUTH); 116 117 buttonPanel.add(nextStepButton); 118 buttonPanel.add(runButtonp); 119 120 nextStepButton.addActionListener(new ActionListener() 121 { 122 public void actionPerformed(ActionEvent e) 123 { 124 isStepMode = true; 125 fortsetzen(); 126 } 127 }); 128 129 runButtonp.addActionListener(new ActionListener() 130 { 131 public void actionPerformed(ActionEvent e) 132 { 133 fortsetzen(); 134 } 135 }); 136 } 137 138 public void doRow(Parse parse) 139 { 140 if (isDebuggerEnable(parse)) 141 { 142 isStepMode = false; 143 Integer row = parseToCount.get(parse); 144 setActualRowSelected(row); 145 scrollToRow(row); 146 setVisible(true); 147 warten(); 148 } 149 } 150 151 private void warten() 152 { 153 try 154 { 155 synchronized (lock) 156 { 157 tableView.setForeground(Color.BLACK); 158 lock.wait(); 159 tableView.setForeground(Color.LIGHT_GRAY); 160 } 161 } 162 catch (InterruptedException e1) 163 { 164 } 165 } 166 167 private void fortsetzen() 168 { 169 synchronized (lock) 170 { 171 lock.notifyAll(); 172 } 173 } 174 175 private void scrollToRow(Integer row) 176 { 177 Rectangle rect = tableView.getCellRect(row - 1, 0, true); 178 tableView.scrollRectToVisible(rect); 179 } 180 181 private void setActualRowSelected(Integer row) 182 { 183 ListSelectionModel selectionModel = tableView.getSelectionModel(); 184 selectionModel.setSelectionInterval(row - 1, row - 1); 185 } 186 187 private boolean isDebuggerEnable(Parse parse) 188 { 189 return isStepMode || isBreakPoint(parse); 190 } 191 192 private boolean isBreakPoint(Parse parse) 193 { 194 Integer count = parseToCount.get(parse); 195 Object object = tableView.getModel().getValueAt(count - 1, 0); 196 if (object instanceof Boolean) 197 { 198 Boolean result = (Boolean) object; 199 return result; 200 } 201 return false; 202 } 203 }