diff --git a/CoreComponentInterfaces/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataContentViewer.java b/CoreComponentInterfaces/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataContentViewer.java index f77479e6ea..d1d0204545 100644 --- a/CoreComponentInterfaces/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataContentViewer.java +++ b/CoreComponentInterfaces/src/org/sleuthkit/autopsy/corecomponentinterfaces/DataContentViewer.java @@ -74,8 +74,11 @@ public interface DataContentViewer { * @param node Node to check for preference * @param isSupported, true if the viewer is supported by the node * as determined by a previous check - * @return True if viewer preferred, else false + * @return an int (0-10) higher return means the viewer has higher priority + * 0 means not supported + * 1/2 means will display all supported + * 3-10 are prioritized by Content viewer developer */ - public boolean isPreferred(Node node, boolean isSupported); + public int isPreferred(Node node, boolean isSupported); } diff --git a/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentTopComponent.java b/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentTopComponent.java index 77e4781b19..887d1c1287 100755 --- a/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentTopComponent.java +++ b/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentTopComponent.java @@ -98,7 +98,7 @@ public final class DataContentTopComponent extends TopComponent implements DataC return this.wrapped.isSupported(node); } - boolean isPreferred(Node node, boolean isSupported) { + int isPreferred(Node node, boolean isSupported) { return this.wrapped.isPreferred(node, isSupported); } } @@ -293,17 +293,10 @@ public final class DataContentTopComponent extends TopComponent implements DataC int totalTabs = dataContentTabbedPane.getTabCount(); - List dcvs = new ArrayList(); - dcvs.addAll(Lookup.getDefault().lookupAll(DataContentViewer.class)); - for (int i = 0; i i){ - dataContentTabbedPane.setSelectedIndex(i); - } - } + int maxPreferred = 0; + int indexOfPreferred = 0; if (totalTabs > 0) { // make sure there are tabs to reset - int tempIndex = dataContentTabbedPane.getSelectedIndex(); for (int i = 0; i < totalTabs; i++) { UpdateWrapper dcv = viewers.get(i); dcv.resetComponent(); @@ -312,25 +305,19 @@ public final class DataContentTopComponent extends TopComponent implements DataC boolean dcvSupported = dcv.isSupported(selectedNode); if (! dcvSupported) { dataContentTabbedPane.setEnabledAt(i, false); - - // change the tab selection if it's the current selection - if (tempIndex == i) { - if (i > 0) { - dataContentTabbedPane.setSelectedIndex(0); - } else { - dataContentTabbedPane.setSelectedIndex(1); - } - } } else { dataContentTabbedPane.setEnabledAt(i, true); - if (dcv.isPreferred(selectedNode, dcvSupported)) - dataContentTabbedPane.setSelectedIndex(i); + int currentPreferred = dcv.isPreferred(selectedNode, dcvSupported); + if (currentPreferred > maxPreferred) { + indexOfPreferred = i; + maxPreferred = currentPreferred; + } } } - int newIndex = dataContentTabbedPane.getSelectedIndex(); // set the display of the tab - viewers.get(newIndex).setNode(selectedNode); + dataContentTabbedPane.setSelectedIndex(indexOfPreferred); + viewers.get(indexOfPreferred).setNode(selectedNode); } } diff --git a/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerArtifact.java b/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerArtifact.java index b49113ca7c..901f901446 100644 --- a/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerArtifact.java +++ b/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerArtifact.java @@ -46,7 +46,7 @@ import org.sleuthkit.datamodel.TskException; /** * Viewer displays Artifacts associated with Contents */ -@ServiceProvider(service = DataContentViewer.class) +@ServiceProvider(service = DataContentViewer.class, position=3) public class DataContentViewerArtifact extends javax.swing.JPanel implements DataContentViewer{ private static int currentPage = 1; @@ -314,12 +314,17 @@ public class DataContentViewerArtifact extends javax.swing.JPanel implements Dat } @Override - public boolean isPreferred(Node node, boolean isSupported) { + public int isPreferred(Node node, boolean isSupported) { BlackboardArtifact art = node.getLookup().lookup(BlackboardArtifact.class); - if(art != null && art.getArtifactTypeID() != BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()) - return true; - else - return false; + if(isSupported) { + if(art == null) { + return 3; + } else { + return 5; + } + } else { + return 0; + } } private void customizeComponents(){ diff --git a/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.java b/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.java index 0416cdee81..2ae5e98be6 100644 --- a/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.java +++ b/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerHex.java @@ -39,7 +39,7 @@ import org.sleuthkit.datamodel.TskException; /** * Hex view of file contents. */ -@ServiceProvider(service = DataContentViewer.class) +@ServiceProvider(service = DataContentViewer.class, position=1) public class DataContentViewerHex extends javax.swing.JPanel implements DataContentViewer { private static long currentOffset = 0; @@ -257,7 +257,7 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont private void goToPageTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_goToPageTextFieldActionPerformed String pageNumberStr = goToPageTextField.getText(); int pageNumber = 0; - int maxPage = (int) (dataSource.getSize() / pageLength) + 1; + int maxPage = Math.round(dataSource.getSize() / pageLength); try { pageNumber = Integer.parseInt(pageNumberStr); } catch (NumberFormatException ex) { @@ -333,7 +333,7 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont } if (setVisible) { - int totalPage = (int) (dataSource.getSize() / pageLength) + 1; + int totalPage = Math.round(dataSource.getSize() / pageLength); totalPageLabel.setText(Integer.toString(totalPage)); currentPageLabel.setText(Integer.toString(currentPage)); setComponentsVisibility(true); // shows the components that not needed @@ -361,6 +361,10 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont @Override public void setNode(Node selectedNode) { + if(!isSupported(selectedNode)) { + setDataView(null, 0, true); + return; + } if (selectedNode != null) { Content content = (selectedNode).getLookup().lookup(Content.class); if (content != null) { @@ -413,6 +417,8 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont nextPageButton.setVisible(isVisible); pageLabel.setVisible(isVisible); pageLabel2.setVisible(isVisible); + goToPageTextField.setVisible(isVisible); + goToPageLabel.setVisible(isVisible); } @Override @@ -430,8 +436,12 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont } @Override - public boolean isPreferred(Node node, boolean isSupported) { - return false; + public int isPreferred(Node node, boolean isSupported) { + if(isSupported) { + return 1; + } else { + return 0; + } } @Override diff --git a/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerMedia.java b/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerMedia.java index 70e5362f63..c92deeca35 100644 --- a/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerMedia.java +++ b/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerMedia.java @@ -45,7 +45,7 @@ import org.sleuthkit.datamodel.TskData; * * @author dfickling */ -@ServiceProvider(service = DataContentViewer.class) +@ServiceProvider(service = DataContentViewer.class, position=5) public class DataContentViewerMedia extends javax.swing.JPanel implements DataContentViewer { private static final String[] IMAGES = new String[]{ ".jpg", ".jpeg", ".png", ".gif", ".jpe", ".bmp"}; @@ -172,6 +172,9 @@ public class DataContentViewerMedia extends javax.swing.JPanel implements DataCo } File file = selectedNode.getLookup().lookup(File.class); setDataView(file); + if(file == null) { + return; + } boolean isVidOrAud = containsExt(file.getName(), VIDEOS) || containsExt(file.getName(), AUDIOS); pauseButton.setVisible(isVidOrAud); progressLabel.setVisible(isVidOrAud); @@ -179,8 +182,12 @@ public class DataContentViewerMedia extends javax.swing.JPanel implements DataCo } private void setDataView(File file) { - if(file == null) + if(file == null) { + setComponentsVisibility(false); return; + } else { + setComponentsVisibility(true); + } this.currentFile = file; if (containsExt(file.getName(), IMAGES)) { @@ -196,6 +203,17 @@ public class DataContentViewerMedia extends javax.swing.JPanel implements DataCo playbin2.play(); } } + /** + * To set the visibility of specific components in this class. + * + * @param isVisible whether to show or hide the specific components + */ + private void setComponentsVisibility(boolean isVisible) { + pauseButton.setVisible(isVisible); + progressLabel.setVisible(isVisible); + progressSlider.setVisible(isVisible); + videoPanel.setVisible(isVisible); + } @Override public String getTitle() { @@ -283,8 +301,12 @@ public class DataContentViewerMedia extends javax.swing.JPanel implements DataCo } @Override - public boolean isPreferred(Node node, boolean isSupported) { - return isSupported; + public int isPreferred(Node node, boolean isSupported) { + if(isSupported) { + return 7; + } else { + return 0; + } } private static boolean containsExt(String name, String[] exts) { diff --git a/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerPicture.java b/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerPicture.java index e4bc39c99c..36ca063420 100644 --- a/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerPicture.java +++ b/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerPicture.java @@ -178,8 +178,12 @@ public class DataContentViewerPicture extends javax.swing.JPanel implements Data } @Override - public boolean isPreferred(Node node, boolean isSupported) { - return isSupported; + public int isPreferred(Node node, boolean isSupported) { + if(isSupported) { + return 1; + } else { + return 0; + } } @Override diff --git a/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerString.java b/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerString.java index 1da7c206e0..7b874a7014 100644 --- a/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerString.java +++ b/CoreComponents/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerString.java @@ -40,7 +40,7 @@ import org.sleuthkit.datamodel.TskException; /** * Viewer displays strings extracted from contents. */ -@ServiceProvider(service = DataContentViewer.class) +@ServiceProvider(service = DataContentViewer.class, position=2) public class DataContentViewerString extends javax.swing.JPanel implements DataContentViewer { private static long currentOffset = 0; @@ -241,7 +241,7 @@ public class DataContentViewerString extends javax.swing.JPanel implements DataC private void goToPageTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_goToPageTextFieldActionPerformed String pageNumberStr = goToPageTextField.getText(); int pageNumber = 0; - int maxPage = (int) (dataSource.getSize() / pageLength) + 1; + int maxPage = Math.round(dataSource.getSize() / pageLength); try { pageNumber = Integer.parseInt(pageNumberStr); } catch (NumberFormatException ex) { @@ -320,7 +320,7 @@ public class DataContentViewerString extends javax.swing.JPanel implements DataC } if (setVisible) { - int totalPage = (int) (dataSource.getSize() / pageLength) + 1; + int totalPage = Math.round(dataSource.getSize() / pageLength); totalPageLabel.setText(Integer.toString(totalPage)); currentPageLabel.setText(Integer.toString(currentPage)); outputViewPane.setText(text); // set the output view @@ -355,10 +355,16 @@ public class DataContentViewerString extends javax.swing.JPanel implements DataC nextPageButton.setVisible(isVisible); pageLabel.setVisible(isVisible); pageLabel2.setVisible(isVisible); + goToPageTextField.setVisible(isVisible); + goToPageLabel.setVisible(isVisible); } @Override public void setNode(Node selectedNode) { + if(!isSupported(selectedNode)) { + setDataView(null, 0, true); + return; + } if (selectedNode != null) { Lookup lookup = selectedNode.getLookup(); Content content = lookup.lookup(Content.class); @@ -421,14 +427,12 @@ public class DataContentViewerString extends javax.swing.JPanel implements DataC } @Override - public boolean isPreferred(Node node, boolean isSupported) { + public int isPreferred(Node node, boolean isSupported) { if(node != null && isSupported){ - StringContent scontent = node.getLookup().lookup(StringContent.class); - if(scontent != null){ - return true; - } + return 2; + } else { + return 0; } - return false; } @Override diff --git a/DataModel/src/org/sleuthkit/autopsy/datamodel/AbstractFsContentNode.java b/DataModel/src/org/sleuthkit/autopsy/datamodel/AbstractFsContentNode.java index d9d85c4327..f406fc3929 100644 --- a/DataModel/src/org/sleuthkit/autopsy/datamodel/AbstractFsContentNode.java +++ b/DataModel/src/org/sleuthkit/autopsy/datamodel/AbstractFsContentNode.java @@ -186,6 +186,7 @@ public abstract class AbstractFsContentNode extends Abstrac // selecting a file filter (e.g. 'type' or 'recent'), it is false AbstractFsContentNode(T fsContent, boolean directoryBrowseMode) { super(fsContent); + this.setDisplayName(AbstractFsContentNode.getFsContentName(fsContent)); this.directoryBrowseMode = directoryBrowseMode; } @@ -226,7 +227,7 @@ public abstract class AbstractFsContentNode extends Abstrac * @param content to extract properties from */ public static void fillPropertyMap(Map map, FsContent content) { - map.put(FsContentPropertyType.NAME.toString(), content.getName()); + map.put(FsContentPropertyType.NAME.toString(), getFsContentName(content)); map.put(FsContentPropertyType.LOCATION.toString(), DataConversion.getformattedPath(ContentUtils.getDisplayPath(content), 0, 1)); map.put(FsContentPropertyType.MOD_TIME.toString(), ContentUtils.getStringTime(content.getMtime(), content)); map.put(FsContentPropertyType.CHANGED_TIME.toString(), ContentUtils.getStringTime(content.getCtime(), content)); @@ -245,4 +246,14 @@ public abstract class AbstractFsContentNode extends Abstrac map.put(FsContentPropertyType.KNOWN.toString(), content.getKnown().getName()); map.put(FsContentPropertyType.MD5HASH.toString(), content.getMd5Hash() == null ? "" : content.getMd5Hash()); } + + static String getFsContentName(FsContent fsContent) { + String name = fsContent.getName(); + if(name.equals("..")) { + name = DirectoryNode.DOTDOTDIR; + } else if(name.equals(".")) { + name = DirectoryNode.DOTDIR; + } + return name; + } } diff --git a/DataModel/src/org/sleuthkit/autopsy/datamodel/DirectoryNode.java b/DataModel/src/org/sleuthkit/autopsy/datamodel/DirectoryNode.java index e64611de72..875e2e0dc7 100644 --- a/DataModel/src/org/sleuthkit/autopsy/datamodel/DirectoryNode.java +++ b/DataModel/src/org/sleuthkit/autopsy/datamodel/DirectoryNode.java @@ -27,16 +27,9 @@ import org.sleuthkit.datamodel.TskData; * Its children are more directories. */ public class DirectoryNode extends AbstractFsContentNode { - - /** - * Helper so that the display name and the name used in building the path - * are determined the same way. - * @param d Directory to get the name of - * @return short name for the directory - */ - static String nameForDirectory(Directory d) { - return d.getName(); - } + + public static final String DOTDOTDIR = "[parent folder]"; + public static final String DOTDIR = "[current folder]"; public DirectoryNode(Directory dir) { this(dir, true); @@ -50,8 +43,6 @@ public class DirectoryNode extends AbstractFsContentNode { super(dir, directoryBrowseMode); // set name, display name, and icon - String dirName = nameForDirectory(dir); - this.setDisplayName(dirName); if (Directory.dirFlagToValue(dir.getDir_flags()).equals(TskData.TSK_FS_NAME_FLAG_ENUM.TSK_FS_NAME_FLAG_UNALLOC.toString())) { this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/folder-icon-deleted.png"); } else { diff --git a/DataModel/src/org/sleuthkit/autopsy/datamodel/FileNode.java b/DataModel/src/org/sleuthkit/autopsy/datamodel/FileNode.java index bb92b68821..d444317e65 100644 --- a/DataModel/src/org/sleuthkit/autopsy/datamodel/FileNode.java +++ b/DataModel/src/org/sleuthkit/autopsy/datamodel/FileNode.java @@ -30,16 +30,6 @@ import org.sleuthkit.datamodel.TskData; */ public class FileNode extends AbstractFsContentNode { - /** - * Helper so that the display name and the name used in building the path - * are determined the same way. - * @param f File to get the name of - * @return short name for the File - */ - static String nameForFile(File f) { - return f.getName(); - } - /** * * @param file underlying Content @@ -52,8 +42,6 @@ public class FileNode extends AbstractFsContentNode { super(file, directoryBrowseMode); // set name, display name, and icon - String fileName = nameForFile(file); - this.setDisplayName(fileName); if (File.dirFlagToValue(file.getDir_flags()).equals(TskData.TSK_FS_NAME_FLAG_ENUM.TSK_FS_NAME_FLAG_UNALLOC.toString())) { this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/file-icon-deleted.png"); } else { diff --git a/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/CollapseAction.java b/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/CollapseAction.java index 4d1acb9c43..9d2c25c698 100644 --- a/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/CollapseAction.java +++ b/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/CollapseAction.java @@ -30,7 +30,7 @@ import org.sleuthkit.autopsy.coreutils.Log; * * @author jantonius */ -public class CollapseAction extends AbstractAction { +class CollapseAction extends AbstractAction { CollapseAction(String title) { super(title); diff --git a/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java b/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java index e20d9b1685..7f05fceb30 100644 --- a/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java +++ b/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java @@ -46,6 +46,7 @@ import org.sleuthkit.autopsy.datamodel.ExtractedContentNode; import org.sleuthkit.autopsy.datamodel.FileNode; import org.sleuthkit.autopsy.datamodel.FileSearchFilterNode; import org.sleuthkit.autopsy.datamodel.HashsetHits.HashsetHitsRootNode; +import org.sleuthkit.autopsy.datamodel.HashsetHits.HashsetHitsSetNode; import org.sleuthkit.autopsy.datamodel.ImageNode; import org.sleuthkit.autopsy.datamodel.KeywordHits.KeywordHitsKeywordNode; import org.sleuthkit.autopsy.datamodel.KeywordHits.KeywordHitsListNode; @@ -154,7 +155,6 @@ public class DataResultFilterNode extends FilterNode{ List actions = new ArrayList(); actions.add(new NewWindowViewAction("View in New Window", vol)); actions.addAll(ShowDetailActionVisitor.getActions(vol.getLookup().lookup(Content.class))); - actions.add(new ChangeViewAction("View", 0, vol)); return actions; } @@ -271,6 +271,11 @@ public class DataResultFilterNode extends FilterNode{ return openChild(hhrn); } + @Override + public AbstractAction visit(HashsetHitsSetNode hhsn) { + return openChild(hhsn); + } + @Override public AbstractAction visit(EmailExtractedRootNode eern) { return openChild(eern); @@ -303,9 +308,9 @@ public class DataResultFilterNode extends FilterNode{ @Override public AbstractAction visit(DirectoryNode dn){ - if(dn.getDisplayName().equals("..")) + if(dn.getDisplayName().equals(DirectoryNode.DOTDOTDIR)) return openParent(dn); - else if(!dn.getDisplayName().equals(".")) + else if(!dn.getDisplayName().equals(DirectoryNode.DOTDIR)) return openChild(dn); else return null; diff --git a/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java b/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java index 1311c9a12f..6884caa15e 100644 --- a/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java +++ b/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterChildren.java @@ -89,11 +89,10 @@ class DirectoryTreeFilterChildren extends FilterNode.Children { || arg0 instanceof HashsetHitsRootNode || arg0 instanceof EmailExtractedRootNode || arg0 instanceof EmailExtractedAccountNode - || arg0 instanceof EmailExtractedFolderNode || arg0 instanceof ImagesNode || arg0 instanceof ViewsNode || arg0 instanceof ResultsNode)) { - return new Node[]{this.copyNode(arg0)}; + return new Node[]{this.copyNode(arg0, true)}; } else if (arg0 != null && (arg0 instanceof KeywordHitsKeywordNode || (arg0 instanceof DirectoryNode @@ -102,8 +101,6 @@ class DirectoryTreeFilterChildren extends FilterNode.Children { || arg0 instanceof RecentFilesFilterNode || arg0 instanceof FileSearchFilterNode || arg0 instanceof HashsetHitsSetNode - || arg0 instanceof EmailExtractedRootNode - || arg0 instanceof EmailExtractedAccountNode || arg0 instanceof EmailExtractedFolderNode )) { return new Node[]{this.copyNode(arg0, false)}; @@ -142,7 +139,7 @@ class DirectoryTreeFilterChildren extends FilterNode.Children { */ private static boolean isDotDirectory(DirectoryNode dir) { String name = dir.getDisplayName(); - return name.equals(".") || name.equals(".."); + return name.equals(DirectoryNode.DOTDIR) || name.equals(DirectoryNode.DOTDOTDIR); } /** diff --git a/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java b/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java index 4013ee9903..b1ae1ef70c 100644 --- a/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java +++ b/DirectoryTree/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeFilterNode.java @@ -63,7 +63,6 @@ class DirectoryTreeFilterNode extends FilterNode { Content c = this.getLookup().lookup(Content.class); if (c != null) { actions.addAll(DirectoryTreeFilterNode.getDetailActions(c)); - actions.add(collapseAll); Directory dir = this.getLookup().lookup(Directory.class); if (dir != null) { @@ -83,6 +82,7 @@ class DirectoryTreeFilterNode extends FilterNode { }); } } + actions.add(collapseAll); return actions.toArray(new Action[actions.size()]); } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentViewer.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentViewer.java index 0001c62629..6d4cc55755 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentViewer.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentViewer.java @@ -45,7 +45,7 @@ import org.sleuthkit.datamodel.Directory; * MarkupSource items in the selected Node's lookup, plus the content that * Solr extracted (if there is any). */ -@ServiceProvider(service = DataContentViewer.class) +@ServiceProvider(service = DataContentViewer.class, position=4) public class ExtractedContentViewer implements DataContentViewer { private static final Logger logger = Logger.getLogger(ExtractedContentViewer.class.getName()); @@ -304,10 +304,20 @@ public class ExtractedContentViewer implements DataContentViewer { } @Override - public boolean isPreferred(Node node, + public int isPreferred(Node node, boolean isSupported) { BlackboardArtifact art = node.getLookup().lookup(BlackboardArtifact.class); - return isSupported && (art == null || art.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()); + if(isSupported) { + if(art == null) { + return 4; + } else if(art.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()) { + return 6; + } else { + return 4; + } + } else { + return 0; + } } /**