Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

HTMLViewer.java

00001 package guiUtilities;
00002 /*
00003  * A simple html viewer.
00004  * @author robinson
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         // delete all saved html files ...
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() { // force to run in event dispatching thread
00199                                                                // as this may be invoked from SCTDB downloader thread
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 

Generated on Thu Jul 15 09:55:43 2004 for SCT DAQ/DCS Software - Java by doxygen 1.3.5