Save PDB file to disk
[jalview.git] / src / MCview / PDBViewer.java
index 50a4a36..1f1f94d 100755 (executable)
@@ -26,19 +26,22 @@ import jalview.gui.*;
 import jalview.io.EBIFetchClient;\r
 import java.awt.event.ActionListener;\r
 import java.awt.event.ActionEvent;\r
+import java.io.*;\r
+import jalview.io.JalviewFileChooser;\r
+import jalview.io.JalviewFileView;\r
 \r
 public class PDBViewer extends JInternalFrame implements Runnable\r
 {\r
   PDBEntry pdb;\r
   Sequence sequence;\r
   PDBCanvas pdbcanvas;\r
+  String tmpPDBFile;\r
 \r
 \r
   public PDBViewer(PDBEntry entry,\r
                    Sequence seq,\r
                    SeqCanvas seqcanvas)\r
   {\r
-    /*Uncomment this to modify in Jbuilder\r
     try\r
     {\r
       jbInit();\r
@@ -46,27 +49,51 @@ public class PDBViewer extends JInternalFrame implements Runnable
     catch (Exception ex)\r
     {\r
       ex.printStackTrace();\r
-    }*/\r
+    }\r
 \r
 \r
+    if (entry==null)\r
+      return;\r
     pdb = entry;\r
     sequence = seq;\r
+    pdbcanvas = new PDBCanvas(seqcanvas, sequence);\r
+\r
+    if(pdb.getFile()!=null)\r
+    {\r
+        try{\r
+          tmpPDBFile = pdb.getFile();\r
+          PDBfile pdbfile = new PDBfile(tmpPDBFile,\r
+                                        jalview.io.AppletFormatAdapter.FILE);\r
+          pdbcanvas.setPDBFile(pdbfile);\r
+\r
+        }catch(java.io.IOException ex)\r
+        {\r
+          ex.printStackTrace();\r
+        }\r
+    }\r
+    else\r
+    {\r
+      Thread worker = new Thread(this);\r
+      worker.start();\r
+    }\r
 \r
-    Thread worker = new Thread(this);\r
-    worker.start();\r
 \r
-    pdbcanvas = new PDBCanvas(seqcanvas, seq);\r
 \r
     setContentPane(pdbcanvas);\r
     StringBuffer title = new StringBuffer(sequence.getName() + ":" + pdb.getId());\r
     if(pdb.getProperty()!=null)\r
     {\r
-      title.append( " Method: " );\r
-      title.append(pdb.getProperty().get("method"));\r
-      title.append( " Chain:" );\r
-      title.append( pdb.getProperty().get("chains"));\r
+      if (pdb.getProperty().get("method")!=null)\r
+      {\r
+        title.append(" Method: ");\r
+        title.append(pdb.getProperty().get("method"));\r
+      }\r
+      if (pdb.getProperty().get("chains") != null)\r
+      {\r
+        title.append(" Chain:");\r
+        title.append(pdb.getProperty().get("chains"));\r
+      }\r
     }\r
-\r
      Desktop.addInternalFrame(this,title.toString(),400, 400);\r
   }\r
 \r
@@ -74,25 +101,24 @@ public class PDBViewer extends JInternalFrame implements Runnable
   {\r
     try\r
     {\r
-      EBIFetchClient ebi = new EBIFetchClient();\r
-      String[] result = ebi.fetchData("pdb:" + pdb.getId(), "default","raw");\r
-\r
-      PDBfile pdbfile = new PDBfile(result);\r
-\r
-      pdbcanvas.setPDBFile(pdbfile);\r
-\r
-      try\r
-      {\r
-        jbInit();\r
-      }\r
-      catch (Exception ex)\r
-      {\r
-        ex.printStackTrace();\r
-      }\r
+        EBIFetchClient ebi = new EBIFetchClient();\r
+        String query = "pdb:" + pdb.getId();\r
+        tmpPDBFile = ebi.fetchDataAsFile(query, "default", "raw").getAbsolutePath();\r
+        if (tmpPDBFile != null)\r
+        {\r
+          PDBfile pdbfile = new PDBfile(tmpPDBFile, jalview.io.AppletFormatAdapter.FILE);\r
+          pdbcanvas.setPDBFile(pdbfile);\r
+        }\r
+        else\r
+        {\r
+          throw new Exception("Empty result for WSDbFetch Query: " + query);\r
+        }\r
     }\r
     catch (Exception ex)\r
     {\r
       ex.printStackTrace();\r
+      showErrorMessage("Failed to retrieve PDB structure.");\r
+//      this.dispose();\r
     }\r
   }\r
 \r
@@ -261,11 +287,28 @@ public class PDBViewer extends JInternalFrame implements Runnable
       }\r
     });\r
     viewMenu.setText("View");\r
+    background.setText("Background Colour...");\r
+    background.addActionListener(new ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        background_actionPerformed(e);\r
+      }\r
+    });\r
+    savePDB.setText("PDB File");\r
+    savePDB.addActionListener(new ActionListener()\r
+    {\r
+      public void actionPerformed(ActionEvent e)\r
+      {\r
+        savePDB_actionPerformed(e);\r
+      }\r
+    });\r
     jMenuBar1.add(fileMenu);\r
     jMenuBar1.add(coloursMenu);\r
     jMenuBar1.add(viewMenu);\r
     fileMenu.add(saveMenu);\r
     fileMenu.add(mapping);\r
+    saveMenu.add(savePDB);\r
     saveMenu.add(png);\r
     saveMenu.add(eps);\r
     coloursMenu.add(seqButton);\r
@@ -279,6 +322,7 @@ public class PDBViewer extends JInternalFrame implements Runnable
     coloursMenu.add(turn);\r
     coloursMenu.add(buried);\r
     coloursMenu.add(user);\r
+    coloursMenu.add(background);\r
     ButtonGroup bg = new ButtonGroup();\r
     bg.add(seqButton);\r
     bg.add(chain);\r
@@ -373,6 +417,8 @@ public class PDBViewer extends JInternalFrame implements Runnable
   JRadioButtonMenuItem strand = new JRadioButtonMenuItem();\r
   JRadioButtonMenuItem helix = new JRadioButtonMenuItem();\r
   JMenu viewMenu = new JMenu();\r
+  JMenuItem background = new JMenuItem();\r
+  JMenuItem savePDB = new JMenuItem();\r
 \r
   /**\r
    * DOCUMENT ME!\r
@@ -490,6 +536,12 @@ public class PDBViewer extends JInternalFrame implements Runnable
   {\r
     pdbcanvas.setAllchainsVisible(allchains.getState());\r
   }\r
+  void showErrorMessage(String error)\r
+  {\r
+    JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
+         error, "PDB Viewer Error", JOptionPane.WARNING_MESSAGE);\r
+  }\r
+\r
 \r
   public void zappo_actionPerformed(ActionEvent e)\r
   {\r
@@ -555,4 +607,52 @@ public class PDBViewer extends JInternalFrame implements Runnable
       pdbcanvas.repaint();\r
     }\r
   }\r
+\r
+  public void background_actionPerformed(ActionEvent e)\r
+  {\r
+      java.awt.Color col = JColorChooser.showDialog(this, "Select Background Colour",\r
+                pdbcanvas.backgroundColour);\r
+\r
+      if(col!=null)\r
+       {\r
+         pdbcanvas.backgroundColour = col;\r
+         pdbcanvas.redrawneeded = true;\r
+         pdbcanvas.repaint();\r
+       }\r
+  }\r
+\r
+  public void savePDB_actionPerformed(ActionEvent e)\r
+  {\r
+    JalviewFileChooser chooser = new JalviewFileChooser(\r
+        jalview.bin.Cache.getProperty(\r
+            "LAST_DIRECTORY"));\r
+\r
+    chooser.setFileView(new JalviewFileView());\r
+    chooser.setDialogTitle("Save PDB File");\r
+    chooser.setToolTipText("Save");\r
+\r
+    int value = chooser.showSaveDialog(this);\r
+\r
+    if (value == JalviewFileChooser.APPROVE_OPTION)\r
+    {\r
+        try\r
+        {\r
+          BufferedReader in = new BufferedReader(new FileReader(tmpPDBFile));\r
+          File outFile = chooser.getSelectedFile();\r
+\r
+          PrintWriter out = new PrintWriter(new FileOutputStream(outFile));\r
+          String data;\r
+          while ( (data = in.readLine()) != null)\r
+          {\r
+            if (data.indexOf("<PRE>") == -1 && data.indexOf("</PRE>") == -1)\r
+              out.println(data);\r
+          }\r
+          out.close();\r
+        }\r
+        catch (Exception ex)\r
+        {\r
+          ex.printStackTrace();\r
+        }\r
+      }\r
+  }\r
 }\r