X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FStructureViewerBase.java;h=4de11dd6cc66909d5ee02ac5c16e1c6b0a9b0375;hb=4a3def9f59cefe629c9a33d87483283aee085928;hp=e180f6b6c48509294779baf950678f62276ab2ff;hpb=4f30214e8098748469c6a4269ac2ed6c5750e4b0;p=jalview.git diff --git a/src/jalview/gui/StructureViewerBase.java b/src/jalview/gui/StructureViewerBase.java index e180f6b..4de11dd 100644 --- a/src/jalview/gui/StructureViewerBase.java +++ b/src/jalview/gui/StructureViewerBase.java @@ -47,6 +47,7 @@ import javax.swing.event.MenuListener; import jalview.api.AlignmentViewPanel; import jalview.bin.Cache; +import jalview.bin.Console; import jalview.datamodel.AlignmentI; import jalview.datamodel.PDBEntry; import jalview.datamodel.SequenceI; @@ -61,8 +62,11 @@ import jalview.schemes.ColourSchemeI; import jalview.schemes.ColourSchemes; import jalview.structure.StructureMapping; import jalview.structures.models.AAStructureBindingModel; +import jalview.util.BrowserLauncher; import jalview.util.MessageManager; +import jalview.ws.dbsources.EBIAlfaFold; import jalview.ws.dbsources.Pdb; +import jalview.ws.utils.UrlDownloadClient; /** * Base class with common functionality for JMol, Chimera or other structure @@ -154,6 +158,17 @@ public abstract class StructureViewerBase extends GStructureViewer } /** + * called by the binding model to indicate when adding structures is happening + * or has been completed + * + * @param addingStructures + */ + public synchronized void setAddingStructures(boolean addingStructures) + { + this.addingStructures = addingStructures; + } + + /** * * @param ap2 * @return true if this Jmol instance is linked with the given alignPanel @@ -209,6 +224,10 @@ public abstract class StructureViewerBase extends GStructureViewer _alignwith.add(ap); } ; + // TODO: refactor to allow concrete classes to register buttons for adding + // here + // currently have to override to add buttons back in after they are cleared + // in this loop for (Component c : viewerActionMenu.getMenuComponents()) { if (c != alignStructs) @@ -384,7 +403,7 @@ public abstract class StructureViewerBase extends GStructureViewer // and call ourselves again. addStructure(pdbentry, seqs, chains, alignFrame); } - }).start(); + }, "Adding3DStructureQueue").start(); return; } } @@ -394,7 +413,7 @@ public abstract class StructureViewerBase extends GStructureViewer { seqs }, new String[][] { chains }); addingStructures = true; _started = false; - worker = new Thread(this); + worker = new Thread(this, "Adding3DStructure"); worker.start(); return; } @@ -426,8 +445,9 @@ public abstract class StructureViewerBase extends GStructureViewer { return; } - AlignmentPanel alignPanel = (AlignmentPanel) apanel; // Implementation error if this - // cast fails + AlignmentPanel alignPanel = (AlignmentPanel) apanel; // Implementation error + // if this + // cast fails useAlignmentPanelForSuperposition(alignPanel); addStructure(pdbentry, seq, chains, alignPanel.alignFrame); } @@ -564,9 +584,8 @@ public abstract class StructureViewerBase extends GStructureViewer public void changeColour_actionPerformed(String colourSchemeName) { AlignmentI al = getAlignmentPanel().av.getAlignment(); - ColourSchemeI cs = ColourSchemes.getInstance() - .getColourScheme(colourSchemeName, getAlignmentPanel().av, al, - null); + ColourSchemeI cs = ColourSchemes.getInstance().getColourScheme( + colourSchemeName, getAlignmentPanel().av, al, null); getBinding().colourByJalviewColourScheme(cs); } @@ -706,7 +725,7 @@ public abstract class StructureViewerBase extends GStructureViewer } else { - // update the Chimera display now. + // update the viewer display now. seqColour_actionPerformed(); } } @@ -756,6 +775,10 @@ public abstract class StructureViewerBase extends GStructureViewer } }); + viewerActionMenu.setText(getViewerName()); + helpItem.setText(MessageManager.formatMessage("label.viewer_help", + getViewerName())); + buildColourMenu(); } @@ -794,7 +817,7 @@ public abstract class StructureViewerBase extends GStructureViewer { sp.append("'" + alignPanel.getViewName() + "' "); } - Cache.log.info("Couldn't align structures with the " + sp.toString() + Console.info("Couldn't align structures with the " + sp.toString() + "associated alignment panels.", e); } return reply; @@ -965,7 +988,7 @@ public abstract class StructureViewerBase extends GStructureViewer * enable 'Superpose with' if more than one mapped structure */ viewSelectionMenu.setEnabled(false); - if (getBinding().getStructureFiles().length > 1 + if (getBinding().getMappedStructureCount() > 1 && getBinding().getSequence().length > 1) { viewSelectionMenu.setEnabled(true); @@ -1017,14 +1040,17 @@ public abstract class StructureViewerBase extends GStructureViewer { return false; } - int p=0; - for (String pdbid:pdbids) { + int p = 0; + for (String pdbid : pdbids) + { StructureMapping sm[] = getBinding().getSsm().getMapping(pdbid); - if (sm!=null && sm.length>0 && sm[0]!=null) { + if (sm != null && sm.length > 0 && sm[0] != null) + { p++; } } - // only return true if there is a mapping for every structure file we have loaded + // only return true if there is a mapping for every structure file we have + // loaded if (p == 0 || p != pdbids.length) { return false; @@ -1071,7 +1097,7 @@ public abstract class StructureViewerBase extends GStructureViewer progressBar = pi; } - protected void setProgressMessage(String message, long id) + public void setProgressMessage(String message, long id) { if (progressBar != null) { @@ -1116,11 +1142,12 @@ public abstract class StructureViewerBase extends GStructureViewer { String filePath = null; Pdb pdbclient = new Pdb(); + EBIAlfaFold afclient = new EBIAlfaFold(); AlignmentI pdbseq = null; String pdbid = processingEntry.getId(); long handle = System.currentTimeMillis() + Thread.currentThread().hashCode(); - + /* * Write 'fetching PDB' progress on AlignFrame as we are not yet visible */ @@ -1133,7 +1160,39 @@ public abstract class StructureViewerBase extends GStructureViewer // { pdbid })); try { - pdbseq = pdbclient.getSequenceRecords(pdbid); + if (afclient.isValidReference(pdbid)) + { + pdbseq = afclient.getSequenceRecords(pdbid, + processingEntry.getRetrievalUrl()); + } + else + { + if (processingEntry.hasRetrievalUrl()) + { + String safePDBId = java.net.URLEncoder.encode(pdbid, "UTF-8") + .replace("%", "__"); + + // retrieve from URL to new local tmpfile + File tmpFile = File.createTempFile(safePDBId, + "." + (PDBEntry.Type.MMCIF.toString().equals( + processingEntry.getType().toString()) ? "cif" + : "pdb")); + String fromUrl = processingEntry.getRetrievalUrl(); + UrlDownloadClient.download(fromUrl, tmpFile); + + // may not need this check ? + String file = tmpFile.getAbsolutePath(); + if (file != null) + { + pdbseq = EBIAlfaFold.importDownloadedStructureFromUrl(fromUrl, + tmpFile, pdbid, null, null, null); + } + } + else + { + pdbseq = pdbclient.getSequenceRecords(pdbid); + } + } } catch (Exception e) { System.err.println( @@ -1166,8 +1225,29 @@ public abstract class StructureViewerBase extends GStructureViewer */ public File saveSession() { - // TODO: a wait loop to ensure the file is written fully before returning? - return getBinding() == null ? null : getBinding().saveSession(); + if (getBinding() == null) + { + return null; + } + File session = getBinding().saveSession(); + long l = session.length(); + int wait = 50; + do + { + try + { + Thread.sleep(5); + } catch (InterruptedException e) + { + } + long nextl = session.length(); + if (nextl != l) + { + wait = 50; + l = nextl; + } + } while (--wait > 0); + return session; } /** @@ -1204,6 +1284,9 @@ public abstract class StructureViewerBase extends GStructureViewer } forceClose = confirm == JvOptionPane.YES_OPTION; } + } + if (binding != null) + { binding.closeViewer(forceClose); } setAlignmentPanel(null); @@ -1216,4 +1299,34 @@ public abstract class StructureViewerBase extends GStructureViewer dispose(); } + @Override + public void showHelp_actionPerformed() + { + /* + try + { + */ + String url = getBinding().getHelpURL(); + if (url != null) + { + BrowserLauncher.openURL(url); + } + /* + } + catch (IOException ex) + { + System.err + .println("Show " + getViewerName() + " failed with: " + + ex.getMessage()); + } + */ + } + + @Override + public boolean hasViewerActionsMenu() + { + return viewerActionMenu != null && viewerActionMenu.isEnabled() + && viewerActionMenu.getItemCount() > 0 + && viewerActionMenu.isVisible(); + } }