JAL-1753 JAL-1596 JAL-1933 ensure AWT updates are on AWT thread
[jalview.git] / src / jalview / gui / JalviewChimeraBindingModel.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.gui;
22
23 import jalview.api.AlignmentViewPanel;
24 import jalview.api.structures.JalviewStructureDisplayI;
25 import jalview.datamodel.PDBEntry;
26 import jalview.datamodel.SequenceI;
27 import jalview.ext.rbvi.chimera.JalviewChimeraBinding;
28 import jalview.io.DataSourceType;
29 import jalview.structure.StructureSelectionManager;
30
31 import javax.swing.SwingUtilities;
32
33 public class JalviewChimeraBindingModel extends JalviewChimeraBinding
34 {
35   private ChimeraViewFrame cvf;
36
37   private FeatureRenderer fr = null;
38
39
40   public JalviewChimeraBindingModel(ChimeraViewFrame chimeraViewFrame,
41           StructureSelectionManager ssm, PDBEntry[] pdbentry,
42           SequenceI[][] sequenceIs, DataSourceType protocol)
43   {
44     super(ssm, pdbentry, sequenceIs, protocol);
45     cvf = chimeraViewFrame;
46   }
47
48   @Override
49   public FeatureRenderer getFeatureRenderer(AlignmentViewPanel alignment)
50   {
51     AlignmentPanel ap = (alignment == null) ? cvf.getAlignmentPanel()
52             : (AlignmentPanel) alignment;
53     if (ap.av.isShowSequenceFeatures())
54     {
55       if (fr == null)
56       {
57         fr = (jalview.gui.FeatureRenderer) ap.cloneFeatureRenderer();
58       }
59       else
60       {
61         ap.updateFeatureRenderer(fr);
62       }
63     }
64
65     return fr;
66   }
67
68   @Override
69   public jalview.api.SequenceRenderer getSequenceRenderer(
70           AlignmentViewPanel alignment)
71   {
72     return new SequenceRenderer(((AlignmentPanel) alignment).av);
73   }
74
75   @Override
76   public void refreshGUI()
77   {
78     javax.swing.SwingUtilities.invokeLater(new Runnable()
79     {
80       @Override
81       public void run()
82       {
83         cvf.updateTitleAndMenus();
84         cvf.revalidate();
85       }
86     });
87   }
88
89   @Override
90   public void updateColours(Object source)
91   {
92     AlignmentPanel ap = (AlignmentPanel) source;
93     // ignore events from panels not used to colour this view
94     if (!cvf.isUsedforcolourby(ap))
95     {
96       return;
97     }
98     if (!isLoadingFromArchive())
99     {
100       colourBySequence(ap.av.isShowSequenceFeatures(), ap);
101     }
102   }
103
104   @Override
105   public void releaseReferences(Object svl)
106   {
107   }
108
109   @Override
110   protected void releaseUIResources()
111   {
112   }
113
114   @Override
115   public void refreshPdbEntries()
116   {
117   }
118
119   /**
120    * Send an asynchronous command to Chimera, in a new thread, optionally with
121    * an 'in progress' message in a progress bar somewhere
122    */
123   @Override
124   protected void sendAsynchronousCommand(final String command,
125           final String progressMsg)
126   {
127     final long handle = progressMsg == null ? 0 : cvf
128             .startProgressBar(progressMsg);
129     SwingUtilities.invokeLater(new Runnable()
130     {
131       @Override
132       public void run()
133       {
134         try
135         {
136           sendChimeraCommand(command, false);
137         } finally
138         {
139           if (progressMsg != null)
140           {
141             cvf.stopProgressBar(null, handle);
142           }
143         }
144       }
145     });
146   }
147
148   @Override
149   public JalviewStructureDisplayI getViewer()
150   {
151     return cvf;
152   }
153 }