001 /* 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: 2002-10-17 005 * Time: 17:11:15 006 * To change template for new class use 007 * Code Style | Class Templates options (Tools | IDE Options). 008 */ 009 package EVolve.util; 010 011 import EVolve.Scene; 012 import EVolve.visualization.AutoImage; 013 import javax.swing.*; 014 import java.util.*; 015 import java.awt.*; 016 import java.awt.event.*; 017 018 public class ThreadChooser { 019 private ArrayList threadSet; 020 private HashMap imageMap,colorMap; 021 private JDialog dialog; 022 private JList threads; 023 private DefaultListModel threadListModel; 024 private AutoImage mergedImage; 025 private JComboBox comboThread; 026 private int [] indices; 027 private boolean multiChoice; 028 029 030 public ThreadChooser(HashMap imageMap,boolean multiChoice) { 031 this.imageMap = imageMap; 032 colorMap = new HashMap(); 033 this.multiChoice = multiChoice; 034 } 035 036 private String showMultiChoiceDialog() { 037 Scene.getUIManager().endTimer(); 038 039 if (imageMap.size() == 0) return null; 040 dialog = new JDialog(Scene.getFrame(), "Choose thread & color to be visualized", true); 041 042 dialog.setBounds(new Rectangle(250,100)); 043 044 threadListModel = new DefaultListModel(); 045 threadSet = new ArrayList(); 046 threads = new JList(threadListModel); 047 Iterator it = imageMap.keySet().iterator(); 048 while (it.hasNext()) { 049 threadSet.add("Thread "+it.next()); 050 } 051 for (int i=0; i<threadSet.size(); i++) { 052 String item = (String)threadSet.get(i); 053 threadListModel.addElement(item); 054 } 055 dialog.getContentPane().add(threads,BorderLayout.CENTER); 056 057 JPanel panelButton = new JPanel(new FlowLayout()); 058 dialog.getContentPane().add(panelButton, BorderLayout.SOUTH); 059 060 JButton buttonColor = new JButton("Coloring"); 061 buttonColor.addActionListener(new ActionListener() { 062 public void actionPerformed(ActionEvent e) { 063 selectColor(); 064 } 065 }); 066 panelButton.add(buttonColor); 067 068 JButton buttonOK = new JButton("OK"); 069 buttonOK.addActionListener(new ActionListener() { 070 public void actionPerformed(ActionEvent e) { 071 if (threads.getSelectedIndices().length == 0) { 072 Scene.showErrorMessage("You must choose at least one thread!"); 073 return; 074 } 075 indices = threads.getSelectedIndices(); 076 dialog.setVisible(false); 077 dialog = null; 078 } 079 }); 080 panelButton.add(buttonOK); 081 082 JButton buttonCancel = new JButton("Cancel"); 083 buttonCancel.addActionListener(new ActionListener() { 084 public void actionPerformed(ActionEvent e) { 085 dialog.setVisible(false); 086 } 087 }); 088 panelButton.add(buttonCancel); 089 dialog.pack(); 090 Scene.getUIManager().showDialog(dialog, dialog.getWidth(), dialog.getHeight()); 091 return null; 092 } 093 094 private String showSingleChoiceDialog() { 095 Scene.getUIManager().endTimer(); 096 dialog = new JDialog(Scene.getFrame(), "Choose thread to be visualized", true); 097 098 Box boxMain = new Box(BoxLayout.Y_AXIS); 099 dialog.getContentPane().add(boxMain,BorderLayout.CENTER); 100 dialog.setBounds(new Rectangle(250,100)); 101 comboThread = new JComboBox(); 102 103 Iterator it = imageMap.keySet().iterator(); 104 while (it.hasNext()) { 105 comboThread.addItem("Thread "+it.next()); 106 } 107 boxMain.add(comboThread); 108 109 JPanel panelButton = new JPanel(new FlowLayout()); 110 dialog.getContentPane().add(panelButton, BorderLayout.SOUTH); 111 112 JButton buttonOK = new JButton("OK"); 113 buttonOK.addActionListener(new ActionListener() { 114 public void actionPerformed(ActionEvent e) { 115 if (!validateThread()) 116 Scene.showErrorMessage("No data is available for this thread."); 117 else 118 dialog.setVisible(false); 119 } 120 }); 121 panelButton.add(buttonOK); 122 123 JButton buttonCancel = new JButton("Cancel"); 124 buttonCancel.addActionListener(new ActionListener() { 125 public void actionPerformed(ActionEvent e) { 126 dialog.setVisible(false); 127 } 128 }); 129 panelButton.add(buttonCancel); 130 dialog.pack(); 131 Scene.getUIManager().showDialog(dialog, dialog.getWidth(), dialog.getHeight()); 132 133 dialog = null; 134 return (String)comboThread.getSelectedItem(); 135 } 136 137 public String showDialog() { 138 if (multiChoice) 139 return showMultiChoiceDialog(); 140 else 141 return showSingleChoiceDialog(); 142 } 143 144 private void selectColor() { 145 int index = threads.getSelectedIndex(); 146 147 if (index != -1) { 148 Color newColor = JColorChooser.showDialog(Scene.getFrame(), "Choose a color", Color.black); 149 if (newColor != null) { 150 colorMap.put(new Integer(index),newColor); 151 threadListModel.removeAllElements(); 152 153 for (int i=0; i<threadSet.size(); i++) { 154 if (colorMap.get(new Integer(i)) == null) 155 threadListModel.addElement(threadSet.get(i)); 156 else 157 threadListModel.addElement("<html><font color=#" + getColorHex((Color)colorMap.get(new Integer(i))) + ">" 158 + threadSet.get(i) +" </font></html>" ); 159 } 160 } 161 } 162 } 163 164 public AutoImage coloringImages(HashMap imageMap) { 165 mergedImage = new AutoImage(); 166 for (int i=0; i<indices.length; i++) { 167 Color newColor = (Color)colorMap.get(new Integer(indices[i])); 168 String threadId = (String)threadSet.get(indices[i]); 169 threadId = threadId.substring(7,threadId.length()); 170 AutoImage image = (AutoImage)imageMap.get(new Integer(threadId)); 171 int w = image.getW(); 172 int h = image.getH(); 173 for (int j=0; j<w; j++) { 174 for (int k=0; k<h; k++) { 175 if (image.getColor(j,k) != null) 176 if (mergedImage.getColor(j,k) != null) 177 mergedImage.setColor(j,k,new Color(153,0,153)); 178 else 179 if (newColor != null) { 180 mergedImage.setColor(j,k,newColor); 181 } else mergedImage.setColor(j,k,image.getColor(j,k)); 182 } 183 } 184 185 } 186 return mergedImage; 187 } 188 189 private String getColorHex(Color color) { 190 String returnVal = Integer.toHexString(color.getBlue()); 191 if (returnVal.length() < 2) { 192 returnVal = "0" + returnVal; 193 } 194 returnVal = Integer.toHexString(color.getGreen()) + returnVal; 195 if (returnVal.length() < 4) { 196 returnVal = "0" + returnVal; 197 } 198 returnVal = Integer.toHexString(color.getRed()) + returnVal; 199 if (returnVal.length() < 6) { 200 returnVal = "0" + returnVal; 201 } 202 203 return returnVal; 204 } 205 206 public AutoImage getMergedImage() { 207 return mergedImage; 208 } 209 210 private boolean validateThread() { 211 AutoImage img; 212 213 String selected = (String)comboThread.getSelectedItem(); 214 img = (AutoImage)imageMap.get(new Integer(selected.substring(7,selected.length()))); 215 if (img.getW() == 0) return false; 216 217 return true; 218 } 219 220 221 }