Clover icon

Coverage Report

  1. Project Clover database Thu Dec 4 2025 16:11:35 GMT
  2. Package jalview.gui

File PCAPanel.java

 

Coverage histogram

../../img/srcFileCovDistChart4.png
49% of files have more coverage

Code metrics

36
209
44
2
836
544
77
0.37
4.75
22
1.75

Classes

Class Line # Actions
PCAPanel 67 191 70
0.4176245341.8%
PCAPanel.PCAPrinter 386 18 7
0.00%
 

Contributing tests

This file is covered by 1 test. .

Source view

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 java.awt.BorderLayout;
24    import java.awt.Color;
25    import java.awt.Dimension;
26    import java.awt.Graphics;
27    import java.awt.event.ActionEvent;
28    import java.awt.event.ActionListener;
29    import java.awt.print.PageFormat;
30    import java.awt.print.Printable;
31    import java.awt.print.PrinterException;
32    import java.awt.print.PrinterJob;
33   
34    import javax.swing.ButtonGroup;
35    import javax.swing.JLabel;
36    import javax.swing.JMenuItem;
37    import javax.swing.JProgressBar;
38    import javax.swing.JRadioButtonMenuItem;
39    import javax.swing.SwingConstants;
40    import javax.swing.event.InternalFrameAdapter;
41    import javax.swing.event.InternalFrameEvent;
42   
43    import jalview.analysis.scoremodels.ScoreModels;
44    import jalview.api.AlignViewportI;
45    import jalview.api.analysis.ScoreModelI;
46    import jalview.api.analysis.SimilarityParamsI;
47    import jalview.bin.Console;
48    import jalview.datamodel.Alignment;
49    import jalview.datamodel.AlignmentI;
50    import jalview.datamodel.AlignmentView;
51    import jalview.datamodel.HiddenColumns;
52    import jalview.datamodel.SequenceI;
53    import jalview.gui.ImageExporter.ImageWriterI;
54    import jalview.gui.JalviewColourChooser.ColourChooserListener;
55    import jalview.io.exceptions.ImageOutputException;
56    import jalview.jbgui.GPCAPanel;
57    import jalview.math.RotatableMatrix.Axis;
58    import jalview.util.ImageMaker;
59    import jalview.util.MessageManager;
60    import jalview.util.Platform;
61    import jalview.viewmodel.AlignmentViewport;
62    import jalview.viewmodel.PCAModel;
63   
64    /**
65    * The panel holding the Principal Component Analysis 3-D visualisation
66    */
 
67    public class PCAPanel extends GPCAPanel
68    implements Runnable, IProgressIndicator
69    {
70    private static final int MIN_WIDTH = 470;
71   
72    private static final int MIN_HEIGHT = 250;
73   
74    private RotatableCanvas rc;
75   
76    AlignmentPanel ap;
77   
78    AlignmentViewport av;
79   
80    private PCAModel pcaModel;
81   
82    private int top = 0;
83   
84    private IProgressIndicator progressBar;
85   
86    private boolean working;
87   
88    String newPcaTitle = null;
89    /**
90    * Constructor given sequence data, a similarity (or distance) score model
91    * name, and score calculation parameters
92    *
93    * @param alignPanel
94    * @param modelName
95    * @param params
96    */
 
97  2 toggle public PCAPanel(AlignmentPanel alignPanel, String modelName,
98    SimilarityParamsI params)
99    {
100  2 super();
101  2 this.setFrameIcon(null);
102  2 this.av = alignPanel.av;
103  2 this.ap = alignPanel;
104  2 boolean nucleotide = av.getAlignment().isNucleotide();
105   
106  2 progressBar = new ProgressBar(statusPanel, statusBar);
107   
108  2 addInternalFrameListener(new InternalFrameAdapter()
109    {
 
110  2 toggle @Override
111    public void internalFrameClosed(InternalFrameEvent e)
112    {
113  2 close_actionPerformed();
114    }
115    });
116   
117  2 boolean selected = av.getSelectionGroup() != null
118    && av.getSelectionGroup().getSize() > 0;
119  2 AlignmentView seqstrings = av.getAlignmentView(selected);
120  2 SequenceI[] seqs;
121  2 if (!selected)
122    {
123  2 seqs = av.getAlignment().getSequencesArray();
124    }
125    else
126    {
127  0 seqs = av.getSelectionGroup().getSequencesInOrder(av.getAlignment());
128    }
129   
130  2 ScoreModelI scoreModel = ScoreModels.getInstance()
131    .getScoreModel(modelName, ap);
132  2 setPcaModel(
133    new PCAModel(seqstrings, seqs, nucleotide, scoreModel, params));
134   
135  2 newPcaTitle = alignPanel.alignFrame.formCalculationTitle(
136    MessageManager.formatMessage("label.calc_title", "PCA",
137    getPcaModel().getScoreModelName()),
138    selected, ap.alignFrame.getTitle());
139   
140  2 PaintRefresher.Register(this, av.getSequenceSetId());
141   
142  2 setRotatableCanvas(new RotatableCanvas(alignPanel));
143   
144  2 if (params.getSecondaryStructureSource() != null)
145    {
146    // Initialize and set subtitle text
147  0 JLabel subtitleLabel = new JLabel(
148    " Secondary Structure Provider : "
149    + params.getSecondaryStructureSource(),
150    SwingConstants.LEFT);
151  0 this.getContentPane().add(subtitleLabel, BorderLayout.NORTH);
152   
153    }
154  2 this.getContentPane().add(getRotatableCanvas(), BorderLayout.CENTER);
155   
156  2 addKeyListener(getRotatableCanvas());
157  2 validate();
158    }
159   
160    /**
161    * Ensure references to potentially very large objects (the PCA matrices) are
162    * nulled when the frame is closed
163    */
 
164  2 toggle protected void close_actionPerformed()
165    {
166  2 setPcaModel(null);
167  2 if (this.rc != null)
168    {
169  2 this.rc.sequencePoints = null;
170  2 this.rc.setAxisEndPoints(null);
171  2 this.rc = null;
172    }
173    }
174   
 
175  0 toggle @Override
176    protected void bgcolour_actionPerformed()
177    {
178  0 String ttl = MessageManager.getString("label.select_background_colour");
179  0 ColourChooserListener listener = new ColourChooserListener()
180    {
 
181  0 toggle @Override
182    public void colourSelected(Color c)
183    {
184  0 rc.setBgColour(c);
185  0 rc.repaint();
186    }
187    };
188  0 JalviewColourChooser.showColourChooser(this, ttl, rc.getBgColour(),
189    listener);
190    }
191   
192    /**
193    * Calculates the PCA and displays the results
194    */
 
195  1 toggle @Override
196    public void run()
197    {
198  1 working = true;
199  1 long progId = System.currentTimeMillis();
200  1 IProgressIndicator progress = this;
201  1 String message = MessageManager.getString("label.pca_recalculating");
202  1 if (getParent() == null)
203    {
204  1 progress = ap.alignFrame;
205  1 message = MessageManager.getString("label.pca_calculating");
206    }
207  1 progress.setProgressBar(message, progId);
208  1 try
209    {
210  1 getPcaModel().calculate();
211   
212  1 xCombobox.setSelectedIndex(0);
213  1 yCombobox.setSelectedIndex(1);
214  1 zCombobox.setSelectedIndex(2);
215   
216  1 getPcaModel().updateRc(getRotatableCanvas());
217    // rc.invalidate();
218  1 setTop(getPcaModel().getTop());
219   
220    } catch (OutOfMemoryError er)
221    {
222  0 new OOMWarning("calculating PCA", er);
223  0 working = false;
224  0 return;
225    } finally
226    {
227  1 progress.setProgressBar("", progId);
228    }
229   
230  1 repaint();
231  1 if (getParent() == null)
232    {
233  1 addToDesktop(this, newPcaTitle);
234  1 this.setMinimumSize(new Dimension(MIN_WIDTH, MIN_HEIGHT));
235    }
236  1 working = false;
237    }
238   
239    /**
240    * Updates the PCA display after a change of component to use for x, y or z
241    * axis
242    */
 
243  12 toggle @Override
244    protected void doDimensionChange()
245    {
246  12 if (getTop() == 0)
247    {
248  12 return;
249    }
250   
251  0 int dim1 = getTop() - xCombobox.getSelectedIndex();
252  0 int dim2 = getTop() - yCombobox.getSelectedIndex();
253  0 int dim3 = getTop() - zCombobox.getSelectedIndex();
254  0 getPcaModel().updateRcView(dim1, dim2, dim3);
255  0 getRotatableCanvas().resetView();
256    }
257   
258    /**
259    * Sets the selected checkbox item index for PCA dimension (1, 2, 3...) for
260    * the given axis (X/Y/Z)
261    *
262    * @param index
263    * @param axis
264    */
 
265  3 toggle public void setSelectedDimensionIndex(int index, Axis axis)
266    {
267  3 switch (axis)
268    {
269  1 case X:
270  1 xCombobox.setSelectedIndex(index);
271  1 break;
272  1 case Y:
273  1 yCombobox.setSelectedIndex(index);
274  1 break;
275  1 case Z:
276  1 zCombobox.setSelectedIndex(index);
277  1 break;
278  0 default:
279    }
280    }
281   
 
282  0 toggle @Override
283    protected void outputValues_actionPerformed()
284    {
285  0 CutAndPasteTransfer cap = new CutAndPasteTransfer();
286  0 try
287    {
288  0 cap.setText(getPcaModel().getDetails());
289  0 Desktop.addInternalFrame(cap,
290    MessageManager.getString("label.pca_details"), 500, 500);
291    } catch (OutOfMemoryError oom)
292    {
293  0 new OOMWarning("opening PCA details", oom);
294  0 cap.dispose();
295    }
296    }
297   
 
298  0 toggle @Override
299    protected void showLabels_actionPerformed()
300    {
301  0 getRotatableCanvas().showLabels(showLabels.getState());
302    }
303   
 
304  0 toggle @Override
305    protected void print_actionPerformed()
306    {
307  0 PCAPrinter printer = new PCAPrinter();
308  0 printer.start();
309    }
310   
311    /**
312    * If available, shows the data which formed the inputs for the PCA as a new
313    * alignment
314    */
 
315  0 toggle @Override
316    public void originalSeqData_actionPerformed()
317    {
318    // JAL-2647 disabled after load from project (until save to project done)
319  0 if (getPcaModel().getInputData() == null)
320    {
321  0 Console.info(
322    "Unexpected call to originalSeqData_actionPerformed - should have hidden this menu action.");
323  0 return;
324    }
325    // decide if av alignment is sufficiently different to original data to
326    // warrant a new window to be created
327    // create new alignment window with hidden regions (unhiding hidden regions
328    // yields unaligned seqs)
329    // or create a selection box around columns in alignment view
330    // test Alignment(SeqCigar[])
331  0 char gc = '-';
332  0 try
333    {
334    // we try to get the associated view's gap character
335    // but this may fail if the view was closed...
336  0 gc = av.getGapCharacter();
337    } catch (Exception ex)
338    {
339    }
340   
341  0 Object[] alAndColsel = getPcaModel().getInputData()
342    .getAlignmentAndHiddenColumns(gc);
343   
344  0 if (alAndColsel != null && alAndColsel[0] != null)
345    {
346    // AlignmentOrder origorder = new AlignmentOrder(alAndColsel[0]);
347   
348  0 AlignmentI al = new Alignment((SequenceI[]) alAndColsel[0]);
349  0 AlignmentI dataset = (av != null && av.getAlignment() != null)
350    ? av.getAlignment().getDataset()
351    : null;
352  0 if (dataset != null)
353    {
354  0 al.setDataset(dataset);
355    }
356   
357  0 if (true)
358    {
359    // make a new frame!
360  0 AlignFrame af = new AlignFrame(al, (HiddenColumns) alAndColsel[1],
361    AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
362   
363    // >>>This is a fix for the moment, until a better solution is
364    // found!!<<<
365    // af.getFeatureRenderer().transferSettings(alignFrame.getFeatureRenderer());
366   
367    // af.addSortByOrderMenuItem(ServiceName + " Ordering",
368    // msaorder);
369   
370  0 Desktop.addInternalFrame(af, MessageManager.formatMessage(
371    "label.original_data_for_params", new String[]
372    { this.title }), AlignFrame.DEFAULT_WIDTH,
373    AlignFrame.DEFAULT_HEIGHT);
374    }
375    }
376    /*
377    * CutAndPasteTransfer cap = new CutAndPasteTransfer(); for (int i = 0; i <
378    * seqs.length; i++) { cap.appendText(new jalview.util.Format("%-" + 15 +
379    * "s").form( seqs[i].getName())); cap.appendText(" " + seqstrings[i] +
380    * "\n"); }
381    *
382    * Desktop.addInternalFrame(cap, "Original Data", 400, 400);
383    */
384    }
385   
 
386    class PCAPrinter extends Thread implements Printable
387    {
 
388  0 toggle @Override
389    public void run()
390    {
391  0 PrinterJob printJob = PrinterJob.getPrinterJob();
392  0 PageFormat defaultPage = printJob.defaultPage();
393  0 PageFormat pf = printJob.pageDialog(defaultPage);
394   
395  0 if (defaultPage == pf)
396    {
397    /*
398    * user cancelled
399    */
400  0 return;
401    }
402   
403  0 printJob.setPrintable(this, pf);
404   
405  0 if (printJob.printDialog())
406    {
407  0 try
408    {
409  0 printJob.print();
410    } catch (Exception PrintException)
411    {
412  0 PrintException.printStackTrace();
413    }
414    }
415    }
416   
 
417  0 toggle @Override
418    public int print(Graphics pg, PageFormat pf, int pi)
419    throws PrinterException
420    {
421  0 pg.translate((int) pf.getImageableX(), (int) pf.getImageableY());
422   
423  0 getRotatableCanvas().drawBackground(pg);
424  0 getRotatableCanvas().drawScene(pg);
425  0 if (getRotatableCanvas().drawAxes)
426    {
427  0 getRotatableCanvas().drawAxes(pg);
428    }
429   
430  0 if (pi == 0)
431    {
432  0 return Printable.PAGE_EXISTS;
433    }
434    else
435    {
436  0 return Printable.NO_SUCH_PAGE;
437    }
438    }
439    }
440   
 
441  0 toggle public void makePCAImage(ImageMaker.TYPE type)
442    {
443  0 int width = getRotatableCanvas().getWidth();
444  0 int height = getRotatableCanvas().getHeight();
445  0 ImageWriterI writer = new ImageWriterI()
446    {
 
447  0 toggle @Override
448    public void exportImage(Graphics g) throws Exception
449    {
450  0 RotatableCanvas canvas = getRotatableCanvas();
451  0 canvas.drawBackground(g);
452  0 canvas.drawScene(g);
453  0 if (canvas.drawAxes)
454    {
455  0 canvas.drawAxes(g);
456    }
457    }
458    };
459  0 String pca = MessageManager.getString("label.pca");
460  0 ImageExporter exporter = new ImageExporter(writer, null, type, pca);
461  0 try
462    {
463  0 exporter.doExport(null, this, width, height, pca);
464    } catch (ImageOutputException ioex)
465    {
466  0 Console.error("Unexpected error whilst writing " + type.toString(),
467    ioex);
468    }
469    }
470   
 
471  0 toggle @Override
472    protected void viewMenu_menuSelected()
473    {
474  0 buildAssociatedViewMenu();
475    }
476   
477    /**
478    * Builds the menu showing the choice of possible views (for the associated
479    * sequence data) to which the PCA may be linked
480    */
 
481  0 toggle void buildAssociatedViewMenu()
482    {
483  0 AlignmentPanel[] aps = PaintRefresher
484    .getAssociatedPanels(av.getSequenceSetId());
485  0 if (aps.length == 1 && getRotatableCanvas().av == aps[0].av)
486    {
487  0 associateViewsMenu.setVisible(false);
488  0 return;
489    }
490   
491  0 associateViewsMenu.setVisible(true);
492   
493  0 if ((viewMenu
494    .getItem(viewMenu.getItemCount() - 2) instanceof JMenuItem))
495    {
496  0 viewMenu.insertSeparator(viewMenu.getItemCount() - 1);
497    }
498   
499  0 associateViewsMenu.removeAll();
500   
501  0 JRadioButtonMenuItem item;
502  0 ButtonGroup buttonGroup = new ButtonGroup();
503  0 int iSize = aps.length;
504   
505  0 for (int i = 0; i < iSize; i++)
506    {
507  0 final AlignmentPanel panel = aps[i];
508  0 item = new JRadioButtonMenuItem(panel.av.getViewName(),
509    panel.av == getRotatableCanvas().av);
510  0 buttonGroup.add(item);
511  0 item.addActionListener(new ActionListener()
512    {
 
513  0 toggle @Override
514    public void actionPerformed(ActionEvent evt)
515    {
516  0 selectAssociatedView(panel);
517    }
518    });
519   
520  0 associateViewsMenu.add(item);
521    }
522   
523  0 final JRadioButtonMenuItem itemf = new JRadioButtonMenuItem(
524    "All Views");
525   
526  0 buttonGroup.add(itemf);
527   
528  0 itemf.setSelected(getRotatableCanvas().isApplyToAllViews());
529  0 itemf.addActionListener(new ActionListener()
530    {
 
531  0 toggle @Override
532    public void actionPerformed(ActionEvent evt)
533    {
534  0 getRotatableCanvas().setApplyToAllViews(itemf.isSelected());
535    }
536    });
537  0 associateViewsMenu.add(itemf);
538   
539    }
540   
541    /*
542    * (non-Javadoc)
543    *
544    * @see
545    * jalview.jbgui.GPCAPanel#outputPoints_actionPerformed(java.awt.event.ActionEvent
546    * )
547    */
 
548  0 toggle @Override
549    protected void outputPoints_actionPerformed()
550    {
551  0 CutAndPasteTransfer cap = new CutAndPasteTransfer();
552  0 try
553    {
554  0 cap.setText(getPcaModel().getPointsasCsv(false,
555    xCombobox.getSelectedIndex(), yCombobox.getSelectedIndex(),
556    zCombobox.getSelectedIndex()));
557  0 Desktop.addInternalFrame(cap, MessageManager
558    .formatMessage("label.points_for_params", new String[]
559    { this.getTitle() }), 500, 500);
560    } catch (OutOfMemoryError oom)
561    {
562  0 new OOMWarning("exporting PCA points", oom);
563  0 cap.dispose();
564    }
565    }
566   
567    /*
568    * (non-Javadoc)
569    *
570    * @see
571    * jalview.jbgui.GPCAPanel#outputProjPoints_actionPerformed(java.awt.event
572    * .ActionEvent)
573    */
 
574  0 toggle @Override
575    protected void outputProjPoints_actionPerformed()
576    {
577  0 CutAndPasteTransfer cap = new CutAndPasteTransfer();
578  0 try
579    {
580  0 cap.setText(getPcaModel().getPointsasCsv(true,
581    xCombobox.getSelectedIndex(), yCombobox.getSelectedIndex(),
582    zCombobox.getSelectedIndex()));
583  0 Desktop.addInternalFrame(cap, MessageManager.formatMessage(
584    "label.transformed_points_for_params", new String[]
585    { this.getTitle() }), 500, 500);
586    } catch (OutOfMemoryError oom)
587    {
588  0 new OOMWarning("exporting transformed PCA points", oom);
589  0 cap.dispose();
590    }
591    }
592   
593    /*
594    * (non-Javadoc)
595    *
596    * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long)
597    */
 
598  0 toggle @Override
599    public void setProgressBar(String message, long id)
600    {
601  0 progressBar.setProgressBar(message, id);
602    // if (progressBars == null)
603    // {
604    // progressBars = new Hashtable();
605    // progressBarHandlers = new Hashtable();
606    // }
607    //
608    // JPanel progressPanel;
609    // Long lId = Long.valueOf(id);
610    // GridLayout layout = (GridLayout) statusPanel.getLayout();
611    // if (progressBars.get(lId) != null)
612    // {
613    // progressPanel = (JPanel) progressBars.get(Long.valueOf(id));
614    // statusPanel.remove(progressPanel);
615    // progressBars.remove(lId);
616    // progressPanel = null;
617    // if (message != null)
618    // {
619    // statusBar.setText(message);
620    // }
621    // if (progressBarHandlers.contains(lId))
622    // {
623    // progressBarHandlers.remove(lId);
624    // }
625    // layout.setRows(layout.getRows() - 1);
626    // }
627    // else
628    // {
629    // progressPanel = new JPanel(new BorderLayout(10, 5));
630    //
631    // JProgressBar progressBar = new JProgressBar();
632    // progressBar.setIndeterminate(true);
633    //
634    // progressPanel.add(new JLabel(message), BorderLayout.WEST);
635    // progressPanel.add(progressBar, BorderLayout.CENTER);
636    //
637    // layout.setRows(layout.getRows() + 1);
638    // statusPanel.add(progressPanel);
639    //
640    // progressBars.put(lId, progressPanel);
641    // }
642    // // update GUI
643    // // setMenusForViewport();
644    // validate();
645    }
646   
 
647  0 toggle @Override
648    public void addProgressBar(long id, String message)
649    {
650  0 progressBar.addProgressBar(id, message);
651    }
652   
 
653  0 toggle @Override
654    public void removeProgressBar(long id)
655    {
656  0 progressBar.removeProgressBar(id);
657    }
658   
 
659  0 toggle @Override
660    public void registerHandler(final long id,
661    final IProgressIndicatorHandler handler)
662    {
663  0 progressBar.registerHandler(id, handler);
664    // if (progressBarHandlers == null ||
665    // !progressBars.contains(Long.valueOf(id)))
666    // {
667    // throw new
668    // Error(MessageManager.getString("error.call_setprogressbar_before_registering_handler"));
669    // }
670    // progressBarHandlers.put(Long.valueOf(id), handler);
671    // final JPanel progressPanel = (JPanel) progressBars.get(Long.valueOf(id));
672    // if (handler.canCancel())
673    // {
674    // JButton cancel = new JButton(
675    // MessageManager.getString("action.cancel"));
676    // final IProgressIndicator us = this;
677    // cancel.addActionListener(new ActionListener()
678    // {
679    //
680    // @Override
681    // public void actionPerformed(ActionEvent e)
682    // {
683    // handler.cancelActivity(id);
684    // us.setProgressBar(MessageManager.formatMessage("label.cancelled_params",
685    // new String[]{((JLabel) progressPanel.getComponent(0)).getText()}), id);
686    // }
687    // });
688    // progressPanel.add(cancel, BorderLayout.EAST);
689    // }
690    }
691   
692    /**
693    *
694    * @return true if any progress bars are still active
695    */
 
696  0 toggle @Override
697    public boolean operationInProgress()
698    {
699  0 return progressBar.operationInProgress();
700    }
701   
 
702  0 toggle @Override
703    protected void resetButton_actionPerformed()
704    {
705  0 int t = getTop();
706  0 setTop(0); // ugly - prevents dimensionChanged events from being processed
707  0 xCombobox.setSelectedIndex(0);
708  0 yCombobox.setSelectedIndex(1);
709  0 setTop(t);
710  0 zCombobox.setSelectedIndex(2);
711    }
712   
713    /**
714    * Answers true if PCA calculation is in progress, else false
715    *
716    * @return
717    */
 
718  0 toggle public boolean isWorking()
719    {
720  0 return working;
721    }
722   
723    /**
724    * Answers the selected checkbox item index for PCA dimension for the X, Y or
725    * Z axis of the display
726    *
727    * @param axis
728    * @return
729    */
 
730  3 toggle public int getSelectedDimensionIndex(Axis axis)
731    {
732  3 switch (axis)
733    {
734  1 case X:
735  1 return xCombobox.getSelectedIndex();
736  1 case Y:
737  1 return yCombobox.getSelectedIndex();
738  1 default:
739  1 return zCombobox.getSelectedIndex();
740    }
741    }
742   
 
743  1 toggle public void setShowLabels(boolean show)
744    {
745  1 showLabels.setSelected(show);
746    }
747   
748    /**
749    * Sets the input data used to calculate the PCA. This is provided for
750    * 'restore from project', which does not currently support this (AL-2647), so
751    * sets the value to null, and hides the menu option for "Input Data...". J
752    *
753    * @param data
754    */
 
755  1 toggle public void setInputData(AlignmentView data)
756    {
757  1 getPcaModel().setInputData(data);
758  1 originalSeqData.setVisible(data != null);
759    }
760   
 
761  8 toggle public AlignViewportI getAlignViewport()
762    {
763  8 return av;
764    }
765   
 
766  10 toggle public PCAModel getPcaModel()
767    {
768  10 return pcaModel;
769    }
770   
 
771  4 toggle public void setPcaModel(PCAModel pcaModel)
772    {
773  4 this.pcaModel = pcaModel;
774    }
775   
 
776  24 toggle public RotatableCanvas getRotatableCanvas()
777    {
778  24 return rc;
779    }
780   
 
781  2 toggle public void setRotatableCanvas(RotatableCanvas rc)
782    {
783  2 this.rc = rc;
784    }
785   
 
786  12 toggle public int getTop()
787    {
788  12 return top;
789    }
790   
 
791  2 toggle public void setTop(int top)
792    {
793  2 this.top = top;
794    }
795   
796    /**
797    * set the associated view for this PCA.
798    *
799    * @param panel
800    */
 
801  1 toggle public void selectAssociatedView(AlignmentPanel panel)
802    {
803  1 getRotatableCanvas().setApplyToAllViews(false);
804   
805  1 ap = panel;
806  1 av = panel.av;
807   
808  1 getRotatableCanvas().av = panel.av;
809  1 getRotatableCanvas().ap = panel;
810  1 PaintRefresher.Register(PCAPanel.this, panel.av.getSequenceSetId());
811    }
812   
 
813  0 toggle @Override
814    public JProgressBar getProgressBar(long id)
815    {
816  0 return progressBar.getProgressBar(id);
817    }
818   
 
819  0 toggle public String getMessage(long id)
820    {
821  0 return progressBar.getMessage(id);
822    }
823   
 
824  0 toggle public void setProgressBarMessage(long id, String message)
825    {
826  0 progressBar.setProgressBarMessage(id, message);
827    }
828   
 
829  1 toggle public static void addToDesktop(PCAPanel panel, String modelName)
830    {
831  1 Dimension dim = Platform.getDimIfEmbedded(panel, 475, 450);
832  1 Desktop.addInternalFrame(panel, MessageManager.formatMessage(
833    "label.calc_title", "PCA", modelName), dim.width,
834    dim.height);
835    }
836    }