X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=7ab83110027f154e54f14a8bcd07f983e88dcd79;hb=1fea862e99e1fdd5eb85d5feaec2d28de58828b4;hp=b48a750e28477d92604383ce614ba00fec105636;hpb=5abaf9d49abf02d536fb657d33b3fcde91ddb42c;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index b48a750..7ab8311 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -74,6 +74,7 @@ import jalview.io.JalviewFileView; import jalview.io.JnetAnnotationMaker; import jalview.io.NewickFile; import jalview.io.TCoffeeScoreFile; +import jalview.io.gff.SequenceOntologyI; import jalview.jbgui.GAlignFrame; import jalview.schemes.Blosum62ColourScheme; import jalview.schemes.BuriedColourScheme; @@ -96,6 +97,8 @@ import jalview.schemes.ZappoColourScheme; import jalview.structure.StructureSelectionManager; import jalview.util.MessageManager; import jalview.viewmodel.AlignmentViewport; +import jalview.ws.DBRefFetcher; +import jalview.ws.DBRefFetcher.FetchFinishedListenerI; import jalview.ws.SequenceFetcher; import jalview.ws.jws1.Discoverer; import jalview.ws.jws2.Jws2Discoverer; @@ -110,13 +113,14 @@ import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; -import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyAdapter; @@ -464,6 +468,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { formatMenu.add(vsel); } + addFocusListener(new FocusAdapter() + { + @Override + public void focusGained(FocusEvent e) + { + Desktop.setCurrentAlignFrame(AlignFrame.this); + } + }); } @@ -909,10 +921,21 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .setSelected(av.getGlobalColourScheme() instanceof jalview.schemes.RNAHelicesColour); showProducts.setEnabled(canShowProducts()); + setGroovyEnabled(Desktop.getGroovyConsole() != null); updateEditMenuBar(); } + /** + * Set the enabled state of the 'Run Groovy' option in the Calculate menu + * + * @param b + */ + public void setGroovyEnabled(boolean b) + { + runGroovy.setEnabled(b); + } + private IProgressIndicator progressBar; /* @@ -1274,13 +1297,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, AlignmentI alignmentToExport = null; AlignExportSettingI settings = exportSettings; String[] omitHidden = null; - int[] alignmentStartEnd = new int[2]; HiddenSequences hiddenSeqs = viewport.getAlignment() .getHiddenSequences(); alignmentToExport = viewport.getAlignment(); - alignmentStartEnd = new int[] { 0, alignmentToExport.getWidth() - 1 }; boolean hasHiddenSeqs = hiddenSeqs.getSize() > 0; if (settings == null) @@ -1292,9 +1313,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (viewport.hasHiddenColumns() && !settings.isExportHiddenColumns()) { - omitHidden = viewport.getViewAsString(false); + omitHidden = viewport.getViewAsString(false, + settings.isExportHiddenSequences()); } + int[] alignmentStartEnd = new int[2]; if (hasHiddenSeqs && settings.isExportHiddenSequences()) { alignmentToExport = hiddenSeqs.getFullAlignment(); @@ -1302,64 +1325,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, else { alignmentToExport = viewport.getAlignment(); - alignmentStartEnd = getStartEnd(alignmentStartEnd, viewport - .getColumnSelection().getHiddenColumns()); } + alignmentStartEnd = alignmentToExport + .getVisibleStartAndEndIndex(viewport.getColumnSelection() + .getHiddenColumns()); AlignmentExportData ed = new AlignmentExportData(alignmentToExport, omitHidden, alignmentStartEnd, settings); return ed; } - public static int[] getStartEnd(int[] aligmentStartEnd, - List hiddenCols) - { - int startPos = aligmentStartEnd[0]; - int endPos = aligmentStartEnd[1]; - - int[] lowestRange = new int[] { -1, -1 }; - int[] higestRange = new int[] { -1, -1 }; - - for (int[] hiddenCol : hiddenCols) - { - lowestRange = (hiddenCol[0] <= startPos) ? hiddenCol : lowestRange; - higestRange = (hiddenCol[1] >= endPos) ? hiddenCol : higestRange; - } - - if (lowestRange[0] == -1 && lowestRange[1] == -1) - { - startPos = aligmentStartEnd[0]; - } - else - { - startPos = lowestRange[1] + 1; - } - - if (higestRange[0] == -1 && higestRange[1] == -1) - { - endPos = aligmentStartEnd[1]; - } - else - { - endPos = higestRange[0] - 1; - } - - // System.out.println("Export range : " + startPos + " - " + endPos); - return new int[] { startPos, endPos }; - } - - public static void main(String[] args) - { - ArrayList hiddenCols = new ArrayList(); - hiddenCols.add(new int[] { 0, 0 }); - hiddenCols.add(new int[] { 6, 9 }); - hiddenCols.add(new int[] { 11, 12 }); - hiddenCols.add(new int[] { 33, 33 }); - hiddenCols.add(new int[] { 50, 50 }); - - int[] x = getStartEnd(new int[] { 0, 50 }, hiddenCols); - // System.out.println("Export range : " + x[0] + " - " + x[1]); - } - /** * DOCUMENT ME! * @@ -3665,8 +3639,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void mousePressed(MouseEvent evt) { - if (evt.isControlDown() - || SwingUtilities.isRightMouseButton(evt)) + if (evt.isPopupTrigger()) { radioItem.removeActionListener(radioItem.getActionListeners()[0]); @@ -4170,7 +4143,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { JMenuItem tm = new JMenuItem(); ScoreModelI sm = ResidueProperties.scoreMatrices.get(pwtype); - if (sm.isProtein() == !viewport.getAlignment().isNucleotide()) + if (sm.isDNA() == viewport.getAlignment().isNucleotide() + || sm.isProtein() == !viewport.getAlignment() + .isNucleotide()) { String smn = MessageManager.getStringOrReturn( "label.score_model_", sm.getName()); @@ -4705,6 +4680,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return showp; } + /** + * Finds and displays cross-references for the selected sequences (protein + * products for nucleotide sequences, dna coding sequences for peptides). + * + * @param sel + * the sequences to show cross-references for + * @param dna + * true if from a nucleotide alignment (so showing proteins) + * @param source + * the database to show cross-references for + */ protected void showProductsFor(final SequenceI[] sel, final boolean dna, final String source) { @@ -4720,15 +4706,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, new Object[] { source }), sttime); try { - /* - * 'peer' sequences are any to add to this alignment, for example - * alternative protein products for my protein's gene - */ - List addedPeers = new ArrayList(); AlignmentI alignment = AlignFrame.this.getViewport() .getAlignment(); - Alignment xrefs = CrossRef.findXrefSequences(sel, dna, source, - alignment, addedPeers); + AlignmentI xrefs = CrossRef.findXrefSequences(sel, dna, source, + alignment); if (xrefs != null) { /* @@ -4742,146 +4723,153 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, AlignFrame newFrame = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT); + if (Cache.getDefault("HIDE_INTRONS", true)) + { + newFrame.hideFeatureColumns(SequenceOntologyI.EXON, false); + } String newtitle = String.format("%s %s %s", MessageManager.getString(dna ? "label.proteins" : "label.nucleotides"), MessageManager .getString("label.for"), getTitle()); newFrame.setTitle(newtitle); - boolean asSplitFrame = Cache.getDefault( - Preferences.ENABLE_SPLIT_FRAME, true); - if (asSplitFrame) + if (!Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, true)) { /* - * Make a copy of this alignment (sharing the same dataset - * sequences). If we are DNA, drop introns and update mappings + * split frame display is turned off in preferences file */ - AlignmentI copyAlignment = null; - final SequenceI[] sequenceSelection = AlignFrame.this.viewport - .getSequenceSelection(); - List cf = xrefs.getCodonFrames(); - if (dna) - { - copyAlignment = AlignmentUtils.makeCdsAlignment( - sequenceSelection, cf, alignment); - if (copyAlignment.getHeight() == 0) - { - System.err.println("Failed to make CDS alignment"); - } - al.getCodonFrames().clear(); - al.getCodonFrames().addAll(cf); - } - else + Desktop.addInternalFrame(newFrame, newtitle, DEFAULT_WIDTH, + DEFAULT_HEIGHT); + return; // via finally clause + } + + /* + * Make a copy of this alignment (sharing the same dataset + * sequences). If we are DNA, drop introns and update mappings + */ + AlignmentI copyAlignment = null; + final SequenceI[] sequenceSelection = AlignFrame.this.viewport + .getSequenceSelection(); + List cf = xrefs.getCodonFrames(); + boolean copyAlignmentIsAligned = false; + if (dna) + { + copyAlignment = AlignmentUtils.makeCdsAlignment( + sequenceSelection, cf, alignment); + if (copyAlignment.getHeight() == 0) { - copyAlignment = new Alignment(new Alignment( - sequenceSelection)); - copyAlignment.getCodonFrames().addAll(cf); + System.err.println("Failed to make CDS alignment"); } - copyAlignment.setGapCharacter(AlignFrame.this.viewport - .getGapCharacter()); - StructureSelectionManager ssm = StructureSelectionManager - .getStructureSelectionManager(Desktop.instance); - ssm.registerMappings(cf); + al.getCodonFrames().clear(); + al.addCodonFrames(copyAlignment.getCodonFrames()); + al.addCodonFrames(cf); /* - * add in any extra 'peer' sequences discovered - * (e.g. alternative protein products) + * pending getting Embl transcripts to 'align', + * we are only doing this for Ensembl */ - for (SequenceI peer : addedPeers) + // TODO proper criteria for 'can align as cdna' + if (DBRefSource.ENSEMBL.equalsIgnoreCase(source) + || AlignmentUtils.looksLikeEnsembl(alignment)) { - copyAlignment.addSequence(peer); + copyAlignment.alignAs(alignment); + copyAlignmentIsAligned = true; } + } + else + { + copyAlignment = AlignmentUtils.makeCopyAlignment( + sequenceSelection, xrefs.getSequencesArray()); + copyAlignment.addCodonFrames(cf); + al.addCodonFrames(copyAlignment.getCodonFrames()); + al.addCodonFrames(cf); + } + copyAlignment.setGapCharacter(AlignFrame.this.viewport + .getGapCharacter()); - if (copyAlignment.getHeight() > 0) - { - /* - * align protein to dna - */ - // FIXME what if the dna is not aligned :-O - if (dna) - { - al.alignAs(copyAlignment); - } - else - { - /* - * align cdna to protein - currently only if - * fetching and aligning Ensembl transcripts! - */ - if (DBRefSource.ENSEMBL.equalsIgnoreCase(source)) - { - copyAlignment.alignAs(al); - } - } + StructureSelectionManager ssm = StructureSelectionManager + .getStructureSelectionManager(Desktop.instance); + ssm.registerMappings(cf); - AlignFrame copyThis = new AlignFrame(copyAlignment, - AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); - copyThis.setTitle(AlignFrame.this.getTitle()); - - boolean showSequenceFeatures = viewport - .isShowSequenceFeatures(); - newFrame.setShowSeqFeatures(showSequenceFeatures); - copyThis.setShowSeqFeatures(showSequenceFeatures); - FeatureRenderer myFeatureStyling = alignPanel.getSeqPanel().seqCanvas - .getFeatureRenderer(); - - /* - * copy feature rendering settings to split frame - */ - newFrame.alignPanel.getSeqPanel().seqCanvas - .getFeatureRenderer().transferSettings( - myFeatureStyling); - copyThis.alignPanel.getSeqPanel().seqCanvas - .getFeatureRenderer().transferSettings( - myFeatureStyling); - - /* - * apply 'database source' feature configuration - * if any was found - */ - // TODO is this the feature colouring for the original - // alignment or the fetched xrefs? either could be Ensembl - newFrame.getViewport().applyFeaturesStyle( - featureColourScheme); - copyThis.getViewport().applyFeaturesStyle( - featureColourScheme); - - SplitFrame sf = new SplitFrame(dna ? copyThis : newFrame, - dna ? newFrame : copyThis); - newFrame.setVisible(true); - copyThis.setVisible(true); - String linkedTitle = MessageManager - .getString("label.linked_view_title"); - Desktop.addInternalFrame(sf, linkedTitle, -1, -1); - sf.adjustDivider(); - } + if (copyAlignment.getHeight() <= 0) + { + System.err.println("No Sequences generated for xRef type " + + source); + return; + } + /* + * align protein to dna + */ + if (dna && copyAlignmentIsAligned) + { + al.alignAs(copyAlignment); } else { - Desktop.addInternalFrame(newFrame, newtitle, DEFAULT_WIDTH, - DEFAULT_HEIGHT); + /* + * align cdna to protein - currently only if + * fetching and aligning Ensembl transcripts! + */ + if (DBRefSource.ENSEMBL.equalsIgnoreCase(source)) + { + copyAlignment.alignAs(al); + } } - } - else - { - System.err.println("No Sequences generated for xRef type " - + source); + + AlignFrame copyThis = new AlignFrame(copyAlignment, + AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); + copyThis.setTitle(AlignFrame.this.getTitle()); + + boolean showSequenceFeatures = viewport + .isShowSequenceFeatures(); + newFrame.setShowSeqFeatures(showSequenceFeatures); + copyThis.setShowSeqFeatures(showSequenceFeatures); + FeatureRenderer myFeatureStyling = alignPanel.getSeqPanel().seqCanvas + .getFeatureRenderer(); + + /* + * copy feature rendering settings to split frame + */ + newFrame.alignPanel.getSeqPanel().seqCanvas + .getFeatureRenderer() + .transferSettings(myFeatureStyling); + copyThis.alignPanel.getSeqPanel().seqCanvas + .getFeatureRenderer() + .transferSettings(myFeatureStyling); + + /* + * apply 'database source' feature configuration + * if any was found + */ + // TODO is this the feature colouring for the original + // alignment or the fetched xrefs? either could be Ensembl + newFrame.getViewport().applyFeaturesStyle(featureColourScheme); + copyThis.getViewport().applyFeaturesStyle(featureColourScheme); + + SplitFrame sf = new SplitFrame(dna ? copyThis : newFrame, + dna ? newFrame : copyThis); + newFrame.setVisible(true); + copyThis.setVisible(true); + String linkedTitle = MessageManager + .getString("label.linked_view_title"); + Desktop.addInternalFrame(sf, linkedTitle, -1, -1); + sf.adjustDivider(); } } catch (Exception e) { - jalview.bin.Cache.log.error( - "Exception when finding crossreferences", e); + Cache.log.error("Exception when finding crossreferences", e); } catch (OutOfMemoryError e) { new OOMWarning("whilst fetching crossreferences", e); - } catch (Error e) + } catch (Throwable e) { - jalview.bin.Cache.log.error("Error when finding crossreferences", - e); + Cache.log.error("Error when finding crossreferences", e); + } finally + { + AlignFrame.this.setProgressBar(MessageManager.formatMessage( + "status.finished_searching_for_sequences_from", + new Object[] { source }), sttime); } - AlignFrame.this.setProgressBar(MessageManager.formatMessage( - "status.finished_searching_for_sequences_from", - new Object[] { source }), sttime); } /** @@ -4932,23 +4920,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, frunner.start(); } - public boolean canShowTranslationProducts(SequenceI[] selection, - AlignmentI alignment) - { - // old way - try - { - return (jalview.analysis.Dna.canTranslate(selection, - viewport.getViewAsVisibleContigs(true))); - } catch (Exception e) - { - jalview.bin.Cache.log - .warn("canTranslate threw an exception - please report to help@jalview.org", - e); - return false; - } - } - /** * Construct and display a new frame containing the translation of this * frame's DNA sequences to their aligned protein (amino acid) equivalents. @@ -4970,7 +4941,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .getString("label.error_when_translating_sequences_submit_bug_report"); final String errorTitle = MessageManager .getString("label.implementation_error") - + MessageManager.getString("translation_failed"); + + MessageManager.getString("label.translation_failed"); JOptionPane.showMessageDialog(Desktop.desktop, msg, errorTitle, JOptionPane.ERROR_MESSAGE); return; @@ -5069,49 +5040,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void drop(DropTargetDropEvent evt) { Transferable t = evt.getTransferable(); - java.util.List files = null; + java.util.List files = new ArrayList(), protocols = new ArrayList(); try { - DataFlavor uriListFlavor = new DataFlavor( - "text/uri-list;class=java.lang.String"); - if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) - { - // Works on Windows and MacOSX - evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); - files = (java.util.List) t - .getTransferData(DataFlavor.javaFileListFlavor); - } - else if (t.isDataFlavorSupported(uriListFlavor)) - { - // This is used by Unix drag system - evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); - String data = (String) t.getTransferData(uriListFlavor); - files = new java.util.ArrayList(1); - for (java.util.StringTokenizer st = new java.util.StringTokenizer( - data, "\r\n"); st.hasMoreTokens();) - { - String s = st.nextToken(); - if (s.startsWith("#")) - { - // the line is a comment (as per the RFC 2483) - continue; - } - - java.net.URI uri = new java.net.URI(s); - // check to see if we can handle this kind of URI - if (uri.getScheme().toLowerCase().startsWith("http")) - { - files.add(uri.toString()); - } - else - { - // otherwise preserve old behaviour: catch all for file objects - java.io.File file = new java.io.File(uri); - files.add(file.toString()); - } - } - } + Desktop.transferFromDropTarget(files, protocols, evt, t); } catch (Exception e) { e.printStackTrace(); @@ -5437,7 +5370,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void tabbedPane_mousePressed(MouseEvent e) { - if (SwingUtilities.isRightMouseButton(e)) + if (e.isPopupTrigger()) { String msg = MessageManager.getString("label.enter_view_name"); String reply = JOptionPane.showInternalInputDialog(this, msg, msg, @@ -5570,16 +5503,23 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { new Thread(new Runnable() { - @Override public void run() { - boolean isNuclueotide = alignPanel.alignFrame.getViewport() + boolean isNucleotide = alignPanel.alignFrame.getViewport() .getAlignment().isNucleotide(); - new jalview.ws.DBRefFetcher(alignPanel.av + DBRefFetcher dbRefFetcher = new DBRefFetcher(alignPanel.av .getSequenceSelection(), alignPanel.alignFrame, null, - alignPanel.alignFrame.featureSettings, isNuclueotide) - .fetchDBRefs(false); + alignPanel.alignFrame.featureSettings, isNucleotide); + dbRefFetcher.addListener(new FetchFinishedListenerI() + { + @Override + public void finished() + { + AlignFrame.this.setMenusForViewport(); + } + }); + dbRefFetcher.fetchDBRefs(false); } }).start(); @@ -5647,14 +5587,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void run() { - boolean isNuclueotide = alignPanel.alignFrame + boolean isNucleotide = alignPanel.alignFrame .getViewport().getAlignment() .isNucleotide(); - new jalview.ws.DBRefFetcher(alignPanel.av - .getSequenceSelection(), + DBRefFetcher dbRefFetcher = new DBRefFetcher( + alignPanel.av.getSequenceSelection(), alignPanel.alignFrame, dassource, alignPanel.alignFrame.featureSettings, - isNuclueotide).fetchDBRefs(false); + isNucleotide); + dbRefFetcher + .addListener(new FetchFinishedListenerI() + { + @Override + public void finished() + { + AlignFrame.this.setMenusForViewport(); + } + }); + dbRefFetcher.fetchDBRefs(false); } }).start(); } @@ -5687,14 +5637,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void run() { - boolean isNuclueotide = alignPanel.alignFrame + boolean isNucleotide = alignPanel.alignFrame .getViewport().getAlignment() .isNucleotide(); - new jalview.ws.DBRefFetcher(alignPanel.av - .getSequenceSelection(), + DBRefFetcher dbRefFetcher = new DBRefFetcher( + alignPanel.av.getSequenceSelection(), alignPanel.alignFrame, dassource, alignPanel.alignFrame.featureSettings, - isNuclueotide).fetchDBRefs(false); + isNucleotide); + dbRefFetcher + .addListener(new FetchFinishedListenerI() + { + @Override + public void finished() + { + AlignFrame.this.setMenusForViewport(); + } + }); + dbRefFetcher.fetchDBRefs(false); } }).start(); } @@ -5742,14 +5702,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void run() { - boolean isNuclueotide = alignPanel.alignFrame + boolean isNucleotide = alignPanel.alignFrame .getViewport().getAlignment() .isNucleotide(); - new jalview.ws.DBRefFetcher(alignPanel.av - .getSequenceSelection(), + DBRefFetcher dbRefFetcher = new DBRefFetcher( + alignPanel.av.getSequenceSelection(), alignPanel.alignFrame, dassrc, alignPanel.alignFrame.featureSettings, - isNuclueotide).fetchDBRefs(false); + isNucleotide); + dbRefFetcher + .addListener(new FetchFinishedListenerI() + { + @Override + public void finished() + { + AlignFrame.this.setMenusForViewport(); + } + }); + dbRefFetcher.fetchDBRefs(false); } }).start(); } @@ -6107,15 +6077,75 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, try { Dna dna = new Dna(viewport, viewport.getViewAsVisibleContigs(true)); - al = dna.reverseCdna(complement); viewport.addAlignment(al, ""); + addHistoryItem(new EditCommand( + MessageManager.getString("label.add_sequences"), + Action.PASTE, al.getSequencesArray(), 0, al.getWidth(), + viewport.getAlignment())); } catch (Exception ex) { System.err.println(ex.getMessage()); return; } } + + /** + * Try to run a script in the Groovy console, having first ensured that this + * AlignFrame is set as currentAlignFrame in Desktop, to allow the script to + * be targeted at this alignment. + */ + @Override + protected void runGroovy_actionPerformed() + { + Desktop.setCurrentAlignFrame(this); + groovy.ui.Console console = Desktop.getGroovyConsole(); + if (console != null) + { + try + { + console.runScript(); + } catch (Exception ex) + { + System.err.println((ex.toString())); + JOptionPane + .showInternalMessageDialog(Desktop.desktop, MessageManager + .getString("label.couldnt_run_groovy_script"), + MessageManager + .getString("label.groovy_support_failed"), + JOptionPane.ERROR_MESSAGE); + } + } + else + { + System.err.println("Can't run Groovy script as console not found"); + } + } + + /** + * Hides columns containing (or not containing) a specified feature, provided + * that would not leave all columns hidden + * + * @param featureType + * @param columnsContaining + * @return + */ + public boolean hideFeatureColumns(String featureType, + boolean columnsContaining) + { + boolean notForHiding = avc.markColumnsContainingFeatures( + columnsContaining, false, false, featureType); + if (notForHiding) + { + if (avc.markColumnsContainingFeatures(!columnsContaining, false, + false, featureType)) + { + getViewport().hideSelectedColumns(); + return true; + } + } + return false; + } } class PrintThread extends Thread