From f0be8b10cf9d1d2deac73c70f74b0075670408cc Mon Sep 17 00:00:00 2001 From: Karl Mortensen Date: Thu, 4 Feb 2016 15:20:55 -0500 Subject: [PATCH 1/9] uppercase the drive name to check for UNC mapping --- Core/src/org/sleuthkit/autopsy/coreutils/UNCPathUtilities.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/UNCPathUtilities.java b/Core/src/org/sleuthkit/autopsy/coreutils/UNCPathUtilities.java index 103a94013c..9ba40b7a08 100644 --- a/Core/src/org/sleuthkit/autopsy/coreutils/UNCPathUtilities.java +++ b/Core/src/org/sleuthkit/autopsy/coreutils/UNCPathUtilities.java @@ -84,7 +84,7 @@ public class UNCPathUtilities { String uncPath = null; try { String currentDrive = Paths.get(inputPath).getRoot().toString().substring(STARTING_OFFSET, REPLACEMENT_SIZE); - String uncMapping = drives.get(currentDrive); + String uncMapping = drives.get(currentDrive.toUpperCase()); if (uncMapping != null) { uncPath = uncMapping + inputPath.substring(REPLACEMENT_SIZE, inputPath.length()); } From d8752fcadc4d8a35c8fde92eea0bd15bf9757faa Mon Sep 17 00:00:00 2001 From: jmillman Date: Thu, 4 Feb 2016 15:01:50 -0500 Subject: [PATCH 2/9] add follow up flag image to follow up action and in group list , improve category "icons"; cleanup toolbar labels to match group labels --- .../imagegallery/actions/TagGroupAction.java | 6 +- .../actions/TagSelectedFilesAction.java | 6 +- .../imagegallery/datamodel/Category.java | 22 +++-- .../datamodel/DrawableAttribute.java | 44 +++++---- .../datamodel/DrawableTagsManager.java | 38 ++++++-- .../datamodel/grouping/GroupKey.java | 8 +- .../autopsy/imagegallery/gui/Toolbar.fxml | 90 +++++++++++++------ .../autopsy/imagegallery/gui/Toolbar.java | 6 +- .../gui/drawableviews/GroupPane.java | 11 ++- .../gui/navpanel/GroupListCell.java | 19 ++-- .../imagegallery/gui/navpanel/GroupTree.java | 3 +- .../gui/navpanel/GroupTreeCell.java | 25 ++++-- .../gui/navpanel/HashHitGroupList.java | 2 +- 13 files changed, 187 insertions(+), 93 deletions(-) diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/TagGroupAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/TagGroupAction.java index dc7db4074c..c53d796a60 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/TagGroupAction.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/TagGroupAction.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2015 Basis Technology Corp. + * Copyright 2015-16 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,10 +20,8 @@ package org.sleuthkit.autopsy.imagegallery.actions; import com.google.common.collect.ImmutableSet; import java.util.Set; -import javafx.scene.image.ImageView; import org.controlsfx.control.action.Action; import org.sleuthkit.autopsy.imagegallery.ImageGalleryController; -import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableAttribute; import org.sleuthkit.datamodel.TagName; /** @@ -36,6 +34,6 @@ public class TagGroupAction extends Action { Set fileIdSet = ImmutableSet.copyOf(controller.viewState().get().getGroup().getFileIDs()); new AddDrawableTagAction(controller).addTagsToFiles(tagName, "", fileIdSet); }); - setGraphic(new ImageView(DrawableAttribute.TAGS.getIcon())); + setGraphic(controller.getTagsManager().getGraphic(tagName)); } } diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/TagSelectedFilesAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/TagSelectedFilesAction.java index 33bf74bb9b..3aafc804a1 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/TagSelectedFilesAction.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/TagSelectedFilesAction.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2015 Basis Technology Corp. + * Copyright 2015-16 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,10 +18,8 @@ */ package org.sleuthkit.autopsy.imagegallery.actions; -import javafx.scene.image.ImageView; import org.controlsfx.control.action.Action; import org.sleuthkit.autopsy.imagegallery.ImageGalleryController; -import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableAttribute; import org.sleuthkit.datamodel.TagName; /** @@ -31,6 +29,6 @@ public class TagSelectedFilesAction extends Action { public TagSelectedFilesAction(final TagName tagName, ImageGalleryController controller) { super(tagName.getDisplayName(), actionEvent -> new AddDrawableTagAction(controller).addTag(tagName, "")); - setGraphic(new ImageView(DrawableAttribute.TAGS.getIcon())); + setGraphic(controller.getTagsManager().getGraphic(tagName)); } } diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/Category.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/Category.java index fd112e1ab3..36d84f90e7 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/Category.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/Category.java @@ -23,9 +23,17 @@ import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; +import javafx.geometry.Insets; import javafx.scene.Node; +import javafx.scene.layout.Background; +import javafx.scene.layout.BackgroundFill; +import javafx.scene.layout.Border; +import javafx.scene.layout.BorderStroke; +import javafx.scene.layout.BorderStrokeStyle; +import javafx.scene.layout.BorderWidths; +import javafx.scene.layout.CornerRadii; +import javafx.scene.layout.Region; import javafx.scene.paint.Color; -import javafx.scene.shape.Rectangle; import org.openide.util.NbBundle; /** @@ -51,6 +59,9 @@ public enum Category { FIVE(Color.GREEN, 5, Bundle.Category_five()), ZERO(Color.LIGHTGREY, 0, Bundle.Category_zero()); + private static final BorderWidths BORDER_WIDTHS_2 = new BorderWidths(2); + private static final CornerRadii CORNER_RADII_4 = new CornerRadii(4); + public static ImmutableList getNonZeroCategories() { return nonZeroCategories; } @@ -108,9 +119,10 @@ public enum Category { } public Node getGraphic() { - Rectangle rectangle = new Rectangle(16d, 16d, getColor()); - rectangle.setArcHeight(8); - rectangle.setArcWidth(8); - return rectangle; + Region region = new Region(); + region.setBackground(new Background(new BackgroundFill(getColor(), CORNER_RADII_4, Insets.EMPTY))); + region.setPrefSize(16, 16); + region.setBorder(new Border(new BorderStroke(getColor().darker(), BorderStrokeStyle.SOLID, CORNER_RADII_4, BORDER_WIDTHS_2))); + return region; } } diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableAttribute.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableAttribute.java index 8222c1effe..f0f956a304 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableAttribute.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableAttribute.java @@ -25,7 +25,9 @@ import java.util.List; import java.util.function.Function; import javafx.beans.property.ReadOnlyStringWrapper; import javafx.beans.property.StringProperty; +import javafx.scene.Node; import javafx.scene.image.Image; +import javafx.scene.image.ImageView; import org.apache.commons.lang3.StringUtils; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.datamodel.ContentUtils; @@ -39,20 +41,20 @@ import org.sleuthkit.datamodel.TagName; * of type paramaters and multivalued attributes */ @NbBundle.Messages({"DrawableAttribute.md5hash=MD5 Hash", - "DrawableAttribute.name=Name", - "DrawableAttribute.analyzed=Analyzed", - "DrawableAttribute.category=Category", - "DrawableAttribute.tags=Tags", - "DrawableAttribute.path=Path", - "DrawableAttribute.createdTime=Created Time", - "DrawableAttribute.modifiedTime=Modified Time", - "DrawableAttribute.cameraMake=Camera Make", - "DrawableAttribute.cameraModel=Camera Model", - "DrawableAttribute.hashSet=Hashset", - "DrawableAttribute.intObjID=Internal Object ID", - "DrawableAttribute.width=Width", - "DrawableAttribute.height=Height", - "DrawableAttribute.mimeType=MIME type"}) + "DrawableAttribute.name=Name", + "DrawableAttribute.analyzed=Analyzed", + "DrawableAttribute.category=Category", + "DrawableAttribute.tags=Tags", + "DrawableAttribute.path=Path", + "DrawableAttribute.createdTime=Created Time", + "DrawableAttribute.modifiedTime=Modified Time", + "DrawableAttribute.cameraMake=Camera Make", + "DrawableAttribute.cameraModel=Camera Model", + "DrawableAttribute.hashSet=Hashset", + "DrawableAttribute.intObjID=Internal Object ID", + "DrawableAttribute.width=Width", + "DrawableAttribute.height=Height", + "DrawableAttribute.mimeType=MIME type"}) public class DrawableAttribute> { public final static DrawableAttribute MD5_HASH = @@ -82,10 +84,16 @@ public class DrawableAttribute> { * advantage. move categories into DrawableDB? */ public final static DrawableAttribute CATEGORY = - new DrawableAttribute<>(AttributeName.CATEGORY, Bundle.DrawableAttribute_category(), + new DrawableAttribute(AttributeName.CATEGORY, Bundle.DrawableAttribute_category(), false, "category-icon.png", //NON-NLS - f -> Collections.singleton(f.getCategory())); + f -> Collections.singleton(f.getCategory())) { + + @Override + public Node getGraphicForValue(Category val) { + return val.getGraphic(); + } + }; public final static DrawableAttribute TAGS = new DrawableAttribute<>(AttributeName.TAGS, Bundle.DrawableAttribute_tags(), @@ -195,8 +203,8 @@ public class DrawableAttribute> { * TODO: override this to load per value icons form some attributes like * mime-type and category */ - public Image getIconForValue(T val) { - return getIcon(); + public Node getGraphicForValue(T val) { + return new ImageView(getIcon()); } public static List> getGroupableAttrs() { diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableTagsManager.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableTagsManager.java index cdadb53b94..ea2f17f62e 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableTagsManager.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableTagsManager.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2013-15 Basis Technology Corp. + * Copyright 2013-16 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,6 +26,9 @@ import java.util.Objects; import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.stream.Collectors; +import javafx.scene.Node; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; import javax.annotation.Nonnull; import org.apache.commons.lang3.concurrent.BasicThreadFactory; import org.openide.util.NbBundle; @@ -40,7 +43,7 @@ import org.sleuthkit.datamodel.TskCoreException; /** * Manages Tags, Tagging, and the relationship between Categories and Tags in - * the autopsy Db. delegates some, work to the backing {@link TagsManager}. + * the autopsy Db. Delegates some work to the backing {@link TagsManager}. */ @NbBundle.Messages({"DrawableTagsManager.followUp=Follow Up"}) public class DrawableTagsManager { @@ -48,11 +51,14 @@ public class DrawableTagsManager { private static final Logger LOGGER = Logger.getLogger(DrawableTagsManager.class.getName()); private static final String FOLLOW_UP = Bundle.DrawableTagsManager_followUp(); + private static Image FOLLOW_UP_IMAGE; final private Object autopsyTagsManagerLock = new Object(); private TagsManager autopsyTagsManager; - /** Used to distribute {@link TagsChangeEvent}s */ + /** + * Used to distribute {@link TagsChangeEvent}s + */ private final EventBus tagsEventBus = new AsyncEventBus( Executors.newSingleThreadExecutor( new BasicThreadFactory.Builder().namingPattern("Tags Event Bus").uncaughtExceptionHandler((Thread t, Throwable e) -> { //NON-NLS @@ -60,7 +66,9 @@ public class DrawableTagsManager { }).build() )); - /** The tag name corresponding to the "built-in" tag "Follow Up" */ + /** + * The tag name corresponding to the "built-in" tag "Follow Up" + */ private TagName followUpTagName; public DrawableTagsManager(TagsManager autopsyTagsManager) { @@ -137,8 +145,8 @@ public class DrawableTagsManager { * get all the TagNames that are not categories * * @return all the TagNames that are not categories, in alphabetical order - * by displayName, or, an empty set if there was an exception looking them - * up from the db. + * by displayName, or, an empty set if there was an exception + * looking them up from the db. */ @Nonnull public List getNonCategoryTagNames() { @@ -228,4 +236,22 @@ public class DrawableTagsManager { autopsyTagsManager.deleteContentTag(ct); } } + + public Node getGraphic(TagName tagname) { + try { + if (tagname.equals(getFollowUpTagName())) { + return new ImageView(getFollowUpImage()); + } + } catch (TskCoreException ex) { + LOGGER.log(Level.SEVERE, "Failed to get \"Follow Up\" tag name from db.", ex); + } + return DrawableAttribute.TAGS.getGraphicForValue(tagname); + } + + synchronized private static Image getFollowUpImage() { + if (FOLLOW_UP_IMAGE == null) { + FOLLOW_UP_IMAGE = new Image("/org/sleuthkit/autopsy/imagegallery/images/flag_red.png"); + } + return FOLLOW_UP_IMAGE; + } } diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupKey.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupKey.java index 1073d587da..9945a72313 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupKey.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupKey.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2013 Basis Technology Corp. + * Copyright 2013-16 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,7 +20,7 @@ package org.sleuthkit.autopsy.imagegallery.datamodel.grouping; import java.util.Map; import java.util.Objects; -import javafx.scene.image.Image; +import javafx.scene.Node; import javax.annotation.concurrent.Immutable; import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableAttribute; import org.sleuthkit.datamodel.TagName; @@ -89,7 +89,7 @@ public class GroupKey> implements Comparable return val.compareTo(o.val); } - public Image getIcon() { - return attr.getIconForValue(val); + public Node getGraphic() { + return attr.getGraphicForValue(val); } } diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Toolbar.fxml b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Toolbar.fxml index 1f71ff7974..4c7b95a273 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Toolbar.fxml +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Toolbar.fxml @@ -1,11 +1,21 @@ - - - - + + + + + + + + + + + + + + - + - + diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Toolbar.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Toolbar.java index e8c221ec91..29a4a91e5f 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Toolbar.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/Toolbar.java @@ -29,7 +29,6 @@ import javafx.beans.property.DoubleProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.collections.FXCollections; import javafx.fxml.FXML; -import javafx.scene.control.CheckBox; import javafx.scene.control.ComboBox; import javafx.scene.control.MenuItem; import javafx.scene.control.RadioButton; @@ -62,9 +61,6 @@ public class Toolbar extends ToolBar { @FXML private ComboBox> groupByBox; - @FXML - private CheckBox onlyAnalyzedCheckBox; - @FXML private Slider sizeSlider; @@ -125,7 +121,7 @@ public class Toolbar extends ToolBar { assert catGroupMenuButton != null : "fx:id=\"catSelectedMenubutton\" was not injected: check your FXML file 'Toolbar.fxml'."; assert descRadio != null : "fx:id=\"descRadio\" was not injected: check your FXML file 'Toolbar.fxml'."; assert groupByBox != null : "fx:id=\"groupByBox\" was not injected: check your FXML file 'Toolbar.fxml'."; - assert onlyAnalyzedCheckBox != null : "fx:id=\"onlyAnalyzedCheckBox\" was not injected: check your FXML file 'Toolbar.fxml'."; + assert orderGroup != null : "fx:id=\"orderGroup\" was not injected: check your FXML file 'Toolbar.fxml'."; assert sizeSlider != null : "fx:id=\"sizeSlider\" was not injected: check your FXML file 'Toolbar.fxml'."; assert sortByBox != null : "fx:id=\"sortByBox\" was not injected: check your FXML file 'Toolbar.fxml'."; diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/GroupPane.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/GroupPane.java index 1fb3f46022..bc5b1aec19 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/GroupPane.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/GroupPane.java @@ -145,6 +145,8 @@ import org.sleuthkit.datamodel.TskCoreException; public class GroupPane extends BorderPane { private static final Logger LOGGER = Logger.getLogger(GroupPane.class.getName()); + private static final BorderWidths BORDER_WIDTHS_2 = new BorderWidths(2); + private static final CornerRadii CORNER_RADII_2 = new CornerRadii(2); private static final DropShadow DROP_SHADOW = new DropShadow(10, Color.BLUE); @@ -383,10 +385,11 @@ public class GroupPane extends BorderPane { assert tileToggle != null : "fx:id=\"tileToggle\" was not injected: check your FXML file 'GroupHeader.fxml'."; for (Category cat : Category.values()) { - getToggleForCategory(cat).setBorder(new Border(new BorderStroke(cat.getColor(), BorderStrokeStyle.SOLID, new CornerRadii(1), new BorderWidths(1)))); - getToggleForCategory(cat).getStyleClass().remove("radio-button"); - getToggleForCategory(cat).getStyleClass().add("toggle-button"); - getToggleForCategory(cat).selectedProperty().addListener((ov, wasSelected, toggleSelected) -> { + ToggleButton toggleForCategory = getToggleForCategory(cat); + toggleForCategory.setBorder(new Border(new BorderStroke(cat.getColor(), BorderStrokeStyle.SOLID, CORNER_RADII_2, BORDER_WIDTHS_2))); + toggleForCategory.getStyleClass().remove("radio-button"); + toggleForCategory.getStyleClass().add("toggle-button"); + toggleForCategory.selectedProperty().addListener((ov, wasSelected, toggleSelected) -> { if (toggleSelected && slideShowPane != null) { slideShowPane.getFileID().ifPresent((fileID) -> { selectionModel.clearAndSelect(fileID); diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupListCell.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupListCell.java index 37caa8bd78..6a48dc78b4 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupListCell.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupListCell.java @@ -24,13 +24,17 @@ import javafx.application.Platform; import javafx.beans.InvalidationListener; import javafx.beans.Observable; import javafx.beans.property.ReadOnlyObjectProperty; +import javafx.scene.Node; import javafx.scene.control.ListCell; import javafx.scene.control.OverrunStyle; import javafx.scene.control.Tooltip; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javax.annotation.Nonnull; +import org.sleuthkit.autopsy.imagegallery.ImageGalleryController; +import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableAttribute; import org.sleuthkit.autopsy.imagegallery.datamodel.grouping.DrawableGroup; +import org.sleuthkit.datamodel.TagName; /** * @@ -66,9 +70,10 @@ class GroupListCell extends ListCell { }; private final ReadOnlyObjectProperty> sortOrder; + private final ImageGalleryController controller; - GroupListCell(ReadOnlyObjectProperty> sortOrderProperty) { - + GroupListCell(ImageGalleryController controller, ReadOnlyObjectProperty> sortOrderProperty) { + this.controller = controller; this.sortOrder = sortOrderProperty; getStylesheets().add(GroupTreeCell.class.getResource("GroupTreeCell.css").toExternalForm()); //NON-NLS getStyleClass().add("groupTreeCell"); //reduce indent to 5, default is 10 which uses up a lot of space. NON-NLS @@ -102,10 +107,10 @@ class GroupListCell extends ListCell { } else { final String text = getGroupName() + getCountsText(); String style; - Image icon; + Node icon; if (isNull(group)) { //"dummy" group in file system tree <=> a folder with no drawables - icon = EMPTY_FOLDER_ICON; + icon = new ImageView(EMPTY_FOLDER_ICON); style = ""; } else { //if number of files in this group changes (eg a file is recategorized), update counts via listener @@ -117,13 +122,15 @@ class GroupListCell extends ListCell { group.seenProperty().addListener(seenListener); //and use icon corresponding to group type - icon = group.getGroupKey().getIcon(); + icon = (group.getGroupByAttribute() == DrawableAttribute.TAGS) + ? controller.getTagsManager().getGraphic((TagName) group.getGroupByValue()) + : group.getGroupKey().getGraphic(); style = getSeenStyleClass(); } Platform.runLater(() -> { setTooltip(new Tooltip(text)); - setGraphic(new ImageView(icon)); + setGraphic(icon); setText(text); setStyle(style); }); diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTree.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTree.java index ffe9df9a51..0813c91190 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTree.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTree.java @@ -32,7 +32,6 @@ import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.image.ImageView; import org.apache.commons.lang3.StringUtils; -import org.apache.poi.util.Beta; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.ThreadConfined; import org.sleuthkit.autopsy.imagegallery.FXMLConstructor; @@ -73,7 +72,7 @@ final public class GroupTree extends NavPanel> { getToolBar().visibleProperty().bind(groupedByPath.not()); getToolBar().managedProperty().bind(groupedByPath.not()); - groupTree.setCellFactory(treeView -> new GroupTreeCell(getSortByBox().getSelectionModel().selectedItemProperty())); + groupTree.setCellFactory(treeView -> new GroupTreeCell(getController(), getSortByBox().getSelectionModel().selectedItemProperty())); groupTree.setShowRoot(false); getGroupManager().getAnalyzedGroups().addListener((ListChangeListener.Change change) -> { diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTreeCell.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTreeCell.java index a26ec693c7..e81633ad16 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTreeCell.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/GroupTreeCell.java @@ -24,6 +24,7 @@ import javafx.application.Platform; import javafx.beans.InvalidationListener; import javafx.beans.Observable; import javafx.beans.property.ReadOnlyObjectProperty; +import javafx.scene.Node; import javafx.scene.control.OverrunStyle; import javafx.scene.control.Tooltip; import javafx.scene.control.TreeCell; @@ -31,7 +32,10 @@ import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javax.annotation.Nonnull; import org.apache.commons.lang3.StringUtils; +import org.sleuthkit.autopsy.imagegallery.ImageGalleryController; +import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableAttribute; import org.sleuthkit.autopsy.imagegallery.datamodel.grouping.DrawableGroup; +import org.sleuthkit.datamodel.TagName; /** * A cell in the NavPanel tree that listens to its associated group's fileids @@ -72,8 +76,10 @@ class GroupTreeCell extends TreeCell { }); }; private final ReadOnlyObjectProperty> sortOrder; + private final ImageGalleryController controller; - GroupTreeCell(ReadOnlyObjectProperty> sortOrderProperty) { + GroupTreeCell(ImageGalleryController controller, ReadOnlyObjectProperty> sortOrderProperty) { + this.controller = controller; this.sortOrder = sortOrderProperty; getStylesheets().add(GroupTreeCell.class.getResource("GroupTreeCell.css").toExternalForm()); //NON-NLS getStyleClass().add("groupTreeCell"); //reduce indent to 5, default is 10 which uses up a lot of space. NON-NLS @@ -112,7 +118,8 @@ class GroupTreeCell extends TreeCell { setStyle(""); }); } else { - if (isNull(treeNode.getGroup())) { + DrawableGroup group = treeNode.getGroup(); + if (isNull(group)) { final String text = getGroupName(); //"dummy" group in file system tree <=> a folder with no drawables Platform.runLater(() -> { @@ -124,20 +131,22 @@ class GroupTreeCell extends TreeCell { } else { //if number of files in this group changes (eg a file is recategorized), update counts via listener - treeNode.getGroup().getFileIDs().addListener(fileCountListener); - treeNode.getGroup().uncatCountProperty().addListener(fileCountListener); - treeNode.getGroup().hashSetHitsCountProperty().addListener(fileCountListener); + group.getFileIDs().addListener(fileCountListener); + group.uncatCountProperty().addListener(fileCountListener); + group.hashSetHitsCountProperty().addListener(fileCountListener); sortOrder.addListener(fileCountListener); //if the seen state of this group changes update its style - treeNode.getGroup().seenProperty().addListener(seenListener); + group.seenProperty().addListener(seenListener); //and use icon corresponding to group type - final Image icon = treeNode.getGroup().getGroupKey().getIcon(); + Node icon = (group.getGroupByAttribute() == DrawableAttribute.TAGS) + ? controller.getTagsManager().getGraphic((TagName) group.getGroupByValue()) + : group.getGroupKey().getGraphic(); final String text = getGroupName() + getCountsText(); final String style = getSeenStyleClass(); Platform.runLater(() -> { setTooltip(new Tooltip(text)); - setGraphic(new ImageView(icon)); + setGraphic(icon); setText(text); setStyle(style); }); diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/HashHitGroupList.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/HashHitGroupList.java index 03c6663369..790262b78e 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/HashHitGroupList.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/navpanel/HashHitGroupList.java @@ -79,7 +79,7 @@ final public class HashHitGroupList extends NavPanel { getBorderPane().setCenter(groupList); sorted = getController().getGroupManager().getAnalyzedGroups().filtered((DrawableGroup t) -> t.getHashSetHitsCount() > 0).sorted(getDefaultComparator()); - groupList.setCellFactory(treeView -> new GroupListCell(getSortByBox().getSelectionModel().selectedItemProperty())); + groupList.setCellFactory(treeView -> new GroupListCell(getController(), getSortByBox().getSelectionModel().selectedItemProperty())); groupList.setItems(sorted); } From 1bc1b71866f29ba1c529a5a7cd534e7e17ff6262 Mon Sep 17 00:00:00 2001 From: Kay Bassi Date: Thu, 4 Feb 2016 13:56:14 -0800 Subject: [PATCH 3/9] Translated one last string --- .../autopsy/modules/hashdatabase/Bundle_ja.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties index d63bbe7d37..b53420e4ee 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties @@ -13,7 +13,7 @@ HashDbSearchPanel.titleLabel.text=\u6B21\u306EMD5\u30CF\u30C3\u30B7\u30E5\u4ED8\ HashDbSearchPanel.errorField.text=\u30A8\u30E9\u30FC\uFF1A\u5168\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u30CF\u30C3\u30B7\u30E5\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002 HashDbSearchPanel.saveBox.text=\u30CF\u30C3\u30B7\u30E5\u3092\u8A18\u61B6 HashDbSearchPanel.cancelButton.text=\u30AD\u30E3\u30F3\u30BB\u30EB -OpenIDE-Module-Short-Description=\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u304A\u3088\u3073\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30C4\u30FC\u30EB +OpenIDE-Module-Short-Description=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u304A\u3088\u3073\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30C4\u30FC\u30EB HashDbImportDatabaseDialog.jLabel1.text=\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8\u540D\uFF1A HashDbImportDatabaseDialog.knownBadRadioButton.text=\u65E2\u77E5\u306E\u60AA\u8CEA HashDbImportDatabaseDialog.jLabel2.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u30BF\u30A4\u30D7\uFF1A @@ -210,3 +210,4 @@ AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.noHashesToAdd=\u8F AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.success={0}\u30CF\u30C3\u30B7\u30E5\u304C\u6B63\u3057\u304F\u8FFD\u52A0\u3055\u308C\u307E\u3057\u305F\u3002 AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.errorAddingValidHash=\u6709\u52B9\u306A\u30CF\u30C3\u30B7\u30E5\u3092\u8FFD\u52A0\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.errorAddingValidHash.msg=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B\u6709\u52B9\u306A\u30CF\u30C3\u30B7\u30E5\u3092\u8FFD\u52A0\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 +HashLookupSettingsPanel.addHashesToDatabaseButton.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B\u30CF\u30C3\u30B7\u30E5\u3092\u8FFD\u52A0 From c8a5367f7e1061c532a16f00c5dd658b3f328163 Mon Sep 17 00:00:00 2001 From: Nick Davis Date: Thu, 4 Feb 2016 17:28:58 -0500 Subject: [PATCH 4/9] extracted Thumbnail combobox values --- .../corecomponents/DataResultViewerThumbnail.form | 5 ----- .../corecomponents/DataResultViewerThumbnail.java | 14 +++++++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.form b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.form index f471d230a7..88d0657cf2 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.form +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.form @@ -192,11 +192,6 @@ - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java index 4f3910357d..778be9d120 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java @@ -87,11 +87,19 @@ final class DataResultViewerThumbnail extends AbstractDataResultViewer { initialize(); } + @NbBundle.Messages({"DataResultViewerThumbnail.thumbnailSizeComboBox.small=Small Thumbnails", + "DataResultViewerThumbnail.thumbnailSizeComboBox.medium=Medium Thumbnails", + "DataResultViewerThumbnail.thumbnailSizeComboBox.large=Large Thumbnails" + }) private void initialize() { initComponents(); iconView.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); em.addPropertyChangeListener(new ExplorerManagerNodeSelectionListener()); + thumbnailSizeComboBox.setModel(new javax.swing.DefaultComboBoxModel( + new String[] { Bundle.DataResultViewerThumbnail_thumbnailSizeComboBox_small(), + Bundle.DataResultViewerThumbnail_thumbnailSizeComboBox_medium(), + Bundle.DataResultViewerThumbnail_thumbnailSizeComboBox_large() })); curPage = -1; totalPages = 0; @@ -166,7 +174,6 @@ final class DataResultViewerThumbnail extends AbstractDataResultViewer { } }); - thumbnailSizeComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Small Thumbnails", "Medium Thumbnails", "Large Thumbnails" })); thumbnailSizeComboBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { thumbnailSizeComboBoxActionPerformed(evt); @@ -203,10 +210,7 @@ final class DataResultViewerThumbnail extends AbstractDataResultViewer { .addComponent(imagesRangeLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(thumbnailSizeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) - .addGroup(layout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(iconView, javax.swing.GroupLayout.DEFAULT_SIZE, 563, Short.MAX_VALUE) - .addGap(0, 0, 0))) + .addComponent(iconView, javax.swing.GroupLayout.DEFAULT_SIZE, 563, Short.MAX_VALUE)) .addContainerGap()) ); layout.setVerticalGroup( From 26e7735a59708ce94bbf0803d38e3501630f9242 Mon Sep 17 00:00:00 2001 From: Nick Davis Date: Thu, 4 Feb 2016 22:17:58 -0500 Subject: [PATCH 5/9] more translations --- .../autopsy/corecomponents/Bundle_ja.properties | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties index 594de9284c..2eb33f259a 100755 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties @@ -19,12 +19,12 @@ LBL_Close=\u9589\u3058\u308B DataContentViewerString.copyMenuItem.text=\u30B3\u30D4\u30FC DataContentViewerHex.copyMenuItem.text=\u30B3\u30D4\u30FC DataContentViewerString.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629E -DataContentViewerHex.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629E +DataContentViewerHex.selectAllMenuItem.text=\u5168\u3066\u9078\u629E DataContentViewerArtifact.totalPageLabel.text=100 DataContentViewerArtifact.pageLabel2.text=\u7D50\u679C DataContentViewerArtifact.currentPageLabel.text=1 DataContentViewerArtifact.copyMenuItem.text=\u30B3\u30D4\u30FC -DataContentViewerArtifact.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629E +DataContentViewerArtifact.selectAllMenuItem.text=\u5168\u3066\u9078\u629E DataContentViewerArtifact.pageLabel.text=\u7D50\u679C\uFF1A AdvancedConfigurationDialog.applyButton.text=OK DataContentViewerString.goToPageLabel.text=\u6B21\u306E\u30DA\u30FC\u30B8\u3078\u79FB\u52D5\uFF1A @@ -44,7 +44,7 @@ DataResultPanel.matchLabel.text=\u7D50\u679C MediaViewVideoPanel.pauseButton.text=\u25BA MediaViewVideoPanel.progressLabel.text=00\:00 MediaViewVideoPanel.infoLabel.text=\u60C5\u5831 -DataContentViewerArtifact.waitText=\u30C7\u30FC\u30BF\u3092\u53D6\u8FBC\u307F\u304A\u3088\u3073\u6E96\u5099\u4E2D\u3002\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u4E0B\u3055\u3044\u2026 +DataContentViewerArtifact.waitText=\u30C7\u30FC\u30BF\u3092\u53D6\u8FBC\u307F\u304A\u3088\u3073\u6E96\u5099\u4E2D\u3002\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u4E0B\u3055\u3044... DataContentViewerArtifact.errorText=\u7D50\u679C\u3092\u53D6\u8FBC\u307F\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F DataContentViewerArtifact.title=\u7D50\u679C DataContentViewerArtifact.toolTip=\u30D5\u30A1\u30A4\u30EB\u306B\u95A2\u9023\u3059\u308B\u7D50\u679C\u3092\u8868\u793A\u3057\u307E\u3059 @@ -119,7 +119,7 @@ AutopsyOptionsPanel.keepCurrentViewerRB.text=\u305D\u306E\u307E\u307E\u540C\u305 AutopsyOptionsPanel.restartRequiredLabel.text=\u3053\u306E\u30B3\u30F3\u30D4\u30E5\u30FC\u30BF\u30FC\u3067\u306F\u6700\u5927{0}\u306E\u30D5\u30A1\u30A4\u30EB\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30B9\u30EC\u30C3\u30C9\u3092\u4F7F\u7528\u3059\u3079\u304D\u3067\u3059\u3002\u6709\u52B9\u306B\u3059\u308B\u306B\u306F\u518D\u8D77\u52D5\u304C\u5FC5\u8981\u3067\u3059\u3002 AutopsyOptionsPanel.jLabelSelectFile.text=\u30D5\u30A1\u30A4\u30EB\u3092\u9078\u629E\u3059\u308B\u5834\u5408\uFF1A AutopsyOptionsPanel.jLabelHideKnownFiles.text=\u65E2\u77E5\u30D5\u30A1\u30A4\u30EB\uFF08NIST NSRL\u5185\u306E\uFF09\u3092\u6B21\u306B\u96A0\u3059\uFF1A -AutopsyOptionsPanel.jLabelTimeDisplay.text=\u30A2\u30A4\u30C6\u30E0\u3092\u8868\u793A\u3059\u308B\u5834\u5408\uFF1A +AutopsyOptionsPanel.jLabelTimeDisplay.text=\u6642\u9593\u3092\u8868\u793A\u3059\u308B\u5834\u5408\uFF1A AutopsyOptionsPanel.jLabelNumThreads.text=\u30D5\u30A1\u30A4\u30EB\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306B\u4F7F\u7528\u3059\u308B\u30B9\u30EC\u30C3\u30C9\u6570\uFF1A FXVideoPanel.progress.bufferingCancelled=\u30E1\u30C7\u30A3\u30A2\u306E\u30D0\u30C3\u30D5\u30A1\u30EA\u30F3\u30B0\u304C\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F FXVideoPanel.progress.bufferingInterrupted=\u30E1\u30C7\u30A3\u30A2\u306E\u30D0\u30C3\u30D5\u30A1\u30EA\u30F3\u30B0\u304C\u4E2D\u65AD\u3055\u308C\u307E\u3057\u305F @@ -156,3 +156,11 @@ MultiUserSettingsPanel.tbMsgPassword.toolTipText=\u30D1\u30B9\u30EF\u30FC\u30C9\ MultiUserSettingsPanel.tbMsgHostname.toolTipText=\u30DB\u30B9\u30C8\u540D\u307E\u305F\u306FIP\u30A2\u30C9\u30EC\u30B9 MultiUserSettingsPanel.KeywordSearchNull=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30B5\u30FC\u30D3\u30B9\u3092\u898B\u3064\u3051\u308C\u3089\u308C\u307E\u305B\u3093 MultiUserSettingsPanel.InvalidPortNumber=\u7121\u52B9\u306A\u30DD\u30FC\u30C8\u756A\u53F7 +CTL_OfflineHelpAction=\u30AA\u30D5\u30E9\u30A4\u30F3Autopsy\u30C9\u30AD\u30E5\u30E1\u30F3\u30C6\u30FC\u30B7\u30E7\u30F3 +CTL_OnlineHelpAction=\u30AA\u30F3\u30E9\u30A4\u30F3Autopsy\u30C9\u30AD\u30E5\u30E1\u30F3\u30C6\u30FC\u30B7\u30E7\u30F3 +DataResultViewerThumbnail.thumbnailSizeComboBox.large=\u30B5\u30E0\u30CD\u30A4\u30EB\uFF08\u5927\uFF09 +DataResultViewerThumbnail.thumbnailSizeComboBox.medium=\u30B5\u30E0\u30CD\u30A4\u30EB\uFF08\u4E2D\uFF09 +DataResultViewerThumbnail.thumbnailSizeComboBox.small=\u30B5\u30E0\u30CD\u30A4\u30EB\uFF08\u5C0F\uFF09 +MediaViewImagePanel.errorLabel.OOMText=\u30D5\u30A1\u30A4\u30EB\u3092\u30E1\u30C7\u30A3\u30A2\u30D3\u30E5\u30FC\u306B\u8AAD\u307F\u8FBC\u3081\u307E\u305B\u3093\u3067\u3057\u305F\uFF1A\u30E1\u30E2\u30EA\u4E0D\u8DB3\u3002 +MediaViewImagePanel.errorLabel.text=\u30D5\u30A1\u30A4\u30EB\u3092\u30E1\u30C7\u30A3\u30A2\u30D3\u30E5\u30FC\u306B\u8AAD\u307F\u8FBC\u3081\u307E\u305B\u3093\u3067\u3057\u305F\u3002 +MediaViewImagePanel.externalViewerButton.text=\u5916\u90E8\u30D3\u30E5\u30FC\u30A2\u30FC\u3067\u958B\u304F From 6d34bae045720afd97911e0c5e49d1a15f54183a Mon Sep 17 00:00:00 2001 From: Nick Davis Date: Fri, 5 Feb 2016 00:49:14 -0500 Subject: [PATCH 6/9] fixed content type meta tag in HTML report headers --- Core/src/org/sleuthkit/autopsy/report/ReportHTML.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportHTML.java b/Core/src/org/sleuthkit/autopsy/report/ReportHTML.java index 4a57d802d7..7bc633a320 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportHTML.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportHTML.java @@ -852,6 +852,7 @@ class ReportHTML implements TableReportModule { NbBundle.getMessage(this.getClass(), "ReportHTML.writeIndex.title", currentCase.getName())).append( "\n"); //NON-NLS index.append("\n"); //NON-NLS + index.append("\n"); //NON-NLS index.append("\n"); //NON-NLS index.append("\n"); //NON-NLS index.append("\n"); //NON-NLS @@ -890,7 +891,8 @@ class ReportHTML implements TableReportModule { StringBuilder nav = new StringBuilder(); nav.append("\n\n\t").append( //NON-NLS NbBundle.getMessage(this.getClass(), "ReportHTML.writeNav.title")) - .append("\n\t\n\n\n"); //NON-NLS + .append("\n\t\n"); //NON-NLS + nav.append("\n\n\n"); //NON-NLS nav.append("
\n

").append( //NON-NLS NbBundle.getMessage(this.getClass(), "ReportHTML.writeNav.h1")).append("

\n"); //NON-NLS nav.append("
    \n"); //NON-NLS @@ -983,6 +985,7 @@ class ReportHTML implements TableReportModule { head.append("\n\n").append( //NON-NLS NbBundle.getMessage(this.getClass(), "ReportHTML.writeSum.title")).append("\n"); //NON-NLS head.append("