00001 package guiUtilities;
00002
00003
00004
00005
00006 import javax.swing.*;
00007 import javax.swing.border.*;
00008 import java.awt.*;
00009 import java.awt.event.*;
00010 import java.net.URL;
00011 import javax.swing.event.*;
00012 import java.util.Vector;
00013 import java.util.StringTokenizer;
00014 import java.util.regex.*;
00015 import java.io.*;
00016
00017 public class HTMLViewer extends JFrame implements HyperlinkListener {
00018 private static HTMLViewer instance = new HTMLViewer();
00019 JLabel title;
00020 JScrollPane scrollPane;
00021 JEditorPane editorPane;
00022 JLabel linkText;
00023 JButton refreshButton,closeButton, backButton,forwardButton;
00024 Vector htmlFileList,captionList,imageFileList;
00025 int htmlIndex;
00026 int htmlCount;
00027 JMenu captionMenu;
00028
00029 String captionString, htmlString;
00030
00031 public static final int DATASHEET=0;
00032 public static final int WEBLINK=1;
00033 public static final int XYMETDATA=2;
00034 public static final int ZMETDATA=3;
00035 public static final int SENSORTESTDATA=4;
00036 public static final int SCTDAQTESTDATA=5;
00037 public static final int URLTOPOSTSCRIPT=6;
00038 public static final int RAWDATA=7;
00039 public static final int SCTDAQTESTLIST=8;
00040 public static final int MODULESUMMARY=9;
00041 public static final int SCTDBIMAGE=10;
00042
00043 private HTMLViewer() {
00044 super("Report");
00045 htmlIndex=0;
00046 htmlCount=0;
00047 initComponents();
00048 addWindowListener(new java.awt.event.WindowAdapter() {
00049 public void windowClosing(java.awt.event.WindowEvent evt) {
00050 close();
00051 }
00052 });
00053 htmlFileList = new Vector();
00054 captionList = new Vector();
00055 imageFileList = new Vector();
00056 captionMenu = new JMenu();
00057 }
00058 public static HTMLViewer getInstance() {
00059 return instance;
00060 }
00061
00062 public void close() {
00063
00064 for(int i=0;i<htmlFileList.size();i++) {
00065 File thisFile = new File((String)htmlFileList.elementAt(i));
00066 if(thisFile.exists()) {
00067 System.out.println("Deleting "+thisFile.getAbsolutePath());
00068 thisFile.delete();
00069 }
00070 }
00071 synchronized(imageFileList) {
00072 for(int i=0;i<imageFileList.size();i++) {
00073 File thisFile = new File((String)imageFileList.elementAt(i));
00074 if(thisFile.exists()) {
00075 System.out.println("Deleting "+thisFile.getAbsolutePath());
00076 thisFile.delete();
00077 }
00078 }
00079 }
00080 }
00081
00082
00083 private void initComponents() {
00084 editorPane = new JEditorPane();
00085 editorPane.setEditable(false);
00086 editorPane.addHyperlinkListener(this);
00087 editorPane.addMouseListener(new htmlViewerMouseAdapter());
00088
00089 scrollPane = new JScrollPane(editorPane);
00090 scrollPane.setVerticalScrollBarPolicy(
00091 JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
00092 scrollPane.setHorizontalScrollBarPolicy(
00093 JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
00094
00095 scrollPane.setPreferredSize(new Dimension(850, 400));
00096 scrollPane.setMinimumSize(new Dimension(650, 400));
00097
00098 java.awt.GridBagConstraints gridBagConstraints;
00099
00100 title = new javax.swing.JLabel();
00101 linkText = new javax.swing.JLabel();
00102 refreshButton = new javax.swing.JButton();
00103 refreshButton.addActionListener(new java.awt.event.ActionListener() {
00104 public void actionPerformed(java.awt.event.ActionEvent evt) {
00105 refreshButtonActionPerformed(evt);
00106 }
00107 });
00108 closeButton = new javax.swing.JButton();
00109 closeButton.addActionListener(new java.awt.event.ActionListener() {
00110 public void actionPerformed(java.awt.event.ActionEvent evt) {
00111 closeButtonActionPerformed(evt);
00112 }
00113 });
00114 backButton = new javax.swing.JButton();
00115 backButton.setEnabled(false);
00116 backButton.addActionListener(new java.awt.event.ActionListener() {
00117 public void actionPerformed(java.awt.event.ActionEvent evt) {
00118 backButtonActionPerformed(evt);
00119 }
00120 });
00121 forwardButton = new javax.swing.JButton();
00122 forwardButton.setEnabled(false);
00123 forwardButton.addActionListener(new java.awt.event.ActionListener() {
00124 public void actionPerformed(java.awt.event.ActionEvent evt) {
00125 forwardButtonActionPerformed(evt);
00126 }
00127 });
00128
00129 getContentPane().setLayout(new java.awt.GridBagLayout());
00130 title.setText("Caption to this report");
00131 gridBagConstraints = new java.awt.GridBagConstraints();
00132 gridBagConstraints.gridx = 0;
00133 gridBagConstraints.gridy = 0;
00134 gridBagConstraints.gridwidth = 4;
00135 gridBagConstraints.weighty = 0.1;
00136 getContentPane().add(title, gridBagConstraints);
00137
00138 gridBagConstraints = new java.awt.GridBagConstraints();
00139 gridBagConstraints.gridx = 0;
00140 gridBagConstraints.gridy = 1;
00141 gridBagConstraints.gridwidth = 4;
00142 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
00143 gridBagConstraints.weighty = 0.8;
00144 getContentPane().add(scrollPane, gridBagConstraints);
00145
00146 linkText.setText("Link:");
00147 linkText.setFont(new java.awt.Font("Arial", 1, 10));
00148 linkText.setForeground(new java.awt.Color(0, 0, 153));
00149 gridBagConstraints = new java.awt.GridBagConstraints();
00150 gridBagConstraints.gridx = 0;
00151 gridBagConstraints.gridy = 2;
00152 gridBagConstraints.gridwidth = 4;
00153 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
00154 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
00155 gridBagConstraints.weighty = 0.05;
00156 getContentPane().add(linkText, gridBagConstraints);
00157
00158 refreshButton.setText("Refresh");
00159 gridBagConstraints = new java.awt.GridBagConstraints();
00160 gridBagConstraints.gridx = 0;
00161 gridBagConstraints.gridy = 3;
00162 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
00163 gridBagConstraints.weightx = 0.25;
00164 gridBagConstraints.weighty = 0.05;
00165 getContentPane().add(refreshButton, gridBagConstraints);
00166
00167 backButton.setText(" < ");
00168 gridBagConstraints = new java.awt.GridBagConstraints();
00169 gridBagConstraints.gridx = 1;
00170 gridBagConstraints.gridy = 3;
00171 gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
00172 gridBagConstraints.weightx = 0.25;
00173 getContentPane().add(backButton, gridBagConstraints);
00174
00175 forwardButton.setText(" > ");
00176 gridBagConstraints = new java.awt.GridBagConstraints();
00177 gridBagConstraints.gridx = 2;
00178 gridBagConstraints.gridy = 3;
00179 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
00180 gridBagConstraints.weightx = 0.25;
00181 getContentPane().add(forwardButton, gridBagConstraints);
00182
00183 closeButton.setText("Close");
00184 gridBagConstraints = new java.awt.GridBagConstraints();
00185 gridBagConstraints.gridx = 3;
00186 gridBagConstraints.gridy = 3;
00187 gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
00188 gridBagConstraints.weightx = 0.25;
00189 getContentPane().add(closeButton, gridBagConstraints);
00190
00191 pack();
00192 }
00193
00194
00195 public synchronized void show(String theHTML,String theCaption) {
00196 captionString=theCaption;
00197 htmlString=theHTML;
00198 javax.swing.SwingUtilities.invokeLater(new Runnable() {
00199
00200 public void run() {
00201
00202 String s=null;
00203 URL theURL;
00204
00205 try {
00206 if(!htmlString.startsWith("http")) {
00207 String filename = "testreport_"+Integer.toString(htmlCount)+".html";
00208 File htmlFile = new File(Preferences.PreferencesInterface.getInstance().getPreference(Preferences.PreferencesInterface.SCRATCH_DIR),filename);
00209 BufferedWriter out = new BufferedWriter(new FileWriter(htmlFile));
00210 out.write(htmlString);
00211 out.close();
00212 htmlFileList.addElement(htmlFile.getAbsolutePath());
00213 s = "file:"+htmlFile.getAbsolutePath();
00214 theURL = new URL(s);
00215 }
00216 else {
00217
00218 htmlIndex = htmlFileList.indexOf(htmlString);
00219 if(htmlIndex>=0) {
00220 showExistingURL();
00221 return;
00222 }
00223
00224 theURL = new URL(htmlString);
00225 htmlFileList.addElement(htmlString);
00226 }
00227
00228 captionList.addElement(captionString);
00229 htmlIndex = htmlFileList.size()-1;
00230
00231 JMenuItem item = new JMenuItem(captionString);
00232 item.setFont(new java.awt.Font("Arial",java.awt.Font.PLAIN,10));
00233 captionMenu.add(item);
00234 item.addActionListener(new java.awt.event.ActionListener() {
00235 public void actionPerformed(java.awt.event.ActionEvent evt) {
00236 menuItemSelected(evt);
00237 }
00238 });
00239
00240 editorPane.setPage(theURL);
00241 title.setText(captionString);
00242
00243 setButtonStates();
00244 setVisible(true);
00245 htmlCount++;
00246 } catch(Exception e) {
00247 javax.swing.JOptionPane.showMessageDialog(null,"Exception creating URL: "+e.toString());
00248 }
00249
00250 }
00251 });
00252
00253
00254 }
00255
00256 public void showExistingURL() {
00257 String s=(String)htmlFileList.elementAt(htmlIndex);
00258 URL theURL;
00259 try {
00260 if(!s.startsWith("http")) {
00261 s = "file:"+s;
00262 theURL = new URL(s);
00263 }
00264 else theURL = new URL(s);
00265 editorPane.setPage(theURL);
00266 title.setText((String)captionList.elementAt(htmlIndex));
00267
00268 setButtonStates();
00269 setVisible(true);
00270 } catch(Exception e) {
00271 javax.swing.JOptionPane.showMessageDialog(null,"Exception creating URL: "+e.toString());
00272 }
00273 }
00274
00275
00276 public Insets getInsets() {
00277 return new Insets(20,20,20,20);
00278 }
00279 public void hyperlinkUpdate(HyperlinkEvent event) {
00280 Pattern linkPattern = Pattern.compile("Type(\\d+)&ref=(.*)");
00281 Pattern htmlLinkPattern = Pattern.compile("(http://.*)");
00282 String linkName = event.getDescription();
00283 Matcher matcher = linkPattern.matcher(linkName);
00284 Matcher matcher3 = htmlLinkPattern.matcher(linkName);
00285 int index=-1;
00286 String ref;
00287 if(matcher.matches()) {
00288 index = Integer.parseInt(linkName.substring(matcher.start(1),matcher.end(1)));
00289 ref = linkName.substring(matcher.start(2),matcher.end(2));
00290 }
00291 else if(matcher3.matches()) {
00292 ref = linkName.substring(matcher3.start(1),matcher3.end(1));
00293 index=WEBLINK;
00294 }
00295 else return;
00296
00297 if(event.getEventType()==HyperlinkEvent.EventType.ACTIVATED) {
00298
00299 ProdDatabase.ReportDownloader d;
00300 Vector list;
00301 switch(index) {
00302 case WEBLINK:
00303 if(ref.matches("http://.*html?(#.*)?")) show(ref,ref);
00304 else {
00305 StringBuffer s = new StringBuffer("<html><head></head><body>");
00306 s.append("<img src="+ref+"></body></html>");
00307 show(s.toString(),ref);
00308 }
00309 break;
00310 case SENSORTESTDATA:
00311 list = new Vector();
00312 list.addElement(ref);
00313 d = new ProdDatabase.ReportDownloader(SENSORTESTDATA, list);
00314 if(d.isOkToStart()) d.start();
00315 break;
00316 case SCTDAQTESTLIST:
00317 d = new ProdDatabase.ReportDownloader(SCTDAQTESTLIST, ref, 0);
00318 if(d.isOkToStart()) d.start();
00319 break;
00320 case SCTDAQTESTDATA:
00321 String[] info = ref.split("__");
00322 d = new ProdDatabase.ReportDownloader(SCTDAQTESTDATA, info[0], Integer.parseInt(info[1]));
00323 if(d.isOkToStart()) d.start();
00324 break;
00325 case URLTOPOSTSCRIPT:
00326 d = new ProdDatabase.ReportDownloader(URLTOPOSTSCRIPT, ref, 0);
00327 if(d.isOkToStart()) d.start();
00328 break;
00329 case SCTDBIMAGE:
00330 Pattern imagePattern = Pattern.compile("(\\d+)(.*)");
00331 Matcher matcher2 = imagePattern.matcher(ref);
00332 if(!matcher2.matches()) {
00333 System.err.println("Urecognised image info: "+ref);
00334 return;
00335 }
00336 String testno = ref.substring(matcher2.start(1),matcher2.end(1));
00337 String title = ref.substring(matcher2.start(2),matcher2.end(2));
00338 try {
00339 Vector pics = ProdDatabase.GeneralUtilities.getImages(testno,title);
00340 if(pics.size()>0) {
00341 guiUtilities.ImageViewer imageViewer = new guiUtilities.ImageViewer();
00342 imageViewer.showNewPhotos(pics);
00343 }
00344 else System.out.println("No test images available for this test.");
00345 }catch(Exception e){System.err.println("HTMLViewer::hyperlinkUpdate: Exception downloading test images: "+e.toString());}
00346 break;
00347 case XYMETDATA:
00348 try {
00349 ProdDatabase.SCTDBTestInfoHolder testInfo = ProdDatabase.GeneralUtilities.getTestInfo(ref);
00350 if(testInfo==null) return;
00351 String cType = testInfo.get(ProdDatabase.SCTDBTestInfoHolder.CTYPE);
00352 if(cType.indexOf("bmModule")!=-1) {
00353 Vector tableContents = ProdDatabase.BarrelUtilities.getXYMetrologyData(ref);
00354 Vector tData = (Vector)tableContents.elementAt(2);
00355 if(tData.size()>0) guiUtilities.SpreadsheetViewer.getInstance().update("XY metrology data for "+testInfo.get(ProdDatabase.SCTDBTestInfoHolder.SN)+" taken at "+testInfo.get(ProdDatabase.SCTDBTestInfoHolder.LOCATION)+" on "+testInfo.get(ProdDatabase.SCTDBTestInfoHolder.DATE),tData);
00356 }
00357 else {
00358 Vector tableContents = ProdDatabase.EndCapUtilities.getXYMetrologyData(ref);
00359 if(tableContents.size()>0) guiUtilities.SpreadsheetViewer.getInstance().update("XY metrology data for "+testInfo.get(ProdDatabase.SCTDBTestInfoHolder.SN)+" taken at "+testInfo.get(ProdDatabase.SCTDBTestInfoHolder.LOCATION)+" on "+testInfo.get(ProdDatabase.SCTDBTestInfoHolder.DATE),tableContents);
00360 }
00361
00362 }catch(Exception e){System.err.println("HTMLViewer::hyperlinkUpdate: Exception viewing XYmetrology "+e.toString());}
00363
00364 break;
00365 case ZMETDATA:
00366 try {
00367 ProdDatabase.SCTDBTestInfoHolder testInfo = ProdDatabase.GeneralUtilities.getTestInfo(ref);
00368 if(testInfo==null) return;
00369 String cType = testInfo.get(ProdDatabase.SCTDBTestInfoHolder.CTYPE);
00370 if(cType.indexOf("bmModule")!=-1) {
00371 Vector tableContents = ProdDatabase.BarrelUtilities.getZMetrologyData(ref);
00372 Vector tData = (Vector)tableContents.elementAt(2);
00373 if(tData.size()>0) guiUtilities.SpreadsheetViewer.getInstance().update("Z metrology data for "+testInfo.get(ProdDatabase.SCTDBTestInfoHolder.SN)+" taken at "+testInfo.get(ProdDatabase.SCTDBTestInfoHolder.LOCATION)+" on "+testInfo.get(ProdDatabase.SCTDBTestInfoHolder.DATE),tData);
00374 }
00375 else {
00376 Vector tableContents = ProdDatabase.EndCapUtilities.getZMetrologyData(ref);
00377 if(tableContents.size()>0) guiUtilities.SpreadsheetViewer.getInstance().update("Z metrology data for "+testInfo.get(ProdDatabase.SCTDBTestInfoHolder.SN)+" taken at "+testInfo.get(ProdDatabase.SCTDBTestInfoHolder.LOCATION)+" on "+testInfo.get(ProdDatabase.SCTDBTestInfoHolder.DATE),tableContents);
00378 }
00379 }catch(Exception e){System.err.println("HTMLViewer::hyperlinkUpdate: Exception viewing Zmetrology "+e.toString());}
00380
00381 break;
00382
00383 case RAWDATA:
00384 case DATASHEET:
00385 d = new ProdDatabase.ReportDownloader(RAWDATA, ref, 0);
00386 if(d.isOkToStart()) d.start();
00387 break;
00388 default:
00389
00390 }
00391 }
00392 else if(event.getEventType()==HyperlinkEvent.EventType.ENTERED) {
00393
00394 switch(index) {
00395 case DATASHEET:
00396 linkText.setText("Link: Data sheet for "+ref);
00397 break;
00398 case XYMETDATA:
00399 linkText.setText("Link: XY metrology datasheet");
00400 break;
00401 case ZMETDATA:
00402 linkText.setText("Link: Z metrology datasheet");
00403 break;
00404 case WEBLINK:
00405 case URLTOPOSTSCRIPT:
00406 linkText.setText("Link: "+ref);
00407 break;
00408 case SCTDBIMAGE:
00409 linkText.setText("Link: View plots");
00410 break;
00411 case SENSORTESTDATA:
00412 linkText.setText("Link: Sensor test data for "+ref);
00413 break;
00414 case SCTDAQTESTLIST:
00415 linkText.setText("Link: Report of all SCTDAQ tests");
00416 break;
00417 case SCTDAQTESTDATA:
00418 linkText.setText("Link: Full SCTDAQ test report");
00419 break;
00420 case RAWDATA:
00421 linkText.setText("Link: Raw Data for SCTDB test no "+ref);
00422 break;
00423 default:
00424 linkText.setText("Link: unrecognised");
00425 }
00426
00427 }
00428 else if(event.getEventType()==HyperlinkEvent.EventType.EXITED) {
00429 linkText.setText("Link:");
00430 }
00431 }
00432
00433 private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {
00434 try {
00435 String currentHTMLFile=(String)htmlFileList.elementAt(htmlIndex);
00436 Pattern filePattern = Pattern.compile("(.*testreport_)\\d+\\.html");
00437 Matcher matcher = filePattern.matcher(currentHTMLFile);
00438 if(matcher.matches()) {
00439 String newFile = currentHTMLFile.substring(matcher.start(1),matcher.end(1))+Integer.toString(htmlCount)+".html";
00440 DaveUtils.copyFile(currentHTMLFile,newFile);
00441 (new File(currentHTMLFile)).delete();
00442 htmlFileList.setElementAt(newFile,htmlIndex);
00443 htmlCount++;
00444 }
00445 showExistingURL();
00446 }catch(Exception e){System.err.println(e.toString());}
00447 }
00448
00449 private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {
00450 setVisible(false);
00451 }
00452 private void forwardButtonActionPerformed(java.awt.event.ActionEvent evt) {
00453 htmlIndex++;
00454 showExistingURL();
00455 }
00456 private void backButtonActionPerformed(java.awt.event.ActionEvent evt) {
00457 htmlIndex--;
00458 showExistingURL();
00459 }
00460
00461 private void setButtonStates() {
00462 forwardButton.setEnabled(htmlIndex<htmlFileList.size()-1);
00463 backButton.setEnabled(htmlIndex>0);
00464 }
00465 private void printState() {
00466 System.out.println("htmlIndex="+htmlIndex+", #="+htmlFileList.size());
00467 for(int i=0;i<htmlFileList.size();i++) {
00468 System.out.println("Caption: "+(String)captionList.elementAt(i)+" URL: "+(String)htmlFileList.elementAt(i));
00469 }
00470 }
00471
00472
00473 class htmlViewerMouseAdapter extends java.awt.event.MouseAdapter {
00474 public void mouseClicked(java.awt.event.MouseEvent e) {
00475 switch(e.getModifiers()) {
00476 case java.awt.event.InputEvent.BUTTON2_MASK:
00477 case java.awt.event.InputEvent.BUTTON3_MASK:
00478 JPopupMenu pMenu = captionMenu.getPopupMenu();
00479 pMenu.show(e.getComponent(),e.getX(),e.getY());
00480 pMenu.setInvoker(captionMenu);
00481 break;
00482 default:
00483 }
00484 }
00485 }
00486
00487 public void menuItemSelected(ActionEvent e) {
00488 JMenuItem source = (JMenuItem)e.getSource();
00489 String selectedCaption = source.getText();
00490 for(int i=0;i<captionList.size();i++) {
00491 if(((String)captionList.elementAt(i)).equals(selectedCaption)) {
00492 htmlIndex=i;
00493 showExistingURL();
00494 break;
00495 }
00496 }
00497
00498
00499 }
00500 public void addImageFile(String imageFile) {
00501 synchronized(imageFileList) {
00502 imageFileList.addElement(imageFile);
00503 }
00504
00505 }
00506 }
00507
00508
00509
00510
00511
00512
00513
00514