Merge branch 'develop' of https://github.com/sleuthkit/autopsy into 6065-contactbook-personas

This commit is contained in:
Raman Arora 2020-04-29 13:29:29 -04:00
commit 26bb492920
42 changed files with 2346 additions and 256 deletions

View File

@ -55,6 +55,10 @@ Case.exceptionMessage.unsupportedSchemaVersionMessage=Unsupported case database
Case.lockingException.couldNotAcquireExclusiveLock=Failed to get a exclusive lock on the case.
Case.lockingException.couldNotAcquireSharedLock=Failed to get an shared lock on the case.
Case.open.exception.multiUserCaseNotEnabled=Cannot open a multi-user case if multi-user cases are not enabled. See Tools, Options, Multi-User.
# {0} - image
Case.openFileSystems.openingImage=Opening all filesystems for image: {0}...
# {0} - case
Case.openFileSystems.retrievingImages=Retrieving images for case: {0}...
Case.progressIndicatorCancelButton.label=Cancel
Case.progressIndicatorTitle.closingCase=Closing Case
Case.progressIndicatorTitle.creatingCase=Creating Case
@ -186,7 +190,6 @@ NewCaseVisualPanel1.caseNameLabel.text_1=Case Name:
NewCaseVisualPanel1.caseDirLabel.text=Base Directory:
NewCaseVisualPanel1.caseDirBrowseButton.text=Browse
NewCaseVisualPanel1.caseNameTextField.text_1=
NewCaseVisualPanel1.jLabel2.text_1=Case data will be stored in the following directory:
NewCaseVisualPanel1.caseParentDirTextField.text=
NewCaseVisualPanel1.caseDirTextField.text_1=
CueBannerPanel.autopsyLogo.text=
@ -467,3 +470,4 @@ UnpackagePortableCaseProgressDialog.okButton.text=OK
UnpackagePortableCaseProgressDialog.resultLabel.text=resultLabel
UnpackagePortableCaseDialog.extractLabel.text=Folder to extract to:
UnpackagePortableCaseDialog.caseLabel.text=Portable Case:
NewCaseVisualPanel1.caseDataStoredLabel.text_1=Case data will be stored in the following directory:

View File

@ -1555,7 +1555,19 @@ public class Case {
* @param newTag new ContentTag added
*/
public void notifyContentTagAdded(ContentTag newTag) {
eventPublisher.publish(new ContentTagAddedEvent(newTag));
notifyContentTagAdded(newTag, null);
}
/**
* Notifies case event subscribers that a content tag has been added.
*
* This should not be called from the event dispatch thread (EDT)
*
* @param newTag new ContentTag added
* @param deletedTag Removed ContentTag
*/
public void notifyContentTagAdded(ContentTag newTag, ContentTag deletedTag) {
eventPublisher.publish(new ContentTagAddedEvent(newTag, deletedTag));
}
/**
@ -1607,7 +1619,19 @@ public class Case {
* @param newTag new BlackboardArtifactTag added
*/
public void notifyBlackBoardArtifactTagAdded(BlackboardArtifactTag newTag) {
eventPublisher.publish(new BlackBoardArtifactTagAddedEvent(newTag));
notifyBlackBoardArtifactTagAdded(newTag, null);
}
/**
* Notifies case event subscribers that an artifact tag has been added.
*
* This should not be called from the event dispatch thread (EDT)
*
* @param newTag new BlackboardArtifactTag added
* @param removedTag The BlackboardArtifactTag that was removed.
*/
public void notifyBlackBoardArtifactTagAdded(BlackboardArtifactTag newTag, BlackboardArtifactTag removedTag) {
eventPublisher.publish(new BlackBoardArtifactTagAddedEvent(newTag, removedTag));
}
/**
@ -2006,7 +2030,7 @@ public class Case {
/**
* Starts a background task that reads a sector from each file system of
* each image of a case to do an eager open of the filesystems in the case.
* each image of a case to do an eager open of the filesystems in the case.
* If this method is called before another background file system read has
* finished the earlier one will be cancelled.
*

View File

@ -22,6 +22,7 @@ import java.io.Serializable;
import javax.annotation.concurrent.Immutable;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
import org.sleuthkit.autopsy.casemodule.events.BlackBoardArtifactTagDeletedEvent.DeletedBlackboardArtifactTagInfo;
import org.sleuthkit.datamodel.BlackboardArtifactTag;
import org.sleuthkit.datamodel.TskCoreException;
@ -37,6 +38,10 @@ public class BlackBoardArtifactTagAddedEvent extends TagAddedEvent<BlackboardArt
super(Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED.toString(), newTag);
}
public BlackBoardArtifactTagAddedEvent(BlackboardArtifactTag newTag, BlackboardArtifactTag removedTag) {
super(Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED.toString(), newTag, (removedTag != null ? new DeletedBlackboardArtifactTagInfo(removedTag) : null));
}
/**
* get the BlackboardArtifactTag that was added by its id
*

View File

@ -58,7 +58,7 @@ public class BlackBoardArtifactTagDeletedEvent extends TagDeletedEvent<Blackboar
private final long artifactID;
private DeletedBlackboardArtifactTagInfo(BlackboardArtifactTag deletedTag) {
DeletedBlackboardArtifactTagInfo(BlackboardArtifactTag deletedTag) {
super(deletedTag);
artifactID = deletedTag.getArtifact().getArtifactID();
contentID = deletedTag.getContent().getId();

View File

@ -22,6 +22,7 @@ import java.io.Serializable;
import javax.annotation.concurrent.Immutable;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
import org.sleuthkit.autopsy.casemodule.events.ContentTagDeletedEvent.DeletedContentTagInfo;
import org.sleuthkit.datamodel.ContentTag;
import org.sleuthkit.datamodel.TskCoreException;
@ -36,6 +37,10 @@ public class ContentTagAddedEvent extends TagAddedEvent<ContentTag> implements S
public ContentTagAddedEvent(ContentTag newTag) {
super(Case.Events.CONTENT_TAG_ADDED.toString(), newTag);
}
public ContentTagAddedEvent(ContentTag newTag, ContentTag deletedTag) {
super(Case.Events.CONTENT_TAG_ADDED.toString(), newTag, (deletedTag != null ? new DeletedContentTagInfo(deletedTag) : null));
}
/**
* get the ContentTag that was added by its id

View File

@ -58,7 +58,7 @@ public class ContentTagDeletedEvent extends TagDeletedEvent<ContentTag> implemen
private final long beginByteOffset;
private final long endByteOffset;
private DeletedContentTagInfo(ContentTag deletedTag) {
DeletedContentTagInfo(ContentTag deletedTag) {
super(deletedTag);
beginByteOffset = deletedTag.getBeginByteOffset();
endByteOffset = deletedTag.getEndByteOffset();

View File

@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.casemodule.events;
import java.io.Serializable;
import java.util.logging.Level;
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
import org.sleuthkit.autopsy.casemodule.events.TagDeletedEvent.DeletedTagInfo;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.events.AutopsyEvent;
import org.sleuthkit.datamodel.Tag;
@ -46,7 +47,11 @@ abstract class TagAddedEvent<T extends Tag> extends AutopsyEvent implements Seri
private final Long tagID;
TagAddedEvent(String propertyName, T addedTag) {
super(propertyName, null, null);
this(propertyName, addedTag, null);
}
TagAddedEvent(String propertyName, T addedTag, DeletedTagInfo<T> deletedTagInfo) {
super(propertyName, deletedTagInfo, null);
tag = addedTag;
tagID = addedTag.getId();
}

View File

View File

@ -20,19 +20,22 @@ package org.sleuthkit.autopsy.casemodule.services;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.logging.Level;
import javax.annotation.concurrent.Immutable;
import org.openide.util.NbBundle;
import org.openide.util.NbBundle.Messages;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.ModuleSettings;
import org.sleuthkit.datamodel.TagName;
import org.sleuthkit.autopsy.datamodel.DhsImageCategory;
import org.sleuthkit.datamodel.SleuthkitCase;
import org.sleuthkit.datamodel.TskCoreException;
import org.sleuthkit.datamodel.TskData;
@ -44,22 +47,42 @@ import org.sleuthkit.datamodel.TskData;
final class TagNameDefinition implements Comparable<TagNameDefinition> {
private static final Logger LOGGER = Logger.getLogger(TagNameDefinition.class.getName());
@NbBundle.Messages({"TagNameDefinition.predefTagNames.bookmark.text=Bookmark",
@Messages({
"TagNameDefinition.predefTagNames.bookmark.text=Bookmark",
"TagNameDefinition.predefTagNames.followUp.text=Follow Up",
"TagNameDefinition.predefTagNames.notableItem.text=Notable Item"})
private static final String TAGS_SETTINGS_NAME = "Tags"; //NON-NLS
private static final String TAG_NAMES_SETTING_KEY = "TagNames"; //NON-NLS
"TagNameDefinition.predefTagNames.notableItem.text=Notable Item",})
private static final String TAGS_SETTINGS_NAME = "Tags"; //NON-NLS
private static final String TAG_NAMES_SETTING_KEY = "TagNames"; //NON-NLS
private static final String TAG_SETTING_VERSION_KEY = "CustomTagNameVersion";
private static final int TAG_SETTINGS_VERSION = 1;
private static final String CATEGORY_ONE_NAME = "CAT-1: Child Exploitation (Illegal)";
private static final String CATEGORY_TWO_NAME = "CAT-2: Child Exploitation (Non-Illegal/Age Difficult)";
private static final String CATEGORY_THREE_NAME = "CAT-3: CGI/Animation (Child Exploitive)";
private static final String CATEGORY_FOUR_NAME = "CAT-4: Exemplar/Comparison (Internal Use Only)";
private static final String CATEGORY_FIVE_NAME = "CAT-5: Non-pertinent";
private static final List<String> STANDARD_NOTABLE_TAG_DISPLAY_NAMES = Arrays.asList(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), DhsImageCategory.ONE.getDisplayName(), DhsImageCategory.TWO.getDisplayName(), DhsImageCategory.THREE.getDisplayName()); // NON-NLS
private static final List<String> STANDARD_TAG_DISPLAY_NAMES = Arrays.asList(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), Bundle.TagNameDefinition_predefTagNames_followUp_text(),
Bundle.TagNameDefinition_predefTagNames_notableItem_text(), DhsImageCategory.ONE.getDisplayName(),
DhsImageCategory.TWO.getDisplayName(), DhsImageCategory.THREE.getDisplayName(),
DhsImageCategory.FOUR.getDisplayName(), DhsImageCategory.FIVE.getDisplayName(), DhsImageCategory.ZERO.getDisplayName());
private final String displayName;
private final String description;
private final TagName.HTML_COLOR color;
private final TskData.FileKnown knownStatus;
private static final Map<String, TagNameDefinition> STANDARD_TAGS_DEFINITIONS = new HashMap<>();
private static final Map<String, TagNameDefinition> PROJECT_VIC_TAG_DEFINITIONS = new HashMap<>();
static {
STANDARD_TAGS_DEFINITIONS.put(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN));
STANDARD_TAGS_DEFINITIONS.put(Bundle.TagNameDefinition_predefTagNames_followUp_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_followUp_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN));
STANDARD_TAGS_DEFINITIONS.put(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.BAD));
PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_ONE_NAME, new TagNameDefinition(CATEGORY_ONE_NAME, "", TagName.HTML_COLOR.RED, TskData.FileKnown.BAD));
PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_TWO_NAME, new TagNameDefinition(CATEGORY_TWO_NAME, "", TagName.HTML_COLOR.LIME, TskData.FileKnown.BAD));
PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_THREE_NAME, new TagNameDefinition(CATEGORY_THREE_NAME, "", TagName.HTML_COLOR.YELLOW, TskData.FileKnown.BAD));
PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_FOUR_NAME, new TagNameDefinition(CATEGORY_FOUR_NAME, "", TagName.HTML_COLOR.PURPLE, TskData.FileKnown.UNKNOWN));
PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_FIVE_NAME, new TagNameDefinition(CATEGORY_FIVE_NAME, "", TagName.HTML_COLOR.SILVER, TskData.FileKnown.UNKNOWN));
}
/**
* Constructs a tag name definition consisting of a display name,
* description, color and knownStatus.
@ -76,8 +99,20 @@ final class TagNameDefinition implements Comparable<TagNameDefinition> {
this.knownStatus = status;
}
static Collection<TagNameDefinition> getProjectVICDefaultDefinitions() {
return Collections.unmodifiableCollection(PROJECT_VIC_TAG_DEFINITIONS.values());
}
static Collection<TagNameDefinition> getStandardTagNameDefinitions() {
return Collections.unmodifiableCollection(STANDARD_TAGS_DEFINITIONS.values());
}
static List<String> getStandardTagNames() {
return STANDARD_TAG_DISPLAY_NAMES;
List<String> strList = new ArrayList<>();
strList.addAll(STANDARD_TAGS_DEFINITIONS.keySet());
strList.addAll(PROJECT_VIC_TAG_DEFINITIONS.keySet());
return strList;
}
/**
@ -194,94 +229,41 @@ final class TagNameDefinition implements Comparable<TagNameDefinition> {
* Gets tag name definitions from the tag settings file as well as the
* default tag name definitions.
*
* The currently custom tags properties are stored in one string property
* value separated by ;. The properties of an individual tag are comma
* separated in the format of:
* tag_name,tag_description,tag_color,known_status
*
* In prior versions of autopsy the known_status was stored in the central
* repository, therefore the properties file only had three values.
*
* @return A set of tag name definition objects.
*/
static synchronized Set<TagNameDefinition> getTagNameDefinitions() {
Set<TagNameDefinition> tagNames = new LinkedHashSet<>();
//modifiable copy of default tags list for us to keep track of which default tags have already been created
Set<String> standardTags = new LinkedHashSet<>(STANDARD_TAG_DISPLAY_NAMES);
String setting = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY);
if (null != setting && !setting.isEmpty()) {
List<String> tagNameTuples = Arrays.asList(setting.split(";"));
int numberOfAttributes = 0;
if (tagNameTuples.size() > 0) {
// Determine if Tags.properties file needs to be upgraded
numberOfAttributes = tagNameTuples.get(0).split(",").length;
}
if (numberOfAttributes == 3) {
// Upgrade Tags.Properties with the settings in Central Repository Settings if necessary
tagNames.addAll(upgradeTagPropertiesFile(tagNameTuples, standardTags));
} else if (numberOfAttributes == 4) {
// if the Tags.Properties file is up to date parse it
tagNames.addAll(readCurrentTagPropertiesFile(tagNameTuples, standardTags));
}
if (needsVersionUpdate()) {
updateTagDefinitions();
}
//create standard tags which should always exist which were not already created for whatever reason, such as upgrade
for (String standardTagName : standardTags) {
if (STANDARD_NOTABLE_TAG_DISPLAY_NAMES.contains(standardTagName)) {
tagNames.add(new TagNameDefinition(standardTagName, "", TagName.HTML_COLOR.NONE, TskData.FileKnown.BAD));
} else {
tagNames.add(new TagNameDefinition(standardTagName, "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN));
}
}
return tagNames;
}
String tagsProperty = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY);
if (tagsProperty == null || tagsProperty.isEmpty()) {
return new HashSet<>();
}
/**
* Read the central repository properties file to get any knownStatus
* related tag settings that may exist in it.
*
* @param tagProperties the list of comma seperated tags in the
* Tags.properties file
* @param standardTagsToBeCreated the list of standard tags which have yet
* to be created
*
* @return tagNames a list of TagNameDefinitions
*/
private static Set<TagNameDefinition> upgradeTagPropertiesFile(List<String> tagProperties, Set<String> standardTagsToBeCreated) {
Set<TagNameDefinition> tagNames = new LinkedHashSet<>();
List<String> legacyNotableTags = new ArrayList<>();
String badTagsStr = ModuleSettings.getConfigSetting("CentralRepository", "db.badTags"); // NON-NLS
if (badTagsStr == null || badTagsStr.isEmpty()) { //if there were no bad tags in the central repo properties file use the default list
legacyNotableTags.addAll(STANDARD_NOTABLE_TAG_DISPLAY_NAMES);
} else { //otherwise use the list that was in the central repository properties file
legacyNotableTags.addAll(Arrays.asList(badTagsStr.split(",")));
}
for (String tagNameTuple : tagProperties) {
String[] tagNameAttributes = tagNameTuple.split(","); //get the attributes
standardTagsToBeCreated.remove(tagNameAttributes[0]); //remove the tag from the list of standard tags which have not been created
if (legacyNotableTags.contains(tagNameAttributes[0])) { //if tag should be notable mark create it as such
tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1],
TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.BAD));
} else { //otherwise create it as unknown
tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1],
TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.UNKNOWN)); //add the default value for that tag
}
}
return tagNames;
}
List<String> individualTags = Arrays.asList(tagsProperty.split(";"));
/**
* Read the Tags.properties file to get the TagNameDefinitions that are
* preserved accross cases.
*
* @param tagProperties the list of comma seperated tags in the
* Tags.properties file
* @param standardTagsToBeCreated the list of standard tags which have yet
* to be created
*
* @return tagNames a list of TagNameDefinitions
*/
private static Set<TagNameDefinition> readCurrentTagPropertiesFile(List<String> tagProperties, Set<String> standardTagsToBeCreated) {
Set<TagNameDefinition> tagNames = new LinkedHashSet<>();
for (String tagNameTuple : tagProperties) {
String[] tagNameAttributes = tagNameTuple.split(","); //get the attributes
standardTagsToBeCreated.remove(tagNameAttributes[0]); //remove the tag from the list of standard tags which have not been created
tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1],
TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.valueOf(tagNameAttributes[3])));
if (individualTags == null || individualTags.isEmpty()) {
return new HashSet<>();
}
return tagNames;
Set<TagNameDefinition> definitions = new HashSet<>();
for (String tagProps : individualTags) {
String[] attributes = tagProps.split(",");
definitions.add(new TagNameDefinition(attributes[0], attributes[1],
TagName.HTML_COLOR.valueOf(attributes[2]), TskData.FileKnown.valueOf(attributes[3])));
}
return definitions;
}
/**
@ -303,7 +285,113 @@ final class TagNameDefinition implements Comparable<TagNameDefinition> {
LOGGER.log(Level.SEVERE, "Exception while getting open case.", ex);
}
}
ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY, Integer.toString(TAG_SETTINGS_VERSION));
ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY, setting.toString());
}
/**
* Updates the Tag Definition file to the current format.
*/
private static void updateTagDefinitions() {
Integer version = getPropertyFileVersion();
List<TagNameDefinition> definitions = new ArrayList<>();
if (version == null) {
String tagsProperty = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY);
if (tagsProperty == null || tagsProperty.isEmpty()) {
return;
}
List<String> individualTags = Arrays.asList(tagsProperty.split(";"));
if (individualTags == null || individualTags.isEmpty()) {
return;
}
List<String> notableTagList = null;
for (String tagProps : individualTags) {
String[] attributes = tagProps.split(",");
TskData.FileKnown fileKnown = TskData.FileKnown.UNKNOWN;
if (attributes.length == 3) {
// If notableTagList is null load it from the CR.
if (notableTagList == null) {
notableTagList = getCRNotableList();
} else {
if (notableTagList.contains(attributes[0])) {
fileKnown = TskData.FileKnown.BAD;
}
}
} else {
fileKnown = TskData.FileKnown.valueOf(attributes[3]);
}
definitions.add(new TagNameDefinition(attributes[0], attributes[1],
TagName.HTML_COLOR.valueOf(attributes[2]), fileKnown));
}
}
if (definitions.isEmpty()) {
return;
}
// Remove the standard and Project VIC tags from the list
List<String> tagStrings = new ArrayList<>();
List<String> standardTags = getStandardTagNames();
for (TagNameDefinition def : definitions) {
if (!standardTags.contains(def.getDisplayName())) {
tagStrings.add(def.toSettingsFormat());
}
}
// Write out the version and the new tag list.
ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY, Integer.toString(TAG_SETTINGS_VERSION));
ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY, String.join(";", tagStrings));
}
/**
* Returns a list notable tag names from the CR bagTag list.
*
* @return A list of tag names, or empty list if none were found.
*/
private static List<String> getCRNotableList() {
String notableTagsProp = ModuleSettings.getConfigSetting("CentralRepository", "db.badTags"); // NON-NLS
if (notableTagsProp != null && !notableTagsProp.isEmpty()) {
return Arrays.asList(notableTagsProp.split(","));
}
return new ArrayList<>();
}
/**
* Based on the version in the Tags property file, returns whether or not
* the file needs updating.
*
* @return
*/
private static boolean needsVersionUpdate() {
Integer version = getPropertyFileVersion();
return version == null || version < TAG_SETTINGS_VERSION;
}
/**
* Returns the Tags property file version.
*
* @return The current version of tags property file, or null if no version
* was found.
*/
private static Integer getPropertyFileVersion() {
String version = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY);
if (version == null || version.isEmpty()) {
return null;
}
try {
return Integer.parseInt(version);
} catch (NumberFormatException ex) {
// The version is not an integer
return null;
}
}
}

View File

View File

@ -446,8 +446,7 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
boolean isSelected = tagNamesList.getSelectedIndex() != -1;
boolean enableEdit = !ingestIsRunning && isSelected;
editTagNameButton.setEnabled(enableEdit);
boolean enableDelete = enableEdit && !TagNameDefinition.getStandardTagNames().contains(tagNamesList.getSelectedValue().getDisplayName());
deleteTagNameButton.setEnabled(enableDelete);
deleteTagNameButton.setEnabled(enableEdit);
if (isSelected) {
descriptionTextArea.setText(tagNamesList.getSelectedValue().getDescription());
if (tagNamesList.getSelectedValue().getKnownStatus() == TskData.FileKnown.BAD) {

View File

@ -40,6 +40,8 @@ import org.sleuthkit.datamodel.Content;
import org.sleuthkit.datamodel.ContentTag;
import org.sleuthkit.datamodel.SleuthkitCase;
import org.sleuthkit.datamodel.TagName;
import org.sleuthkit.datamodel.TagSet;
import org.sleuthkit.datamodel.TaggingManager;
import org.sleuthkit.datamodel.TskCoreException;
import org.sleuthkit.datamodel.TskData;
import org.sleuthkit.datamodel.TskData.DbType;
@ -52,9 +54,12 @@ public class TagsManager implements Closeable {
private static final Logger LOGGER = Logger.getLogger(TagsManager.class.getName());
private final SleuthkitCase caseDb;
static String DEFAULT_TAG_SET_NAME = "Project VIC (United States)";
static {
//Create the contentviewer tags table (beta) if the current case does not
//Create the contentviewer tags table if the current case does not
//have the table present
Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), evt -> {
if (evt.getNewValue() != null) {
@ -64,7 +69,7 @@ public class TagsManager implements Closeable {
if (caseDb.tableExists(ContentViewerTagManager.TABLE_NAME)) {
return;
}
if (currentCase.getSleuthkitCase().getDatabaseType().equals(DbType.SQLITE)) {
caseDb.createTable(ContentViewerTagManager.TABLE_NAME, ContentViewerTagManager.TABLE_SCHEMA_SQLITE);
} else if (currentCase.getSleuthkitCase().getDatabaseType().equals(DbType.POSTGRESQL)) {
@ -168,6 +173,28 @@ public class TagsManager implements Closeable {
*/
TagsManager(SleuthkitCase caseDb) {
this.caseDb = caseDb;
// Add standard tags and the Project VIC default tag set and tags.
TaggingManager taggingMgr = caseDb.getTaggingManager();
try {
List<TagSet> setList = taggingMgr.getTagSets();
if (setList.isEmpty()) {
//Assume new case and add Project VIC tags.
List<TagName> tagNameList = new ArrayList<>();
for (TagNameDefinition def : TagNameDefinition.getProjectVICDefaultDefinitions()) {
tagNameList.add(caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus()));
}
taggingMgr.addTagSet(DEFAULT_TAG_SET_NAME, tagNameList);
for (TagNameDefinition def : TagNameDefinition.getStandardTagNameDefinitions()) {
caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus());
}
}
} catch (TskCoreException ex) {
LOGGER.log(Level.SEVERE, "Error updating non-file object ", ex);
}
for (TagNameDefinition tagName : TagNameDefinition.getTagNameDefinitions()) {
tagName.saveToCase(caseDb);
}
@ -242,7 +269,8 @@ public class TagsManager implements Closeable {
/**
* Selects all of the rows from the tag_names table in the case database for
* which there is at least one matching row in the content_tags or
* blackboard_artifact_tags tables, for the given data source object id and user.
* blackboard_artifact_tags tables, for the given data source object id and
* user.
*
* @param dsObjId data source object id
* @param userName - the user name that you want to get tags for
@ -449,14 +477,16 @@ public class TagsManager implements Closeable {
* database.
*/
public ContentTag addContentTag(Content content, TagName tagName, String comment, long beginByteOffset, long endByteOffset) throws TskCoreException {
ContentTag tag;
tag = caseDb.addContentTag(content, tagName, comment, beginByteOffset, endByteOffset);
TaggingManager.ContentTagChange tagChange = caseDb.getTaggingManager().addContentTag(content, tagName, comment, beginByteOffset, endByteOffset);
try {
Case.getCurrentCaseThrows().notifyContentTagAdded(tag);
Case currentCase = Case.getCurrentCaseThrows();
currentCase.notifyContentTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags().get(0));
} catch (NoCurrentCaseException ex) {
throw new TskCoreException("Added a tag to a closed case", ex);
}
return tag;
return tagChange.getAddedTag();
}
/**
@ -668,13 +698,14 @@ public class TagsManager implements Closeable {
* database.
*/
public BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment) throws TskCoreException {
BlackboardArtifactTag tag = caseDb.addBlackboardArtifactTag(artifact, tagName, comment);
TaggingManager.BlackboardArtifactTagChange tagChange = caseDb.getTaggingManager().addArtifactTag(artifact, tagName, comment);
try {
Case.getCurrentCaseThrows().notifyBlackBoardArtifactTagAdded(tag);
Case currentCase = Case.getCurrentCaseThrows();
currentCase.notifyBlackBoardArtifactTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags().get(0));
} catch (NoCurrentCaseException ex) {
throw new TskCoreException("Added a tag to a closed case", ex);
}
return tag;
return tagChange.getAddedTag();
}
/**

View File

@ -19,11 +19,13 @@
package org.sleuthkit.autopsy.communications;
import java.util.Collection;
import java.util.stream.Collectors;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JMenuItem;
import org.openide.util.Utilities;
import org.openide.util.actions.Presenter;
import org.sleuthkit.datamodel.AccountDeviceInstance;
/**
* Base class for actions that act on the selected AccountDeviceInstanceKeys.
@ -37,8 +39,11 @@ abstract class AbstractCVTAction extends AbstractAction implements Presenter.Pop
*
* @return The selected accounts
*/
Collection<? extends AccountDeviceInstanceKey> getSelectedAccounts() {
return Utilities.actionsGlobalContext().lookupAll(AccountDeviceInstanceKey.class);
Collection<? extends AccountDeviceInstance> getSelectedAccounts() {
return Utilities.actionsGlobalContext().lookupAll(AccountDeviceInstanceKey.class)
.stream()
.map((adiKey -> adiKey.getAccountDeviceInstance()))
.collect(Collectors.toSet());
}
@Override

View File

@ -24,6 +24,7 @@ import java.util.Collection;
import org.sleuthkit.autopsy.communications.FiltersPanel.DateControlState;
import org.sleuthkit.datamodel.CommunicationsFilter;
import org.sleuthkit.autopsy.communications.StateManager.CommunicationsState;
import org.sleuthkit.datamodel.AccountDeviceInstance;
/**
* Provide the singleton EventBus.
@ -73,19 +74,19 @@ final class CVTEvents {
*/
static final class PinAccountsEvent {
private final ImmutableSet<AccountDeviceInstanceKey> accountDeviceInstances;
private final ImmutableSet<AccountDeviceInstance> accounInstances;
private final boolean replace;
public boolean isReplace() {
return replace;
}
ImmutableSet<AccountDeviceInstanceKey> getAccountDeviceInstances() {
return accountDeviceInstances;
ImmutableSet<AccountDeviceInstance> getAccountDeviceInstances() {
return accounInstances;
}
PinAccountsEvent(Collection<? extends AccountDeviceInstanceKey> accountDeviceInstances, boolean replace) {
this.accountDeviceInstances = ImmutableSet.copyOf(accountDeviceInstances);
PinAccountsEvent(Collection<? extends AccountDeviceInstance> accountDeviceInstances, boolean replace) {
this.accounInstances = ImmutableSet.copyOf(accountDeviceInstances);
this.replace = replace;
}
}
@ -95,14 +96,14 @@ final class CVTEvents {
*/
static final class UnpinAccountsEvent {
private final ImmutableSet<AccountDeviceInstanceKey> accountDeviceInstances;
private final ImmutableSet<AccountDeviceInstance> accountInstances;
public ImmutableSet<AccountDeviceInstanceKey> getAccountDeviceInstances() {
return accountDeviceInstances;
public ImmutableSet<AccountDeviceInstance> getAccountDeviceInstances() {
return accountInstances;
}
UnpinAccountsEvent(Collection<? extends AccountDeviceInstanceKey> accountDeviceInstances) {
this.accountDeviceInstances = ImmutableSet.copyOf(accountDeviceInstances);
UnpinAccountsEvent(Collection<? extends AccountDeviceInstance> accountDeviceInstances) {
this.accountInstances = ImmutableSet.copyOf(accountDeviceInstances);
}
}

View File

@ -32,6 +32,7 @@ import java.io.InputStreamReader;
import java.io.StringWriter;
import java.net.URL;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ -147,7 +148,7 @@ final class CommunicationsGraph extends mxGraph {
scopes.put("accountName", adiKey.getAccountDeviceInstance().getAccount().getTypeSpecificID());
scopes.put("size", Math.round(Math.log(adiKey.getMessageCount()) + 5));
scopes.put("iconFileName", CommunicationsGraph.class.getResource(Utils.getIconFilePath(adiKey.getAccountDeviceInstance().getAccount().getAccountType())));
scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey));
scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey.getAccountDeviceInstance()));
scopes.put("MARKER_PIN_URL", MARKER_PIN_URL);
scopes.put("locked", lockedVertexModel.isVertexLocked((mxCell) cell));
scopes.put("LOCK_URL", LOCK_URL);
@ -172,7 +173,7 @@ final class CommunicationsGraph extends mxGraph {
scopes.put("accountName", adiKey.getAccountDeviceInstance().getAccount().getTypeSpecificID());
scopes.put("relationships", 12);// Math.round(Math.log(adiKey.getMessageCount()) + 5));
scopes.put("iconFileName", CommunicationsGraph.class.getResource(Utils.getIconFilePath(adiKey.getAccountDeviceInstance().getAccount().getAccountType())));
scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey));
scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey.getAccountDeviceInstance()));
scopes.put("MARKER_PIN_URL", MARKER_PIN_URL);
scopes.put("locked", lockedVertexModel.isVertexLocked((mxCell) cell));
scopes.put("LOCK_URL", LOCK_URL);
@ -199,16 +200,24 @@ final class CommunicationsGraph extends mxGraph {
lockedVertexModel.clear();
}
private mxCell getOrCreateVertex(AccountDeviceInstanceKey accountDeviceInstanceKey) {
final AccountDeviceInstance accountDeviceInstance = accountDeviceInstanceKey.getAccountDeviceInstance();
private mxCell getOrCreateVertex(AccountDeviceInstance adi, CommunicationsManager commsManager, CommunicationsFilter currentFilter) {
final AccountDeviceInstance accountDeviceInstance = adi;
final String name = accountDeviceInstance.getAccount().getTypeSpecificID();
final mxCell vertex = nodeMap.computeIfAbsent(name + accountDeviceInstance.getDeviceId(), vertexName -> {
double size = Math.sqrt(accountDeviceInstanceKey.getMessageCount()) + 10;
long adiRelationshipsCount = 1;
try {
adiRelationshipsCount = commsManager.getRelationshipSourcesCount(accountDeviceInstance, currentFilter);
} catch (TskCoreException tskCoreException) {
logger.log(Level.SEVERE, "There was an error fetching relationships for the node: " + accountDeviceInstance, tskCoreException);
}
double size = Math.sqrt(adiRelationshipsCount) + 10;
AccountDeviceInstanceKey adiKey = new AccountDeviceInstanceKey(adi, currentFilter, adiRelationshipsCount);
mxCell newVertex = (mxCell) insertVertex(
getDefaultParent(),
name, accountDeviceInstanceKey,
name, adiKey,
Math.random() * 400,
Math.random() * 400,
size,
@ -219,9 +228,11 @@ final class CommunicationsGraph extends mxGraph {
}
@SuppressWarnings("unchecked")
private mxCell addOrUpdateEdge(long relSources, AccountDeviceInstanceKey account1, AccountDeviceInstanceKey account2) {
mxCell vertex1 = getOrCreateVertex(account1);
mxCell vertex2 = getOrCreateVertex(account2);
private mxCell addOrUpdateEdge(long relSources,
AccountDeviceInstance account1, AccountDeviceInstance account2,
CommunicationsManager commsManager, CommunicationsFilter currentFilter) {
mxCell vertex1 = getOrCreateVertex(account1, commsManager, currentFilter);
mxCell vertex2 = getOrCreateVertex(account2, commsManager, currentFilter);
Object[] edgesBetween = getEdgesBetween(vertex1, vertex2);
mxCell edge;
if (edgesBetween.length == 0) {
@ -260,28 +271,24 @@ final class CommunicationsGraph extends mxGraph {
/**
* set to keep track of accounts related to pinned accounts
*/
final Map<AccountDeviceInstance, AccountDeviceInstanceKey> relatedAccounts = new HashMap<>();
for (final AccountDeviceInstanceKey adiKey : pinnedAccountModel.getPinnedAccounts()) {
final Set<AccountDeviceInstance> relatedAccounts = new HashSet<>();
for (final AccountDeviceInstance adi : pinnedAccountModel.getPinnedAccounts()) {
if (isCancelled()) {
break;
}
//get accounts related to pinned account
final List<AccountDeviceInstance> relatedAccountDeviceInstances
= commsManager.getRelatedAccountDeviceInstances(adiKey.getAccountDeviceInstance(), currentFilter);
relatedAccounts.put(adiKey.getAccountDeviceInstance(), adiKey);
getOrCreateVertex(adiKey);
= commsManager.getRelatedAccountDeviceInstances(adi, currentFilter);
relatedAccounts.add(adi);
getOrCreateVertex(adi, commsManager, currentFilter);
for (final AccountDeviceInstance relatedADI : relatedAccountDeviceInstances)
relatedAccounts.add(relatedADI);
for (final AccountDeviceInstance relatedADI : relatedAccountDeviceInstances) {
final long adiRelationshipsCount = commsManager.getRelationshipSourcesCount(relatedADI, currentFilter);
final AccountDeviceInstanceKey relatedADIKey = new AccountDeviceInstanceKey(relatedADI, currentFilter, adiRelationshipsCount);
relatedAccounts.put(relatedADI, relatedADIKey); //store related accounts
}
progressIndicator.progress(++progressCounter);
}
Set<AccountDeviceInstance> accounts = relatedAccounts.keySet();
Map<AccountPair, Long> relationshipCounts = commsManager.getRelationshipCountsPairwise(accounts, currentFilter);
Map<AccountPair, Long> relationshipCounts = commsManager.getRelationshipCountsPairwise(relatedAccounts, currentFilter);
int total = relationshipCounts.size();
int progress = 0;
@ -290,12 +297,12 @@ final class CommunicationsGraph extends mxGraph {
for (Map.Entry<AccountPair, Long> entry : relationshipCounts.entrySet()) {
Long count = entry.getValue();
AccountPair relationshipKey = entry.getKey();
AccountDeviceInstanceKey account1 = relatedAccounts.get(relationshipKey.getFirst());
AccountDeviceInstanceKey account2 = relatedAccounts.get(relationshipKey.getSecond());
AccountDeviceInstance account1 = relationshipKey.getFirst();
AccountDeviceInstance account2 = relationshipKey.getSecond();
if (pinnedAccountModel.isAccountPinned(account1)
|| pinnedAccountModel.isAccountPinned(account2)) {
mxCell addEdge = addOrUpdateEdge(count, account1, account2);
mxCell addEdge = addOrUpdateEdge(count, account1, account2, commsManager, currentFilter);
progressText = addEdge.getId();
}
progressIndicator.progress(progressText, progress++);

View File

@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableSet;
import com.google.common.eventbus.EventBus;
import java.util.HashSet;
import java.util.Set;
import org.sleuthkit.datamodel.AccountDeviceInstance;
/**
* Model of what accounts are pinned to a visualization.
@ -34,7 +35,7 @@ class PinnedAccountModel {
* to pinned accounts and pass the filters are show. Pinning accounts is the
* primary way to populate the graph.
*/
private final Set<AccountDeviceInstanceKey> pinnedAccountDevices = new HashSet<>();
private final Set<AccountDeviceInstance> pinnedAccountDevices = new HashSet<>();
private final EventBus eventBus = new EventBus();
@ -46,7 +47,7 @@ class PinnedAccountModel {
eventBus.unregister(handler);
}
boolean isAccountPinned(AccountDeviceInstanceKey account) {
boolean isAccountPinned(AccountDeviceInstance account) {
return pinnedAccountDevices.contains(account);
}
@ -57,7 +58,7 @@ class PinnedAccountModel {
*
* @param accountDeviceInstances The accounts to unpin.
*/
void unpinAccount(Set<AccountDeviceInstanceKey> accountDeviceInstances) {
void unpinAccount(Set<AccountDeviceInstance> accountDeviceInstances) {
pinnedAccountDevices.removeAll(accountDeviceInstances);
}
@ -68,7 +69,7 @@ class PinnedAccountModel {
*
* @param accountDeviceInstances The accounts to pin.
*/
void pinAccount(Set<AccountDeviceInstanceKey> accountDeviceInstances) {
void pinAccount(Set<AccountDeviceInstance> accountDeviceInstances) {
pinnedAccountDevices.addAll(accountDeviceInstances);
}
@ -86,7 +87,7 @@ class PinnedAccountModel {
pinnedAccountDevices.clear();
}
ImmutableSet<AccountDeviceInstanceKey> getPinnedAccounts() {
ImmutableSet<AccountDeviceInstance> getPinnedAccounts() {
return ImmutableSet.copyOf(pinnedAccountDevices);
}

View File

@ -23,6 +23,7 @@ import java.util.HashSet;
import java.util.Set;
import org.sleuthkit.autopsy.communications.FiltersPanel.DateControlState;
import org.sleuthkit.autopsy.coreutils.History;
import org.sleuthkit.datamodel.AccountDeviceInstance;
import org.sleuthkit.datamodel.CommunicationsFilter;
/**
@ -51,11 +52,11 @@ final class StateManager {
@Subscribe
void pinAccount(CVTEvents.PinAccountsEvent pinEvent) {
if(pinEvent.isReplace()){
HashSet<AccountDeviceInstanceKey> pinnedList = new HashSet<>();
HashSet<AccountDeviceInstance> pinnedList = new HashSet<>();
pinnedList.addAll(pinEvent.getAccountDeviceInstances());
historyManager.advance(new CommunicationsState(comFilter, pinnedList, -1, currentStartState, currentEndState));
} else {
HashSet<AccountDeviceInstanceKey> pinnedList = new HashSet<>();
HashSet<AccountDeviceInstance> pinnedList = new HashSet<>();
pinnedList.addAll(pinEvent.getAccountDeviceInstances());
pinnedList.addAll(pinModel.getPinnedAccounts());
@ -74,7 +75,7 @@ final class StateManager {
@Subscribe
void unpinAccounts(CVTEvents.UnpinAccountsEvent pinEvent) {
HashSet<AccountDeviceInstanceKey> pinnedList = new HashSet<>();
HashSet<AccountDeviceInstance> pinnedList = new HashSet<>();
pinnedList.addAll(pinModel.getPinnedAccounts());
pinnedList.removeAll(pinEvent.getAccountDeviceInstances());
@ -135,7 +136,7 @@ final class StateManager {
*/
final class CommunicationsState{
private final CommunicationsFilter communcationFilter;
private final Set<AccountDeviceInstanceKey> pinnedList;
private final Set<AccountDeviceInstance> pinnedList;
private final double zoomValue;
private final DateControlState startDateState;
private final DateControlState endDateState;
@ -149,7 +150,7 @@ final class StateManager {
* @param zoomValue Double value of the current graph scale
*/
protected CommunicationsState(CommunicationsFilter communcationFilter,
Set<AccountDeviceInstanceKey> pinnedList, double zoomValue,
Set<AccountDeviceInstance> pinnedList, double zoomValue,
DateControlState startDateState, DateControlState endDateState){
this.pinnedList = pinnedList;
this.communcationFilter = communcationFilter;
@ -172,7 +173,7 @@ final class StateManager {
*
* @return Set of AccountDeviceInstanceKey
*/
public Set<AccountDeviceInstanceKey> getPinnedList(){
public Set<AccountDeviceInstance> getPinnedList(){
return pinnedList;
}

View File

@ -1100,7 +1100,7 @@ final public class VisualizationPanel extends JPanel {
} else {
jPopupMenu.add(new JMenuItem(new LockAction(selectedVertices)));
}
if (pinnedAccountModel.isAccountPinned(adiKey)) {
if (pinnedAccountModel.isAccountPinned(adiKey.getAccountDeviceInstance())) {
jPopupMenu.add(UnpinAccountsAction.getInstance().getPopupPresenter());
} else {
jPopupMenu.add(PinAccountsAction.getInstance().getPopupPresenter());

View File

@ -1,3 +1,19 @@
# Copyright 2014-2020 Basis Technology Corp.
#
# Copyright 2006-2017 ICEsoft Technologies Canada Corp.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an "AS
# IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
# express or implied. See the License for the specific language
# governing permissions and limitations under the License.
#
FXVideoPanel.pauseButton.infoLabel.playbackErr=Unable to play video.
FXVideoPanel.progress.bufferingCancelled=media buffering was canceled
@ -93,3 +109,848 @@ MediaPlayerPanel.playButton.text=
MediaPlayerPanel.infoLabel.text=No Errors
MediaPlayerPanel.VolumeIcon.text=Volume
MediaPlayerPanel.playBackSpeedLabel.text=Speed:
# The following message properties were taken from IcePDF 6.2.2 to allow
# for Japanese translation.
#
#####
### This MessageBundle contains English text for ICEpdf View and Pilot RI's
##
#
## Window toolbar Title
viewer.window.title.default = ICEpdf Viewer
viewer.window.title.open.default = ICEpdf Viewer - [{0}]
#status bar
viewer.statusbar.currentPage = Page {0} / {1}
viewer.common.number.one = 1
viewer.common.number.two = 2
viewer.common.number.three = 3
viewer.common.number.four = 4
viewer.common.number.five = 5
viewer.common.number.six = 6
viewer.common.number.seven = 7
viewer.common.number.eight = 8
viewer.common.number.nine = 9
viewer.common.number.ten = 10
viewer.common.number.eleven = 11
viewer.common.number.twelve = 12
viewer.common.number.thirteen = 13
viewer.common.number.fourteen = 14
viewer.common.number.fifteen = 15
viewer.common.number.sixteen = 16
viewer.common.number.seventeen = 17
viewer.common.number.eighteen = 18
viewer.common.number.nineteen = 19
viewer.common.number.twenty = 20
viewer.common.number.twentyOne = 21
viewer.common.number.twentyTwo = 22
viewer.common.number.twentyThree = 23
viewer.common.number.twentyFour = 24
viewer.common.number.twentyFive = 25
viewer.common.number.twentySix = 26
viewer.common.number.twentySeven = 27
viewer.common.number.thirtySix = 36
viewer.common.number.fortyEight = 48
## Top Page Control Toolbar
viewer.toolbar.hideToolBar.label = Hide Toolbar
viewer.toolbar.showToolBar.label = Show Toolbar
viewer.toolbar.showUtilityPane.label = Show Utility Pane
viewer.toolbar.hideUtilityPane.label = Hide Utility Pane
viewer.toolbar.open.label =
viewer.toolbar.open.tooltip = Open Document
viewer.toolbar.saveAs.label = Save As
viewer.toolbar.saveAs.tooltip = Save As...
viewer.toolbar.print.label = Print
viewer.toolbar.print.tooltip = Print Document
viewer.toolbar.search.label = Search
viewer.toolbar.search.tooltip = Search Document
viewer.toolbar.utilityPane.label = Utility Pane
viewer.toolbar.utilityPane.tooltip = Show/Hide Utility Pane
viewer.toolbar.navigation.label =
viewer.toolbar.navigation.pages.tooltip = Number of Pages
viewer.toolbar.navigation.pages.firstPage.label =
viewer.toolbar.navigation.current.tooltip = Current Page Number
viewer.toolbar.navigation.current.firstPage.label =
viewer.toolbar.navigation.firstPage.label =
viewer.toolbar.navigation.firstPage.tooltip = First Page
viewer.toolbar.navigation.previousPage.label =
viewer.toolbar.navigation.previousPage.tooltip = Previous Page
viewer.toolbar.navigation.nextPage.label =
viewer.toolbar.navigation.nextPage.tooltip = Next Page
viewer.toolbar.navigation.lastPage.label =
viewer.toolbar.navigation.lastPage.tooltip = Last Page
viewer.toolbar.pageIndicator = of {0}
viewer.toolbar.zoom.label =
viewer.toolbar.zoom.tooltip = Zoom
viewer.toolbar.zoom.out.label =
viewer.toolbar.zoom.out.tooltip = Zoom Out
viewer.toolbar.zoom.in.label =
viewer.toolbar.zoom.in.tooltip = Zoom In
viewer.toolbar.pageFit.actualsize.label =
viewer.toolbar.pageFit.actualsize.tooltip = Actual Size
viewer.toolbar.pageFit.fitWindow.label =
viewer.toolbar.pageFit.fitWindow.tooltip = Fit in Window
viewer.toolbar.pageFit.fitWidth.label =
viewer.toolbar.pageFit.fitWidth.tooltip = Fit Width
viewer.toolbar.rotation.left.label =
viewer.toolbar.rotation.left.tooltip = Rotate Left
viewer.toolbar.rotation.right.label =
viewer.toolbar.rotation.right.tooltip = Rotate Right
viewer.toolbar.tool.pan.label =
viewer.toolbar.tool.pan.tooltip = Pan Tool
viewer.toolbar.tool.text.label =
viewer.toolbar.tool.text.tooltip = Text Select Tool
viewer.toolbar.tool.select.label =
viewer.toolbar.tool.select.tooltip = Select Tool
viewer.toolbar.tool.link.label =
viewer.toolbar.tool.link.tooltip = Link Annotation Tool
viewer.toolbar.tool.highlight.label = Highlight
viewer.toolbar.tool.highlight.tooltip = Highlight Annotation Tool
viewer.toolbar.tool.strikeOut.label = Strike Out
viewer.toolbar.tool.strikeOut.tooltip = Strike Out Annotation Tool
viewer.toolbar.tool.underline.label = Underline
viewer.toolbar.tool.underline.tooltip = Underline Annotation Tool
viewer.toolbar.tool.line.label = Line
viewer.toolbar.tool.line.tooltip = Line Annotation Tool
viewer.toolbar.tool.lineArrow.label = Line Arrow
viewer.toolbar.tool.lineArrow.tooltip = Line Arrow Annotation Tool
viewer.toolbar.tool.rectangle.label = Rectangle
viewer.toolbar.tool.rectangle.tooltip = Rectangle Annotation Tool
viewer.toolbar.tool.circle.label = Circle
viewer.toolbar.tool.circle.tooltip = Circle Annotation Tool
viewer.toolbar.tool.ink.label = Ink
viewer.toolbar.tool.ink.tooltip = Ink Annotation Tool
viewer.toolbar.tool.freeText.label = Free Text
viewer.toolbar.tool.freeText.tooltip = Free Text Annotation Tool
viewer.toolbar.tool.textAnno.label = Text Annotation
viewer.toolbar.tool.textAnno.tooltip = Text Annotation Tool
viewer.toolbar.tool.plolyLine.label = Poly Line
viewer.toolbar.tool.plolyLine.tooltip = Poly Line Annotation Tool
viewer.toolbar.tool.zoomIn.label =
viewer.toolbar.tool.zoomIn.tooltip = Zoom In Tool
viewer.toolbar.tool.zoomMarquis.label =
viewer.toolbar.tool.zoomMarquis.tooltip = Zoom Marquee Tool
viewer.toolbar.tool.zoomDynamic.label =
viewer.toolbar.tool.zoomDynamic.tooltip = Zoom Dynamic Tool
viewer.toolbar.tool.zoomOut.label =
viewer.toolbar.tool.zoomOut.tooltip = Zoom Out Tool
viewer.toolbar.pageFit.fontEngine.label =
viewer.toolbar.pageFit.fontEngine.tooltip = Enable/Disable Font Engine
viewer.toolbar.tool.forms.highlight.label = Highlight Forms
viewer.toolbar.tool.forms.highlight.tooltip = Show/Hide Form Highlighting
## Bottom Page View Control Toolbar
viewer.toolbar.pageView.nonContinuous.singlePage.label =
viewer.toolbar.pageView.nonContinuous.singlePage.tooltip = Single Page View Non-Continuous
viewer.toolbar.pageView.nonContinuous.facingPage.label =
viewer.toolbar.pageView.nonContinuous.facingPage.tooltip = Facing Page View Non-Continuous
viewer.toolbar.pageView.continuous.singlePage.label =
viewer.toolbar.pageView.continuous.singlePage.tooltip = Single Page View Continuous
viewer.toolbar.pageView.continuous.facingPage.label =
viewer.toolbar.pageView.continuous.facingPage.tooltip = Facing Page View Continuous
## File Menu and submenu items
viewer.menu.file.label = File
viewer.menu.file.mnemonic = F
viewer.menu.open.label = Open
viewer.menu.open.file.label = File...
viewer.menu.open.URL.label = URL...
viewer.menu.close.label = Close
viewer.menu.saveAs.label = Save As...
viewer.menu.exportText.label = Export Text...
viewer.menu.exportSVG.label = Export SVG...
viewer.menu.documentPermission.label = Document Permissions...
viewer.menu.documentInformation.label = Document Information...
viewer.menu.documentFonts.label = Document Fonts...
viewer.menu.printSetup.label = Print Setup...
viewer.menu.print.label = Print...
viewer.menu.exit.label = Exit
## View Menu and submenu items
viewer.menu.edit.label = Edit
viewer.menu.edit.mnemonic = E
viewer.menu.edit.undo.label = Undo
viewer.menu.edit.redo.label = Redo
viewer.menu.edit.copy.label = Copy
viewer.menu.edit.delete.label = Delete
viewer.menu.edit.selectAll.label = Select All
viewer.menu.edit.deselectAll.label = Deselect All
## View Menu and submenu items
viewer.menu.view.label = View
viewer.menu.view.mnemonic = V
viewer.menu.view.actualSize.label = Actual Size
viewer.menu.view.fitInWindow.label = Fit in Window
viewer.menu.view.fitWidth.label = Fit Width
viewer.menu.view.zoomIn.label = Zoom In
viewer.menu.view.zoomOut.label = Zoom Out
viewer.menu.view.rotateLeft.label = Rotate Left
viewer.menu.view.rotateRight.label = Rotate Right
viewer.menu.view.hideToolBar.label = Hide Toolbar
viewer.menu.view.showToolBar.label = Show Toolbar
viewer.menu.view.showUtilityPane.label = Show Utility Pane
viewer.menu.view.hideUtilityPane.label = Hide Utility Pane
## Document Menu and submenu items
viewer.menu.document.label = Document
viewer.menu.document.mnemonic = D
viewer.menu.document.firstPage.label = First Page
viewer.menu.document.previousPage.label = Previous Page
viewer.menu.document.nextPage.label = Next Page
viewer.menu.document.lastPage.label = Last Page
viewer.menu.document.search.label = Search...
viewer.menu.document.gotToPage.label = Go To Page...
## Window Menu and submenu items
viewer.menu.window.label = Window
viewer.menu.window.mnemonic = W
viewer.menu.window.minAll.label = Minimize All
viewer.menu.window.minAll.mnemonic = M
viewer.menu.window.frontAll.label = Bring All to Front
viewer.menu.window.frontAll.mnemonic = B
viewer.menu.window.1.label = 1
viewer.menu.window.1.mnemonic = 1
viewer.menu.window.2.label = 2
viewer.menu.window.2.mnemonic = 2
viewer.menu.window.3.label = 3
viewer.menu.window.3.mnemonic = 3
viewer.menu.window.4.label = 4
viewer.menu.window.4.mnemonic = 4
viewer.menu.window.5.label = 5
viewer.menu.window.5.mnemonic = 5
viewer.menu.window.6.label = 6
viewer.menu.window.6.mnemonic = 6
viewer.menu.window.7.label = 7
viewer.menu.window.7.mnemonic = 7
viewer.menu.window.8.label = 8
viewer.menu.window.8.mnemonic = 8
viewer.menu.window.9.label = 9
viewer.menu.window.9.mnemonic = 9
## Add as many entries as you want, to viewer.menu.window.X.label and mnemonic
## where X is an incrementing integer. The mnemonic should be one unique
## character found within the label
## Help Menu and submenu items
viewer.menu.help.label = Help
viewer.menu.help.mnemonic = H
viewer.menu.help.about.label = About ICEpdf viewer...
## General error dialog
viewer.dialog.error.exception.title = ICEsoft ICEpdf - Exception
viewer.dialog.error.exception.msg = \
There was an error executing your command do to the following exception\n\
{0}.
## Open File Dialog
viewer.dialog.openFile.title = Open File
viewer.dialog.openFile.error.title = ICEsoft ICEpdf - Open File Error
viewer.dialog.openFile.error.msg = \
ICEpdf could not open the specified file at {0}\n\
The file may be corrupt or not a supported file type.
viewer.dialog.openDocument.pdfException.title = ICEsoft ICEpdf - PDF Exception
viewer.dialog.openDocument.pdfException.msg = \
ICEpdf could not open the specified file {0} \n\
The file may be corrupt or not a supported file type.
viewer.dialog.openDocument.pdfSecurityException.title = ICEsoft ICEpdf - PDF Security Exception
viewer.dialog.openDocument.pdfSecurityException.msg = \
ICEpdf could not open the encrypted file at {0}\n\
This may be the result of an invalid password or a missing JCE Security Provider.\n\n\
Please refer to ICEpdf Developer's Guide for more information.
viewer.dialog.openDocument.exception.title = ICEsoft ICEpdf - Exception
viewer.dialog.openDocument.exception.msg = \
ICEpdf could not open the specified file at {0}\n\
The file may be corrupt or not a supported file type.
viewer.dialog.openURL.exception.title = ICEsoft ICEpdf - URL Exception
viewer.dialog.openURL.exception.msg = \
ICEpdf could not open the specified file. {0} \n\
at URL: {1}
viewer.dialog.openURL.downloading.msg = Downloading {0}
## General error dialog
viewer.dialog.information.copyAll.title = ICEsoft ICEpdf - Information
viewer.dialog.information.copyAll.msg = \
The document has more than {0} pages, please use\n\
"Export text..." to extract document text.
## Open URL Dialog
viewer.dialog.security.title = Document Security
viewer.dialog.security.msg = This PDF is protected
viewer.dialog.security.password.label = Password:
viewer.dialog.security.okButton.label = Ok
viewer.dialog.security.okButton.mnemonic = O
viewer.dialog.security.cancelButton.label = Cancel
viewer.dialog.security.cancelButton.mnemonic = C
## Open URL Dialog
viewer.dialog.openURL.title = Open URL
### Save a Copy Dialog
viewer.dialog.saveAs.title = Save As
viewer.dialog.saveAs.extensionError.title = ICEsoft ICEpdf - Save Error
viewer.dialog.saveAs.extensionError.msg = \
ICEpdf could not save to {0} because it is not a supported file type.
viewer.dialog.saveAs.noExtensionError.title = ICEsoft ICEpdf - Save Error
viewer.dialog.saveAs.noExtensionError.msg = Please specify a file extension.
viewer.dialog.saveAs.noneUniqueName.title = ICEsoft ICEpdf - Save Error
viewer.dialog.saveAs.noneUniqueName.msg = \
The file named {0} already exists. Please specify a unique name.
viewer.dialog.saveAs.noPermission.title = ICEpdf Viewer RI - Save Error
viewer.dialog.saveAs.noPermission.msg = You do not have permission or the credentials to save this document.
viewer.dialog.saveAs.noUpdates.title = ICEpdf Viewer RI
viewer.dialog.saveAs.noUpdates.msg = Document changes will not be saved, please upgrade to ICEpdf PRO.
viewer.dialog.saveOnClose.noUpdates.title = ICEpdf Viewer RI
viewer.dialog.saveOnClose.noUpdates.msg = Do you want to save changes to {0}?
## Export Text Dialog
viewer.dialog.exportText.title = Export Document Text
viewer.dialog.exportText.progress.msg = Extracting PDF Text
viewer.dialog.exportText.noExtensionError.title = ICEsoft ICEpdf - Save Error
viewer.dialog.exportText.noExtensionError.msg = Please specify a file extension.
# Text extraction output file
viewer.exportText.fileStamp.msg = ICEsoft ICEpdf Viewer, (c) ICEsoft Technologies, Inc.
viewer.exportText.pageStamp.msg = <!----- Page {0} Text ---->
# Completed x out of y page(s).
viewer.exportText.fileStamp.progress.msg = \
Completed {0} out of {1}.
viewer.exportText.fileStamp.progress.oneFile.msg = {2} page
viewer.exportText.fileStamp.progress.moreFile.msg = {2} pages
## Export SVG Dialog
viewer.dialog.exportSVG.title = Export to SVG
viewer.dialog.exportSVG.status.exporting.msg = Exporting page {0} to SVG file {1} ...
viewer.dialog.exportSVG.status.error.msg = \
Problem exporting page {0} to SVG file {1} : {2}
viewer.dialog.exportSVG.status.finished.msg = \
Finished exporting page {0} to SVG file {1}
viewer.dialog.exportSVG.noExtensionError.title = ICEsoft ICEpdf - SVG Error
viewer.dialog.exportSVG.noExtensionError.msg = Please specify a file extension.
viewer.dialog.exportSVG.exportError.title = ICEsoft ICEpdf - SVG Error
viewer.dialog.exportSVG.exportError.msg = \
ICEpdf could not export to {0} \n\
becuase it is either not a supported file type or \n\
because the file has been corrupted.
# Printing Progress bar
viewer.dialog.printing.status.progress.msg = Page {0} of {1}
viewer.dialog.printing.status.start.msg = Spooling Page(s) to Printer
## Document Permissions Dialog
viewer.dialog.documentPermissions.title = Document Permissions
viewer.dialog.documentPermissions.securityMethod.label = Security Method:
viewer.dialog.documentPermissions.userPassword.label = User Password:
viewer.dialog.documentPermissions.ownerPassword.label = Owner Password:
viewer.dialog.documentPermissions.printing.label = Printing:
viewer.dialog.documentPermissions.changing.label = Changing the Document:
viewer.dialog.documentPermissions.copyExtraction.label = Content Copying or Extraction:
viewer.dialog.documentPermissions.comments.label = Aurthoring Comments and Form Fields:
viewer.dialog.documentPermissions.formFillingIn.label = Form Field Fill-in or Signing:
viewer.dialog.documentPermissions.accessibility.label = Content Accessibility Enabled:
viewer.dialog.documentPermissions.assembly.label = Document Assembly:
viewer.dialog.documentPermissions.encryptionLevel.label = Encryption Level:
viewer.dialog.documentPermissions.securityLevel = {0}-bit v{1} R {2}
viewer.dialog.documentPermissions.none = None
viewer.dialog.documentPermissions.no = No
viewer.dialog.documentPermissions.yes = Yes
viewer.dialog.documentPermissions.allowed = Allowed
viewer.dialog.documentPermissions.notAllowed = Not Allowed
viewer.dialog.documentPermissions.fullyAllowed = Fully Allowed
viewer.dialog.documentPermissions.standardSecurity = Adobe Acrobat Standard Security
viewer.dialog.documentPermissions.partial = Partial (Low Quality)
## Document Information Dialog
viewer.dialog.documentInformation.title = Document Information
viewer.dialog.documentInformation.title.label = Title:
viewer.dialog.documentInformation.subject.label = Subject:
viewer.dialog.documentInformation.author.label = Author:
viewer.dialog.documentInformation.keywords.label = Keywords:
viewer.dialog.documentInformation.creator.label = Creator:
viewer.dialog.documentInformation.producer.label = Producer:
viewer.dialog.documentInformation.created.label = Created:
viewer.dialog.documentInformation.modified.label = Modified:
viewer.dialog.documentInformation.notAvailable = Not Available
## Go to Page Dialog
viewer.dialog.goToPage.title = Go to Page...
viewer.dialog.goToPage.description.label = Page Number
## About Dialog
viewer.dialog.about.title = About ICEpdf Viewer
viewer.dialog.about.pageNumber.label = \n\
\n\
Check the ICEpdf web site for the latest news:\n\
http://www.icepdf.org/ \n\n
## Font Properties Dialog
viewer.dialog.fonts.title = Document Font Properties
viewer.dialog.fonts.border.label = Fonts used by this document
viewer.dialog.fonts.info.type.label = Type: {0}
viewer.dialog.fonts.info.encoding.label = Encoding: {0}
viewer.dialog.fonts.info.substitution.type.label = Actual Type: {0}
viewer.dialog.fonts.info.substitution.path.label = Path: {0}
viewer.dialog.fonts.searching.label = Collecting font data ({0}%).
viewer.dialog.fonts.resetCache.label = Reset Cache
viewer.dialog.fonts.resetCache.tip = Reset font properties cache file and rescan system for new fonts.
## Utility Pane Bookmarks Tab
viewer.utilityPane.bookmarks.tab.title = Bookmarks
## Utility Pane Bookmarks Tab
viewer.utilityPane.attachments.tab.title = Attachments
viewer.utilityPane.attachments.column.fileName.title = Name
viewer.utilityPane.attachments.column.description.title = Description
viewer.utilityPane.attachments.column.modified.title = Modified
viewer.utilityPane.attachments.column.size.title = Size
viewer.utilityPane.attachments.column.compressedSize.title = Compressed size
viewer.utilityPane.attachments.menu.saveAs.label = Save As...
viewer.utilityPane.attachments.saveAs.replace.title = ICEsoft ICEpdf - Save Error
viewer.utilityPane.attachments.saveAs.replace.msg = \
The file named {0} already exists. Do you want to replace It?
## Utility Pane Thumbnails
viewer.utilityPane.thumbs.tab.title = Thumbnails
## Layers Pane
viewer.utilityPane.layers.tab.title = Layers
## Signature Pane
viewer.utilityPane.signatures.tab.title = Signatures
viewer.utilityPane.signatures.tab.certTree.error.label = \
Unsigned Signature Fields Signer certificate could not be validated {0} {1}
viewer.utilityPane.signatures.tab.certTree.rootSigned.label = Signed by {0} {1}
viewer.utilityPane.signatures.tab.certTree.rootValidating.label = Validating signature {0} {1}
viewer.utilityPane.signatures.tab.certTree.cert.invalid.label = Signature is invalid:
viewer.utilityPane.signatures.tab.certTree.cert.unknown.label = Signature is valid:
viewer.utilityPane.signatures.tab.certTree.cert.valid.label = Signature validity is unknown:
viewer.utilityPane.signatures.tab.certTree.doc.modified.label = \
This version of the document is unaltered but subsequent changes have been made
viewer.utilityPane.signatures.tab.certTree.doc.unmodified.label = Document has not been modified since it was signed
viewer.utilityPane.signatures.tab.certTree.doc.major.label = Document has been altered or corrupted since it was signed
viewer.utilityPane.signatures.tab.certTree.signature.identity.unknown.label = \
Signer's identity is unknown because it could not be found in your keystore
viewer.utilityPane.signatures.tab.certTree.signature.identity.unchecked.label = \
Signature is valid, but revocation of the signer's identity could not be checked
viewer.utilityPane.signatures.tab.certTree.signature.identity.valid.label = Signer's identity is valid
viewer.utilityPane.signatures.tab.certTree.signature.time.local.label = Signing time is from the clock on this signer's computer
viewer.utilityPane.signatures.tab.certTree.signature.time.embedded.label = \
Signature included an embedded timestamp but it could not be validated
viewer.utilityPane.signatures.tab.certTree.signature.details.label = Signature Details
viewer.utilityPane.signatures.tab.certTree.signature.details.reason.label = Reason: {0}
viewer.utilityPane.signatures.tab.certTree.signature.details.location.label = Location: {0}
viewer.utilityPane.signatures.tab.certTree.signature.details.full.label = Certificate Details...
viewer.utilityPane.signatures.tab.certTree.signature.lastChecked.label = Last Checked: {0}
viewer.utilityPane.signatures.tab.certTree.unsigned.label = Unsigned Signature Fields
## Signature certificate view dialog.
viewer.utilityPane.signatures.cert.dialog.title = Certificate Details
viewer.utilityPane.signatures.cert.dialog.closeButton.label = Close
viewer.utilityPane.signatures.cert.dialog.closeButton.mnemonic = C
viewer.utilityPane.signatures.cert.dialog.info.notAvailable.label = N/A
viewer.utilityPane.signatures.cert.dialog.info.unknownSubject.label = N/A Subject
viewer.utilityPane.signatures.cert.dialog.info.unknownIssuer.label = N/A Issuer
viewer.utilityPane.signatures.cert.dialog.info.certificateInfo.label = {0} - {1}
viewer.utilityPane.signatures.cert.dialog.info.column1.label = Field
viewer.utilityPane.signatures.cert.dialog.info.column2.label = Value
viewer.utilityPane.signatures.cert.dialog.info.version.label = Version
viewer.utilityPane.signatures.cert.dialog.info.version.value = v{0}
viewer.utilityPane.signatures.cert.dialog.info.serialNumber.label = Serial Number
viewer.utilityPane.signatures.cert.dialog.info.serialNumber.value = {0}
viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.label = Signature Algorithm
viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.value = {0}
viewer.utilityPane.signatures.cert.dialog.info.issuer.label = Issuer
viewer.utilityPane.signatures.cert.dialog.info.issuer.value = \
Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6}
viewer.utilityPane.signatures.cert.dialog.info.validity.label = Validity
viewer.utilityPane.signatures.cert.dialog.info.validity.value = From: {0}\n To: {1}
viewer.utilityPane.signatures.cert.dialog.info.subject.label = Subject
viewer.utilityPane.signatures.cert.dialog.info.subject.value = \
Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6}
viewer.utilityPane.signatures.cert.dialog.info.signature.label = Signature
viewer.utilityPane.signatures.cert.dialog.info.md5.label = MD5 Fingerprint
viewer.utilityPane.signatures.cert.dialog.info.md5.value = {0}
viewer.utilityPane.signatures.cert.dialog.info.sha1.label = SHA1 Fingerprint
viewer.utilityPane.signatures.cert.dialog.info.sha1.value = {0}
viewer.utilityPane.signatures.verify.initializingMessage.label = Validating {0} of {1} Signatures
viewer.utilityPane.signatures.verify.completeMessage.label = Validating process complete
viewer.utilityPane.signatures.verify.validating.label = Validating signature...
## Annotation Tab
viewer.utilityPane.annotation.tab.title = Annotations
## Utility Pane Annotation Link Tab
viewer.utilityPane.annotation.link.appearance.title = Link Annotation
viewer.utilityPane.annotation.link.highlightType = Highlight Style:
viewer.utilityPane.annotation.link.none = None
viewer.utilityPane.annotation.link.invert = Invert`
viewer.utilityPane.annotation.link.outline = Outline
viewer.utilityPane.annotation.link.push = Push
## Utility Pane Annotation text markup Tab
viewer.utilityPane.annotation.textMarkup.appearance.title = Text Markup Annotation
viewer.utilityPane.annotation.textMarkup.highlightType = Type:
viewer.utilityPane.annotation.textMarkup.colorChooserTitle = MarKup Color
viewer.utilityPane.annotation.textMarkup.colorLabel = Color:
viewer.utilityPane.annotation.textMarkup.transparencyLabel = Transparency:
## Utility Pane Annotation line Tab
viewer.utilityPane.annotation.line.appearance.title = Line Annotation
viewer.utilityPane.annotation.line.lineThickness = Line Thickness:
viewer.utilityPane.annotation.line.lineStyle = Line Style:
viewer.utilityPane.annotation.line.startStyle = Start:
viewer.utilityPane.annotation.line.endStyle = End:
viewer.utilityPane.annotation.line.colorChooserTitle = Line Color
viewer.utilityPane.annotation.line.colorInternalChooserTitle = Line Internal Color
viewer.utilityPane.annotation.line.colorLabel = Color:
viewer.utilityPane.annotation.line.colorInternalLabel = Fill Color:
viewer.utilityPane.annotation.line.end.none = None
viewer.utilityPane.annotation.line.end.openArrow = Open Arrow
viewer.utilityPane.annotation.line.end.closedArrow = Closed Arrow
viewer.utilityPane.annotation.line.end.diamond = Diamond
viewer.utilityPane.annotation.line.end.square = Square
viewer.utilityPane.annotation.line.end.circle = Circle
viewer.utilityPane.annotation.line.transparencyLabel = Transparency:
## Utility Pane Annotation square Tab
viewer.utilityPane.annotation.square.appearance.title = Square Annotation
viewer.utilityPane.annotation.square.lineThickness = Border Thickness:
viewer.utilityPane.annotation.square.lineStyle = Border Style:
viewer.utilityPane.annotation.square.colorBorderChooserTitle = Border Color
viewer.utilityPane.annotation.square.colorInteriorChooserTitle = Fill Color
viewer.utilityPane.annotation.square.borderTypeLabel = Border Type:
viewer.utilityPane.annotation.square.colorBorderLabel = Border Color:
viewer.utilityPane.annotation.square.colorInteriorLabel = Fill Color:
viewer.utilityPane.annotation.square.fillTypeLabel = Fill Type:
viewer.utilityPane.annotation.square.transparencyLabel = Transparency:
## Utility Pane Annotation free text Tab
viewer.utilityPane.annotation.freeText.appearance.title = FreeText Annotation
viewer.utilityPane.annotation.freeText.font.name = Font Name:
viewer.utilityPane.annotation.freeText.font.style = Font Style:
viewer.utilityPane.annotation.freeText.font.size = Font Size:
viewer.utilityPane.annotation.freeText.font.color = Font Color:
viewer.utilityPane.annotation.freeText.font.color.ChooserTitle = Font Color
viewer.utilityPane.annotation.freeText.border.thickness = Border Thickness:
viewer.utilityPane.annotation.freeText.border.type = Border Type:
viewer.utilityPane.annotation.freeText.border.style = Border Style:
viewer.utilityPane.annotation.freeText.border.color = Border Color:
viewer.utilityPane.annotation.freeText.border.color.ChooserTitle = Border Color
viewer.utilityPane.annotation.freeText.fill.type = Fill Type:
viewer.utilityPane.annotation.freeText.fill.color = Fill Color:
viewer.utilityPane.annotation.freeText.transparencyLabel = Transparency:
viewer.utilityPane.annotation.freeText.fill.color.ChooserTitle = Fill Color
viewer.utilityPane.annotation.freeText.font.dialog = Dialog
viewer.utilityPane.annotation.freeText.font.dialogInput = DialogInput
viewer.utilityPane.annotation.freeText.font.monospaced = Monospaced
viewer.utilityPane.annotation.freeText.font.serif = Serif
viewer.utilityPane.annotation.freeText.font.sanSerif = SansSerif
viewer.utilityPane.annotation.freeText.font.style.plain = Plain
viewer.utilityPane.annotation.freeText.font.style.italic = Italic
viewer.utilityPane.annotation.freeText.font.style.bold = Bold
viewer.utilityPane.annotation.freeText.font.name.helvetica = Helvetica
viewer.utilityPane.annotation.freeText.font.name.helveticaOblique = Helvetica-Oblique
viewer.utilityPane.annotation.freeText.font.name.helveticaBold = Helvetica-Bold
viewer.utilityPane.annotation.freeText.font.name.HelveticaBoldOblique = Helvetica-BoldOblique
viewer.utilityPane.annotation.freeText.font.name.timesItalic = Times-Italic
viewer.utilityPane.annotation.freeText.font.name.timesBold = Times-Bold
viewer.utilityPane.annotation.freeText.font.name.timesBoldItalic = Times-BoldItalic
viewer.utilityPane.annotation.freeText.font.name.timesRoman = Times-Roman
viewer.utilityPane.annotation.freeText.font.name.courier = Courier
viewer.utilityPane.annotation.freeText.font.name.courierOblique = Courier-Oblique
viewer.utilityPane.annotation.freeText.font.name.courierBoldOblique = Courier-BoldOblique
viewer.utilityPane.annotation.freeText.font.name.courierBold = Courier-Bold
## Utility Pane Annotation text Tab
viewer.utilityPane.annotation.text.appearance.title = Text Annotation
viewer.utilityPane.annotation.text.iconName = Icon:
viewer.utilityPane.annotation.text.iconName.comment = Comment
viewer.utilityPane.annotation.text.iconName.check = Check
viewer.utilityPane.annotation.text.iconName.checkMark = CheckMark
viewer.utilityPane.annotation.text.iconName.circle = Circle
viewer.utilityPane.annotation.text.iconName.cross = Cross
viewer.utilityPane.annotation.text.iconName.crossHairs = CrossHairs
viewer.utilityPane.annotation.text.iconName.help = Help
viewer.utilityPane.annotation.text.iconName.insert = Insert
viewer.utilityPane.annotation.text.iconName.key = Key
viewer.utilityPane.annotation.text.iconName.newParagraph = NewParagraph
viewer.utilityPane.annotation.text.iconName.paragraph = Paragraph
viewer.utilityPane.annotation.text.iconName.rightArrow = RightArrow
viewer.utilityPane.annotation.text.iconName.rightPointer = RightPointer
viewer.utilityPane.annotation.text.iconName.star = Star
viewer.utilityPane.annotation.text.iconName.upArrow = UpArrow
viewer.utilityPane.annotation.text.iconName.upLeftArrow = UpLeftArrow
## Utility Pane Annotation circle Tab
viewer.utilityPane.annotation.circle.appearance.title = Circle Annotation
viewer.utilityPane.annotation.circle.lineThickness = Border Thickness:
viewer.utilityPane.annotation.circle.lineStyle = Border Style:
viewer.utilityPane.annotation.circle.colorBorderChooserTitle = Border Color
viewer.utilityPane.annotation.circle.colorInteriorChooserTitle = Interior Color
viewer.utilityPane.annotation.circle.colorBorderLabel = Border Color:
viewer.utilityPane.annotation.circle.colorInteriorLabel = Fill Color:
viewer.utilityPane.annotation.circle.fillTypeLabel = Fill Type:
viewer.utilityPane.annotation.circle.transparencyLabel = Transparency:
## Utility Pane Annotation ink Tab
viewer.utilityPane.annotation.ink.appearance.title = Ink Annotation
viewer.utilityPane.annotation.ink.lineThickness = Ink Thickness:
viewer.utilityPane.annotation.ink.lineStyle = Ink Style:
viewer.utilityPane.annotation.ink.colorBorderChooserTitle = Ink Color
viewer.utilityPane.annotation.ink.colorBorderLabel = Ink Color:
viewer.utilityPane.annotation.ink.transparencyLabel = Transparency:
## Utility Pane border Tab
viewer.utilityPane.annotation.border.title = Border
viewer.utilityPane.annotation.border.linkType = Border Type:
viewer.utilityPane.annotation.border.lineThickness = Border Thickness:
viewer.utilityPane.annotation.border.lineStyle = Border Style:
viewer.utilityPane.annotation.border.colorChooserTitle = Border Color
viewer.utilityPane.annotation.border.colorLabel = Color:
viewer.utilityPane.annotation.border.borderType.visibleRectangle = Visible
viewer.utilityPane.annotation.border.borderType.invisibleRectangle = Invisible
viewer.utilityPane.annotation.border.solid = Solid
viewer.utilityPane.annotation.border.dashed = Dashed
viewer.utilityPane.annotation.border.beveled = Beveled
viewer.utilityPane.annotation.border.inset = Inset
viewer.utilityPane.annotation.border.underline = Underline
## Utility Pane border Tab
viewer.utilityPane.annotation.flags.title = Flags
viewer.utilityPane.annotation.flags.noRotate = No Rotate:
viewer.utilityPane.annotation.flags.noZoom = No Zoom:
viewer.utilityPane.annotation.flags.readOnly = Read Only:
viewer.utilityPane.annotation.flags.printable = Printable:
viewer.utilityPane.annotation.flags.yes = Printable:
viewer.utilityPane.annotation.flags.enabled = Enabled
viewer.utilityPane.annotation.flags.disabled = Disabled
## annotation action pane and dialogs.
viewer.utilityPane.action.selectionTitle = Action
viewer.utilityPane.action.addAction = Add
viewer.utilityPane.action.editAction = Edit
viewer.utilityPane.action.removeAction = Remove
viewer.utilityPane.action.type.destination.label = Destination
viewer.utilityPane.action.type.uriAction.label = URI Action
viewer.utilityPane.action.type.goToAction.label = GoTo Action
viewer.utilityPane.action.type.launchAction.label = Launch Action
viewer.utilityPane.action.dialog.new.title = Add New Action
viewer.utilityPane.action.dialog.new.msgs = Action Type:
viewer.utilityPane.action.dialog.delete.title = Delete Confirmation
viewer.utilityPane.action.dialog.delete.msgs = Are you sure your want to delete this action?
## uri action dialog test
viewer.utilityPane.action.dialog.uri.title = URI Action Properties
viewer.utilityPane.action.dialog.uri.msgs = URI:
## launch action dialog test
viewer.utilityPane.action.dialog.launch.title = Launch Action Properties
viewer.utilityPane.action.dialog.launch.msgs = File Path:
## GoTo action dialog text
viewer.utilityPane.action.dialog.goto.title = GoTo Action Properties
viewer.utilityPane.action.dialog.goto.page.label = Page:
viewer.utilityPane.action.dialog.goto.type.label = Type
viewer.utilityPane.action.dialog.goto.type.xyz.label = Absolute
viewer.utilityPane.action.dialog.goto.type.fit.label = Fit Page
viewer.utilityPane.action.dialog.goto.type.fith.label = Fit Top Width
viewer.utilityPane.action.dialog.goto.type.fitv.label = Fit Left Width
viewer.utilityPane.action.dialog.goto.type.fitr.label = Fit Zoom Box
viewer.utilityPane.action.dialog.goto.type.fitb.label = Fit Page Bounds
viewer.utilityPane.action.dialog.goto.type.fitbh.label = Fit Bounds Top
viewer.utilityPane.action.dialog.goto.type.fitbv.label = Fit Bounds Left
viewer.utilityPane.action.dialog.goto.right.label = Right:
viewer.utilityPane.action.dialog.goto.left.label = Left:
viewer.utilityPane.action.dialog.goto.top.label = Top:
viewer.utilityPane.action.dialog.goto.bottom.label = Bottom:
viewer.utilityPane.action.dialog.goto.zoom.label = Zoom:
viewer.utilityPane.action.dialog.goto.unassigned.label = NaN
viewer.utilityPane.action.dialog.goto.current.label = Current View:
viewer.utilityPane.action.dialog.goto.current = Set Location
viewer.utilityPane.action.dialog.goto.name.label = Name:
viewer.utilityPane.action.dialog.goto.browse = Browse...
viewer.utilityPane.action.dialog.goto.explicitDestination.title = Implicit Destination
viewer.utilityPane.action.dialog.goto.nameDestination.title = Named Destination
# Destination Named Tree
viewer.utilityPane.action.dialog.goto.nameTree.title = Document Name Tree
viewer.utilityPane.action.dialog.goto.nameTree.root.label = Name Tree
viewer.utilityPane.action.dialog.goto.nameTree.branch.label = {0} to {1}
## Utility Pane Search Tab
viewer.utilityPane.search.tab.title = Search
viewer.utilityPane.search.searchText.label = Search Text:
viewer.utilityPane.search.results.label = Results:
viewer.utilityPane.search.searchButton.label = Search
viewer.utilityPane.search.clearSearchButton.label = Clear
viewer.utilityPane.search.caseSenstiveCheckbox.label = Case-sensitive
viewer.utilityPane.search.wholeWordCheckbox.label = Whole words only
viewer.utilityPane.search.cumlitiveCheckbox.label = Cumulative
viewer.utilityPane.search.showPagesCheckbox.label = Show Pages
viewer.utilityPane.search.stopButton.label = Stop
viewer.utilityPane.search.searching.msg = Search...
# Searching x out of y page(s)
viewer.utilityPane.search.searching1.msg = \
Searching {0} out of {1}
viewer.utilityPane.search.searching1.oneFile.msg = {2} page
viewer.utilityPane.search.searching1.moreFile.msg = {2} pages
# Page x (y result(s))
viewer.utilityPane.search.result.msg = Page {0} ({1})
viewer.utilityPane.search.result.oneFile.msg = {2} result
viewer.utilityPane.search.result.moreFile.msg = {2} results
# Searched x page(s) (y matches)
viewer.utilityPane.search.progress.msg = \
Searched {0} {1} ({2})
viewer.utilityPane.search.progress.onePage.msg = page
viewer.utilityPane.search.progress.morePage.msg = pages
viewer.utilityPane.search.progress.oneMatch.msg = {2} match
viewer.utilityPane.search.progress.moreMatch.msg = {2} matches
## Popup Annotation component
viewer.annotation.popup.reply.label = Reply
viewer.annotation.popup.delete.label = Delete
viewer.annotation.popup.status.label = Set Status
viewer.annotation.popup.status.accepted.label = Accepted
viewer.annotation.popup.status.cancelled.label = Cancelled
viewer.annotation.popup.status.completed.label = Completed
viewer.annotation.popup.status.rejected.label = Rejected
viewer.annotation.popup.status.none.label = None
viewer.annotation.popup.openAll.label = Open all Popups
viewer.annotation.popup.minimizeAll.label = Minimize Popups
viewer.annotation.popup.replyTo.label = Re: {0}
viewer.annotation.popup.status.none.title = None: {0}
viewer.annotation.popup.status.none.msg = None set by {0}
viewer.annotation.popup.status.accepted.title = Accepted: {0}
viewer.annotation.popup.status.accepted.msg = Accepted set by {0}
viewer.annotation.popup.status.cancelled.title = Cancelled: {0}
viewer.annotation.popup.status.cancelled.msg = Cancelled set by {0}
viewer.annotation.popup.status.completed.title = Completed: {0}
viewer.annotation.popup.status.completed.msg = Completed set by {0}
viewer.annotation.popup.status.rejected.title = Rejected: {0}
viewer.annotation.popup.status.rejected.msg = Rejected set by {0}
## Signature component
viewer.annotation.signature.menu.validateSignature.label = Validate Signature
viewer.annotation.signature.menu.showCertificates.label = Show Certificate Properties
viewer.annotation.signature.menu.signatureProperties.label = Show Signature Properties
viewer.annotation.signature.menu.signaturePageNavigation.label = Go to Page...
## Signature validation dialog.
viewer.annotation.signature.validation.dialog.title = Signature Validation Summary
viewer.annotation.signature.validation.dialog.close.button.label = Close
viewer.annotation.signature.validation.dialog.signerProperties.button.label = Signature Properties...
# common validation messages
viewer.annotation.signature.validation.common.invalid.label = Signature is invalid:
viewer.annotation.signature.validation.common.unknown.label = Signature is valid:
viewer.annotation.signature.validation.common.valid.label = Signature validity is unknown:
viewer.annotation.signature.validation.common.signedBy.label = - Signed by {0} {1}
viewer.annotation.signature.validation.common.doc.modified.label = \
- This version of the document is unaltered but subsequent changes have been made
viewer.annotation.signature.validation.common.doc.unmodified.label = - Document has not been modified since it was signed
viewer.annotation.signature.validation.common.doc.major.label = - Document has been altered or corrupted since it was signed
viewer.annotation.signature.validation.common.identity.unknown.label = \
- Signer's identity is unknown because it could not be found in your keystore
viewer.annotation.signature.validation.common.identity.unchecked.label = \
- Signature is valid, but revocation of the signer's identity could not be checked
viewer.annotation.signature.validation.common.identity.valid.label = - Signer's identity is valid
viewer.annotation.signature.validation.common.time.local.label = - Signing time is from the clock on this signer's computer
viewer.annotation.signature.validation.common.time.embedded.label = \
- Signature included an embedded timestamp but it could not be validated
viewer.annotation.signature.validation.common.notAvailable.label = N/A
## Signatures properties Dialog.
viewer.annotation.signature.properties.dialog.title = Signature Properties
viewer.annotation.signature.properties.dialog.invalid.label = Signature is invalid
viewer.annotation.signature.properties.dialog.unknown.label = Signature is valid
viewer.annotation.signature.properties.dialog.valid.label = Signature validity is unknown
viewer.annotation.signature.properties.dialog.signedBy.label = Signed by {0} {1}
viewer.annotation.signature.properties.dialog.signingTime.label = Signed time: {0}
viewer.annotation.signature.properties.dialog.reason.label = Reason: {0}
viewer.annotation.signature.properties.dialog.location.label = Location: {0}
# SignatureSigner Info
viewer.annotation.signature.properties.dialog.pathValidation.success = - Path validation checks were successful.
viewer.annotation.signature.properties.dialog.pathValidation.failure = - Path validation checks were unsuccessful.
viewer.annotation.signature.properties.dialog.revocation.success = - Signer's certificate is valid and has not been revoked.
viewer.annotation.signature.properties.dialog.revocation.failure = - Revocation checking was not performed.
viewer.annotation.signature.properties.dialog.certificateExpired.failure = - Signer certificate has expired.
viewer.annotation.signature.properties.dialog.showCertificates.label = Signer's Certificate...
viewer.annotation.signature.properties.dialog.validity.title = Validity Summary
viewer.annotation.signature.properties.dialog.signerInfo.title = Signer Info
## Common Button Labels
viewer.button.ok.label = Ok
viewer.button.ok.mnemonic = O
viewer.button.cancel.label = Cancel
viewer.button.cancel.mnemonic = C
## Pilot Specific Mesages
pilot.title = ICEbrowser - ICEpdf Pilot Errror
pilot.loading.msg =Opening document {0} ...
pilot.display.msg = Displaying {0}
pilot.loading.error.msg = PDF Pilot: Failed to load {0}.
pilot.error.classLoading = Required class {0} not found. Required library \
'icepdf.jar' may not be on the classpath - PDF Pilot disabled.";
###
# General Error Messages
# Command Line Errors
viewer.commandLin.error = \
Usage: java org.icepdf.ri.viewer.Main [-loadfile <value>] [-loadurl <value>]
# Launcher errors
viewer.launcher.URLError.dialog.title =ICEsoft ICEpdf
viewer.launcher.URLError.dialog.message = ICEpdf could not open the specified file. {0} at URL: {1}.
viewer.launcher.lookAndFeel.error.message = The specified look-and-feel ({0}) is not accessible from this platform.
# Pilot Loading Errors
### parser error dialogs
parse.title = Properties Parsing Error
parse.integer = Warning : {0} is not a correct integer.
parse.float = Warning : {0} is not a correct float.
parse.double = Warning : {0} is not a correct double.
parse.choice = Warning : {0} is not a valid choice.
parse.laf = Warning : look-and-feel {0} is not supported.
### Properties Manager Errors
manager.properties.title = ICEpdf Properties Manager
fontManager.properties.title = ICEpdf Font Manager
manager.properties.createNewDirectory = \
To create the directory {0},\n\
where the ICEpdf Viewer will store changes to its setup, click Yes.\n\n\
If you click "No", all changes you make to the ICEpdf Viewer setup\n\
will be lost when you quit the application. \n\n
manager.properties.failedCreation = \
ICEpdf Viewer directory to store user data can not be created:\n\
{0}\n\
ICEpdf Viewer will not save changes to its default setup.
manager.properties.session.nolock = \
Error creating the lock file :\n\
{0}\n
manager.properties.session.readError = \
Error loading properties file: \n\
{0}
manager.properties.deleted = Property file has been deleted\n\
({0})\n\
Recreate it ?
manager.properties.modified = Property file has been modified since last update\n\
({0,date,long})\n\
Would you like to merge changes in the file with the current properties?
manager.properties.saveError = Impossible to save property file.\n\
Encountered the folowing error :\n\
{0}
manager.properties.lafError =\
Look&Feel {0} given in the default properties is unsupported.\n\
Using system default.
manager.properties.brokenProperty = Broken default property {0} value: {1}
manager.properties.missingProperty = Missing default property {0} value: {1}

View File

@ -1,3 +1,19 @@
# Copyright 2014-2020 Basis Technology Corp.
#
# Copyright 2006-2017 ICEsoft Technologies Canada Corp.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an "AS
# IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
# express or implied. See the License for the specific language
# governing permissions and limitations under the License.
#
AnnotationsContentViewer.centralRepositoryEntryDataLabel.case=Case:
AnnotationsContentViewer.centralRepositoryEntryDataLabel.comment=Comment:
@ -167,6 +183,17 @@ MediaPlayerPanel.playButton.text=
MediaPlayerPanel.infoLabel.text=No Errors
MediaPlayerPanel.VolumeIcon.text=Volume
MediaPlayerPanel.playBackSpeedLabel.text=Speed:
# The following message properties were taken from IcePDF 6.2.2 to allow
# for Japanese translation.
#
#####
### This MessageBundle contains English text for ICEpdf View and Pilot RI's
##
#
# {0} - tableName
SQLiteViewer.readTable.errorText=Error getting rows for table: {0}
# {0} - tableName
@ -175,3 +202,837 @@ TranslatablePanel.comboBoxOption.originalText=Original Text
TranslatablePanel.comboBoxOption.translatedText=Translated Text
# {0} - exception message
TranslatablePanel.onSetContentError.text=There was an error displaying the text: {0}
## Window toolbar Title
viewer.window.title.default = ICEpdf Viewer
viewer.window.title.open.default = ICEpdf Viewer - [{0}]
#status bar
viewer.statusbar.currentPage = Page {0} / {1}
viewer.common.number.one = 1
viewer.common.number.two = 2
viewer.common.number.three = 3
viewer.common.number.four = 4
viewer.common.number.five = 5
viewer.common.number.six = 6
viewer.common.number.seven = 7
viewer.common.number.eight = 8
viewer.common.number.nine = 9
viewer.common.number.ten = 10
viewer.common.number.eleven = 11
viewer.common.number.twelve = 12
viewer.common.number.thirteen = 13
viewer.common.number.fourteen = 14
viewer.common.number.fifteen = 15
viewer.common.number.sixteen = 16
viewer.common.number.seventeen = 17
viewer.common.number.eighteen = 18
viewer.common.number.nineteen = 19
viewer.common.number.twenty = 20
viewer.common.number.twentyOne = 21
viewer.common.number.twentyTwo = 22
viewer.common.number.twentyThree = 23
viewer.common.number.twentyFour = 24
viewer.common.number.twentyFive = 25
viewer.common.number.twentySix = 26
viewer.common.number.twentySeven = 27
viewer.common.number.thirtySix = 36
viewer.common.number.fortyEight = 48
## Top Page Control Toolbar
viewer.toolbar.hideToolBar.label = Hide Toolbar
viewer.toolbar.showToolBar.label = Show Toolbar
viewer.toolbar.showUtilityPane.label = Show Utility Pane
viewer.toolbar.hideUtilityPane.label = Hide Utility Pane
viewer.toolbar.open.label =
viewer.toolbar.open.tooltip = Open Document
viewer.toolbar.saveAs.label = Save As
viewer.toolbar.saveAs.tooltip = Save As...
viewer.toolbar.print.label = Print
viewer.toolbar.print.tooltip = Print Document
viewer.toolbar.search.label = Search
viewer.toolbar.search.tooltip = Search Document
viewer.toolbar.utilityPane.label = Utility Pane
viewer.toolbar.utilityPane.tooltip = Show/Hide Utility Pane
viewer.toolbar.navigation.label =
viewer.toolbar.navigation.pages.tooltip = Number of Pages
viewer.toolbar.navigation.pages.firstPage.label =
viewer.toolbar.navigation.current.tooltip = Current Page Number
viewer.toolbar.navigation.current.firstPage.label =
viewer.toolbar.navigation.firstPage.label =
viewer.toolbar.navigation.firstPage.tooltip = First Page
viewer.toolbar.navigation.previousPage.label =
viewer.toolbar.navigation.previousPage.tooltip = Previous Page
viewer.toolbar.navigation.nextPage.label =
viewer.toolbar.navigation.nextPage.tooltip = Next Page
viewer.toolbar.navigation.lastPage.label =
viewer.toolbar.navigation.lastPage.tooltip = Last Page
viewer.toolbar.pageIndicator = of {0}
viewer.toolbar.zoom.label =
viewer.toolbar.zoom.tooltip = Zoom
viewer.toolbar.zoom.out.label =
viewer.toolbar.zoom.out.tooltip = Zoom Out
viewer.toolbar.zoom.in.label =
viewer.toolbar.zoom.in.tooltip = Zoom In
viewer.toolbar.pageFit.actualsize.label =
viewer.toolbar.pageFit.actualsize.tooltip = Actual Size
viewer.toolbar.pageFit.fitWindow.label =
viewer.toolbar.pageFit.fitWindow.tooltip = Fit in Window
viewer.toolbar.pageFit.fitWidth.label =
viewer.toolbar.pageFit.fitWidth.tooltip = Fit Width
viewer.toolbar.rotation.left.label =
viewer.toolbar.rotation.left.tooltip = Rotate Left
viewer.toolbar.rotation.right.label =
viewer.toolbar.rotation.right.tooltip = Rotate Right
viewer.toolbar.tool.pan.label =
viewer.toolbar.tool.pan.tooltip = Pan Tool
viewer.toolbar.tool.text.label =
viewer.toolbar.tool.text.tooltip = Text Select Tool
viewer.toolbar.tool.select.label =
viewer.toolbar.tool.select.tooltip = Select Tool
viewer.toolbar.tool.link.label =
viewer.toolbar.tool.link.tooltip = Link Annotation Tool
viewer.toolbar.tool.highlight.label = Highlight
viewer.toolbar.tool.highlight.tooltip = Highlight Annotation Tool
viewer.toolbar.tool.strikeOut.label = Strike Out
viewer.toolbar.tool.strikeOut.tooltip = Strike Out Annotation Tool
viewer.toolbar.tool.underline.label = Underline
viewer.toolbar.tool.underline.tooltip = Underline Annotation Tool
viewer.toolbar.tool.line.label = Line
viewer.toolbar.tool.line.tooltip = Line Annotation Tool
viewer.toolbar.tool.lineArrow.label = Line Arrow
viewer.toolbar.tool.lineArrow.tooltip = Line Arrow Annotation Tool
viewer.toolbar.tool.rectangle.label = Rectangle
viewer.toolbar.tool.rectangle.tooltip = Rectangle Annotation Tool
viewer.toolbar.tool.circle.label = Circle
viewer.toolbar.tool.circle.tooltip = Circle Annotation Tool
viewer.toolbar.tool.ink.label = Ink
viewer.toolbar.tool.ink.tooltip = Ink Annotation Tool
viewer.toolbar.tool.freeText.label = Free Text
viewer.toolbar.tool.freeText.tooltip = Free Text Annotation Tool
viewer.toolbar.tool.textAnno.label = Text Annotation
viewer.toolbar.tool.textAnno.tooltip = Text Annotation Tool
viewer.toolbar.tool.plolyLine.label = Poly Line
viewer.toolbar.tool.plolyLine.tooltip = Poly Line Annotation Tool
viewer.toolbar.tool.zoomIn.label =
viewer.toolbar.tool.zoomIn.tooltip = Zoom In Tool
viewer.toolbar.tool.zoomMarquis.label =
viewer.toolbar.tool.zoomMarquis.tooltip = Zoom Marquee Tool
viewer.toolbar.tool.zoomDynamic.label =
viewer.toolbar.tool.zoomDynamic.tooltip = Zoom Dynamic Tool
viewer.toolbar.tool.zoomOut.label =
viewer.toolbar.tool.zoomOut.tooltip = Zoom Out Tool
viewer.toolbar.pageFit.fontEngine.label =
viewer.toolbar.pageFit.fontEngine.tooltip = Enable/Disable Font Engine
viewer.toolbar.tool.forms.highlight.label = Highlight Forms
viewer.toolbar.tool.forms.highlight.tooltip = Show/Hide Form Highlighting
## Bottom Page View Control Toolbar
viewer.toolbar.pageView.nonContinuous.singlePage.label =
viewer.toolbar.pageView.nonContinuous.singlePage.tooltip = Single Page View Non-Continuous
viewer.toolbar.pageView.nonContinuous.facingPage.label =
viewer.toolbar.pageView.nonContinuous.facingPage.tooltip = Facing Page View Non-Continuous
viewer.toolbar.pageView.continuous.singlePage.label =
viewer.toolbar.pageView.continuous.singlePage.tooltip = Single Page View Continuous
viewer.toolbar.pageView.continuous.facingPage.label =
viewer.toolbar.pageView.continuous.facingPage.tooltip = Facing Page View Continuous
## File Menu and submenu items
viewer.menu.file.label = File
viewer.menu.file.mnemonic = F
viewer.menu.open.label = Open
viewer.menu.open.file.label = File...
viewer.menu.open.URL.label = URL...
viewer.menu.close.label = Close
viewer.menu.saveAs.label = Save As...
viewer.menu.exportText.label = Export Text...
viewer.menu.exportSVG.label = Export SVG...
viewer.menu.documentPermission.label = Document Permissions...
viewer.menu.documentInformation.label = Document Information...
viewer.menu.documentFonts.label = Document Fonts...
viewer.menu.printSetup.label = Print Setup...
viewer.menu.print.label = Print...
viewer.menu.exit.label = Exit
## View Menu and submenu items
viewer.menu.edit.label = Edit
viewer.menu.edit.mnemonic = E
viewer.menu.edit.undo.label = Undo
viewer.menu.edit.redo.label = Redo
viewer.menu.edit.copy.label = Copy
viewer.menu.edit.delete.label = Delete
viewer.menu.edit.selectAll.label = Select All
viewer.menu.edit.deselectAll.label = Deselect All
## View Menu and submenu items
viewer.menu.view.label = View
viewer.menu.view.mnemonic = V
viewer.menu.view.actualSize.label = Actual Size
viewer.menu.view.fitInWindow.label = Fit in Window
viewer.menu.view.fitWidth.label = Fit Width
viewer.menu.view.zoomIn.label = Zoom In
viewer.menu.view.zoomOut.label = Zoom Out
viewer.menu.view.rotateLeft.label = Rotate Left
viewer.menu.view.rotateRight.label = Rotate Right
viewer.menu.view.hideToolBar.label = Hide Toolbar
viewer.menu.view.showToolBar.label = Show Toolbar
viewer.menu.view.showUtilityPane.label = Show Utility Pane
viewer.menu.view.hideUtilityPane.label = Hide Utility Pane
## Document Menu and submenu items
viewer.menu.document.label = Document
viewer.menu.document.mnemonic = D
viewer.menu.document.firstPage.label = First Page
viewer.menu.document.previousPage.label = Previous Page
viewer.menu.document.nextPage.label = Next Page
viewer.menu.document.lastPage.label = Last Page
viewer.menu.document.search.label = Search...
viewer.menu.document.gotToPage.label = Go To Page...
## Window Menu and submenu items
viewer.menu.window.label = Window
viewer.menu.window.mnemonic = W
viewer.menu.window.minAll.label = Minimize All
viewer.menu.window.minAll.mnemonic = M
viewer.menu.window.frontAll.label = Bring All to Front
viewer.menu.window.frontAll.mnemonic = B
viewer.menu.window.1.label = 1
viewer.menu.window.1.mnemonic = 1
viewer.menu.window.2.label = 2
viewer.menu.window.2.mnemonic = 2
viewer.menu.window.3.label = 3
viewer.menu.window.3.mnemonic = 3
viewer.menu.window.4.label = 4
viewer.menu.window.4.mnemonic = 4
viewer.menu.window.5.label = 5
viewer.menu.window.5.mnemonic = 5
viewer.menu.window.6.label = 6
viewer.menu.window.6.mnemonic = 6
viewer.menu.window.7.label = 7
viewer.menu.window.7.mnemonic = 7
viewer.menu.window.8.label = 8
viewer.menu.window.8.mnemonic = 8
viewer.menu.window.9.label = 9
viewer.menu.window.9.mnemonic = 9
## Add as many entries as you want, to viewer.menu.window.X.label and mnemonic
## where X is an incrementing integer. The mnemonic should be one unique
## character found within the label
## Help Menu and submenu items
viewer.menu.help.label = Help
viewer.menu.help.mnemonic = H
viewer.menu.help.about.label = About ICEpdf viewer...
## General error dialog
viewer.dialog.error.exception.title = ICEsoft ICEpdf - Exception
viewer.dialog.error.exception.msg = \
There was an error executing your command do to the following exception\n\
{0}.
## Open File Dialog
viewer.dialog.openFile.title = Open File
viewer.dialog.openFile.error.title = ICEsoft ICEpdf - Open File Error
viewer.dialog.openFile.error.msg = \
ICEpdf could not open the specified file at {0}\n\
The file may be corrupt or not a supported file type.
viewer.dialog.openDocument.pdfException.title = ICEsoft ICEpdf - PDF Exception
viewer.dialog.openDocument.pdfException.msg = \
ICEpdf could not open the specified file {0} \n\
The file may be corrupt or not a supported file type.
viewer.dialog.openDocument.pdfSecurityException.title = ICEsoft ICEpdf - PDF Security Exception
viewer.dialog.openDocument.pdfSecurityException.msg = \
ICEpdf could not open the encrypted file at {0}\n\
This may be the result of an invalid password or a missing JCE Security Provider.\n\n\
Please refer to ICEpdf Developer's Guide for more information.
viewer.dialog.openDocument.exception.title = ICEsoft ICEpdf - Exception
viewer.dialog.openDocument.exception.msg = \
ICEpdf could not open the specified file at {0}\n\
The file may be corrupt or not a supported file type.
viewer.dialog.openURL.exception.title = ICEsoft ICEpdf - URL Exception
viewer.dialog.openURL.exception.msg = \
ICEpdf could not open the specified file. {0} \n\
at URL: {1}
viewer.dialog.openURL.downloading.msg = Downloading {0}
## General error dialog
viewer.dialog.information.copyAll.title = ICEsoft ICEpdf - Information
viewer.dialog.information.copyAll.msg = \
The document has more than {0} pages, please use\n\
"Export text..." to extract document text.
## Open URL Dialog
viewer.dialog.security.title = Document Security
viewer.dialog.security.msg = This PDF is protected
viewer.dialog.security.password.label = Password:
viewer.dialog.security.okButton.label = Ok
viewer.dialog.security.okButton.mnemonic = O
viewer.dialog.security.cancelButton.label = Cancel
viewer.dialog.security.cancelButton.mnemonic = C
## Open URL Dialog
viewer.dialog.openURL.title = Open URL
### Save a Copy Dialog
viewer.dialog.saveAs.title = Save As
viewer.dialog.saveAs.extensionError.title = ICEsoft ICEpdf - Save Error
viewer.dialog.saveAs.extensionError.msg = \
ICEpdf could not save to {0} because it is not a supported file type.
viewer.dialog.saveAs.noExtensionError.title = ICEsoft ICEpdf - Save Error
viewer.dialog.saveAs.noExtensionError.msg = Please specify a file extension.
viewer.dialog.saveAs.noneUniqueName.title = ICEsoft ICEpdf - Save Error
viewer.dialog.saveAs.noneUniqueName.msg = \
The file named {0} already exists. Please specify a unique name.
viewer.dialog.saveAs.noPermission.title = ICEpdf Viewer RI - Save Error
viewer.dialog.saveAs.noPermission.msg = You do not have permission or the credentials to save this document.
viewer.dialog.saveAs.noUpdates.title = ICEpdf Viewer RI
viewer.dialog.saveAs.noUpdates.msg = Document changes will not be saved, please upgrade to ICEpdf PRO.
viewer.dialog.saveOnClose.noUpdates.title = ICEpdf Viewer RI
viewer.dialog.saveOnClose.noUpdates.msg = Do you want to save changes to {0}?
## Export Text Dialog
viewer.dialog.exportText.title = Export Document Text
viewer.dialog.exportText.progress.msg = Extracting PDF Text
viewer.dialog.exportText.noExtensionError.title = ICEsoft ICEpdf - Save Error
viewer.dialog.exportText.noExtensionError.msg = Please specify a file extension.
# Text extraction output file
viewer.exportText.fileStamp.msg = ICEsoft ICEpdf Viewer, (c) ICEsoft Technologies, Inc.
viewer.exportText.pageStamp.msg = <!----- Page {0} Text ---->
# Completed x out of y page(s).
viewer.exportText.fileStamp.progress.msg = \
Completed {0} out of {1}.
viewer.exportText.fileStamp.progress.oneFile.msg = {2} page
viewer.exportText.fileStamp.progress.moreFile.msg = {2} pages
## Export SVG Dialog
viewer.dialog.exportSVG.title = Export to SVG
viewer.dialog.exportSVG.status.exporting.msg = Exporting page {0} to SVG file {1} ...
viewer.dialog.exportSVG.status.error.msg = \
Problem exporting page {0} to SVG file {1} : {2}
viewer.dialog.exportSVG.status.finished.msg = \
Finished exporting page {0} to SVG file {1}
viewer.dialog.exportSVG.noExtensionError.title = ICEsoft ICEpdf - SVG Error
viewer.dialog.exportSVG.noExtensionError.msg = Please specify a file extension.
viewer.dialog.exportSVG.exportError.title = ICEsoft ICEpdf - SVG Error
viewer.dialog.exportSVG.exportError.msg = \
ICEpdf could not export to {0} \n\
becuase it is either not a supported file type or \n\
because the file has been corrupted.
# Printing Progress bar
viewer.dialog.printing.status.progress.msg = Page {0} of {1}
viewer.dialog.printing.status.start.msg = Spooling Page(s) to Printer
## Document Permissions Dialog
viewer.dialog.documentPermissions.title = Document Permissions
viewer.dialog.documentPermissions.securityMethod.label = Security Method:
viewer.dialog.documentPermissions.userPassword.label = User Password:
viewer.dialog.documentPermissions.ownerPassword.label = Owner Password:
viewer.dialog.documentPermissions.printing.label = Printing:
viewer.dialog.documentPermissions.changing.label = Changing the Document:
viewer.dialog.documentPermissions.copyExtraction.label = Content Copying or Extraction:
viewer.dialog.documentPermissions.comments.label = Aurthoring Comments and Form Fields:
viewer.dialog.documentPermissions.formFillingIn.label = Form Field Fill-in or Signing:
viewer.dialog.documentPermissions.accessibility.label = Content Accessibility Enabled:
viewer.dialog.documentPermissions.assembly.label = Document Assembly:
viewer.dialog.documentPermissions.encryptionLevel.label = Encryption Level:
viewer.dialog.documentPermissions.securityLevel = {0}-bit v{1} R {2}
viewer.dialog.documentPermissions.none = None
viewer.dialog.documentPermissions.no = No
viewer.dialog.documentPermissions.yes = Yes
viewer.dialog.documentPermissions.allowed = Allowed
viewer.dialog.documentPermissions.notAllowed = Not Allowed
viewer.dialog.documentPermissions.fullyAllowed = Fully Allowed
viewer.dialog.documentPermissions.standardSecurity = Adobe Acrobat Standard Security
viewer.dialog.documentPermissions.partial = Partial (Low Quality)
## Document Information Dialog
viewer.dialog.documentInformation.title = Document Information
viewer.dialog.documentInformation.title.label = Title:
viewer.dialog.documentInformation.subject.label = Subject:
viewer.dialog.documentInformation.author.label = Author:
viewer.dialog.documentInformation.keywords.label = Keywords:
viewer.dialog.documentInformation.creator.label = Creator:
viewer.dialog.documentInformation.producer.label = Producer:
viewer.dialog.documentInformation.created.label = Created:
viewer.dialog.documentInformation.modified.label = Modified:
viewer.dialog.documentInformation.notAvailable = Not Available
## Go to Page Dialog
viewer.dialog.goToPage.title = Go to Page...
viewer.dialog.goToPage.description.label = Page Number
## About Dialog
viewer.dialog.about.title = About ICEpdf Viewer
viewer.dialog.about.pageNumber.label = \n\
\n\
Check the ICEpdf web site for the latest news:\n\
http://www.icepdf.org/ \n\n
## Font Properties Dialog
viewer.dialog.fonts.title = Document Font Properties
viewer.dialog.fonts.border.label = Fonts used by this document
viewer.dialog.fonts.info.type.label = Type: {0}
viewer.dialog.fonts.info.encoding.label = Encoding: {0}
viewer.dialog.fonts.info.substitution.type.label = Actual Type: {0}
viewer.dialog.fonts.info.substitution.path.label = Path: {0}
viewer.dialog.fonts.searching.label = Collecting font data ({0}%).
viewer.dialog.fonts.resetCache.label = Reset Cache
viewer.dialog.fonts.resetCache.tip = Reset font properties cache file and rescan system for new fonts.
## Utility Pane Bookmarks Tab
viewer.utilityPane.bookmarks.tab.title = Bookmarks
## Utility Pane Bookmarks Tab
viewer.utilityPane.attachments.tab.title = Attachments
viewer.utilityPane.attachments.column.fileName.title = Name
viewer.utilityPane.attachments.column.description.title = Description
viewer.utilityPane.attachments.column.modified.title = Modified
viewer.utilityPane.attachments.column.size.title = Size
viewer.utilityPane.attachments.column.compressedSize.title = Compressed size
viewer.utilityPane.attachments.menu.saveAs.label = Save As...
viewer.utilityPane.attachments.saveAs.replace.title = ICEsoft ICEpdf - Save Error
viewer.utilityPane.attachments.saveAs.replace.msg = \
The file named {0} already exists. Do you want to replace It?
## Utility Pane Thumbnails
viewer.utilityPane.thumbs.tab.title = Thumbnails
## Layers Pane
viewer.utilityPane.layers.tab.title = Layers
## Signature Pane
viewer.utilityPane.signatures.tab.title = Signatures
viewer.utilityPane.signatures.tab.certTree.error.label = \
Unsigned Signature Fields Signer certificate could not be validated {0} {1}
viewer.utilityPane.signatures.tab.certTree.rootSigned.label = Signed by {0} {1}
viewer.utilityPane.signatures.tab.certTree.rootValidating.label = Validating signature {0} {1}
viewer.utilityPane.signatures.tab.certTree.cert.invalid.label = Signature is invalid:
viewer.utilityPane.signatures.tab.certTree.cert.unknown.label = Signature is valid:
viewer.utilityPane.signatures.tab.certTree.cert.valid.label = Signature validity is unknown:
viewer.utilityPane.signatures.tab.certTree.doc.modified.label = \
This version of the document is unaltered but subsequent changes have been made
viewer.utilityPane.signatures.tab.certTree.doc.unmodified.label = Document has not been modified since it was signed
viewer.utilityPane.signatures.tab.certTree.doc.major.label = Document has been altered or corrupted since it was signed
viewer.utilityPane.signatures.tab.certTree.signature.identity.unknown.label = \
Signer's identity is unknown because it could not be found in your keystore
viewer.utilityPane.signatures.tab.certTree.signature.identity.unchecked.label = \
Signature is valid, but revocation of the signer's identity could not be checked
viewer.utilityPane.signatures.tab.certTree.signature.identity.valid.label = Signer's identity is valid
viewer.utilityPane.signatures.tab.certTree.signature.time.local.label = Signing time is from the clock on this signer's computer
viewer.utilityPane.signatures.tab.certTree.signature.time.embedded.label = \
Signature included an embedded timestamp but it could not be validated
viewer.utilityPane.signatures.tab.certTree.signature.details.label = Signature Details
viewer.utilityPane.signatures.tab.certTree.signature.details.reason.label = Reason: {0}
viewer.utilityPane.signatures.tab.certTree.signature.details.location.label = Location: {0}
viewer.utilityPane.signatures.tab.certTree.signature.details.full.label = Certificate Details...
viewer.utilityPane.signatures.tab.certTree.signature.lastChecked.label = Last Checked: {0}
viewer.utilityPane.signatures.tab.certTree.unsigned.label = Unsigned Signature Fields
## Signature certificate view dialog.
viewer.utilityPane.signatures.cert.dialog.title = Certificate Details
viewer.utilityPane.signatures.cert.dialog.closeButton.label = Close
viewer.utilityPane.signatures.cert.dialog.closeButton.mnemonic = C
viewer.utilityPane.signatures.cert.dialog.info.notAvailable.label = N/A
viewer.utilityPane.signatures.cert.dialog.info.unknownSubject.label = N/A Subject
viewer.utilityPane.signatures.cert.dialog.info.unknownIssuer.label = N/A Issuer
viewer.utilityPane.signatures.cert.dialog.info.certificateInfo.label = {0} - {1}
viewer.utilityPane.signatures.cert.dialog.info.column1.label = Field
viewer.utilityPane.signatures.cert.dialog.info.column2.label = Value
viewer.utilityPane.signatures.cert.dialog.info.version.label = Version
viewer.utilityPane.signatures.cert.dialog.info.version.value = v{0}
viewer.utilityPane.signatures.cert.dialog.info.serialNumber.label = Serial Number
viewer.utilityPane.signatures.cert.dialog.info.serialNumber.value = {0}
viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.label = Signature Algorithm
viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.value = {0}
viewer.utilityPane.signatures.cert.dialog.info.issuer.label = Issuer
viewer.utilityPane.signatures.cert.dialog.info.issuer.value = \
Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6}
viewer.utilityPane.signatures.cert.dialog.info.validity.label = Validity
viewer.utilityPane.signatures.cert.dialog.info.validity.value = From: {0}\n To: {1}
viewer.utilityPane.signatures.cert.dialog.info.subject.label = Subject
viewer.utilityPane.signatures.cert.dialog.info.subject.value = \
Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6}
viewer.utilityPane.signatures.cert.dialog.info.signature.label = Signature
viewer.utilityPane.signatures.cert.dialog.info.md5.label = MD5 Fingerprint
viewer.utilityPane.signatures.cert.dialog.info.md5.value = {0}
viewer.utilityPane.signatures.cert.dialog.info.sha1.label = SHA1 Fingerprint
viewer.utilityPane.signatures.cert.dialog.info.sha1.value = {0}
viewer.utilityPane.signatures.verify.initializingMessage.label = Validating {0} of {1} Signatures
viewer.utilityPane.signatures.verify.completeMessage.label = Validating process complete
viewer.utilityPane.signatures.verify.validating.label = Validating signature...
## Annotation Tab
viewer.utilityPane.annotation.tab.title = Annotations
## Utility Pane Annotation Link Tab
viewer.utilityPane.annotation.link.appearance.title = Link Annotation
viewer.utilityPane.annotation.link.highlightType = Highlight Style:
viewer.utilityPane.annotation.link.none = None
viewer.utilityPane.annotation.link.invert = Invert`
viewer.utilityPane.annotation.link.outline = Outline
viewer.utilityPane.annotation.link.push = Push
## Utility Pane Annotation text markup Tab
viewer.utilityPane.annotation.textMarkup.appearance.title = Text Markup Annotation
viewer.utilityPane.annotation.textMarkup.highlightType = Type:
viewer.utilityPane.annotation.textMarkup.colorChooserTitle = MarKup Color
viewer.utilityPane.annotation.textMarkup.colorLabel = Color:
viewer.utilityPane.annotation.textMarkup.transparencyLabel = Transparency:
## Utility Pane Annotation line Tab
viewer.utilityPane.annotation.line.appearance.title = Line Annotation
viewer.utilityPane.annotation.line.lineThickness = Line Thickness:
viewer.utilityPane.annotation.line.lineStyle = Line Style:
viewer.utilityPane.annotation.line.startStyle = Start:
viewer.utilityPane.annotation.line.endStyle = End:
viewer.utilityPane.annotation.line.colorChooserTitle = Line Color
viewer.utilityPane.annotation.line.colorInternalChooserTitle = Line Internal Color
viewer.utilityPane.annotation.line.colorLabel = Color:
viewer.utilityPane.annotation.line.colorInternalLabel = Fill Color:
viewer.utilityPane.annotation.line.end.none = None
viewer.utilityPane.annotation.line.end.openArrow = Open Arrow
viewer.utilityPane.annotation.line.end.closedArrow = Closed Arrow
viewer.utilityPane.annotation.line.end.diamond = Diamond
viewer.utilityPane.annotation.line.end.square = Square
viewer.utilityPane.annotation.line.end.circle = Circle
viewer.utilityPane.annotation.line.transparencyLabel = Transparency:
## Utility Pane Annotation square Tab
viewer.utilityPane.annotation.square.appearance.title = Square Annotation
viewer.utilityPane.annotation.square.lineThickness = Border Thickness:
viewer.utilityPane.annotation.square.lineStyle = Border Style:
viewer.utilityPane.annotation.square.colorBorderChooserTitle = Border Color
viewer.utilityPane.annotation.square.colorInteriorChooserTitle = Fill Color
viewer.utilityPane.annotation.square.borderTypeLabel = Border Type:
viewer.utilityPane.annotation.square.colorBorderLabel = Border Color:
viewer.utilityPane.annotation.square.colorInteriorLabel = Fill Color:
viewer.utilityPane.annotation.square.fillTypeLabel = Fill Type:
viewer.utilityPane.annotation.square.transparencyLabel = Transparency:
## Utility Pane Annotation free text Tab
viewer.utilityPane.annotation.freeText.appearance.title = FreeText Annotation
viewer.utilityPane.annotation.freeText.font.name = Font Name:
viewer.utilityPane.annotation.freeText.font.style = Font Style:
viewer.utilityPane.annotation.freeText.font.size = Font Size:
viewer.utilityPane.annotation.freeText.font.color = Font Color:
viewer.utilityPane.annotation.freeText.font.color.ChooserTitle = Font Color
viewer.utilityPane.annotation.freeText.border.thickness = Border Thickness:
viewer.utilityPane.annotation.freeText.border.type = Border Type:
viewer.utilityPane.annotation.freeText.border.style = Border Style:
viewer.utilityPane.annotation.freeText.border.color = Border Color:
viewer.utilityPane.annotation.freeText.border.color.ChooserTitle = Border Color
viewer.utilityPane.annotation.freeText.fill.type = Fill Type:
viewer.utilityPane.annotation.freeText.fill.color = Fill Color:
viewer.utilityPane.annotation.freeText.transparencyLabel = Transparency:
viewer.utilityPane.annotation.freeText.fill.color.ChooserTitle = Fill Color
viewer.utilityPane.annotation.freeText.font.dialog = Dialog
viewer.utilityPane.annotation.freeText.font.dialogInput = DialogInput
viewer.utilityPane.annotation.freeText.font.monospaced = Monospaced
viewer.utilityPane.annotation.freeText.font.serif = Serif
viewer.utilityPane.annotation.freeText.font.sanSerif = SansSerif
viewer.utilityPane.annotation.freeText.font.style.plain = Plain
viewer.utilityPane.annotation.freeText.font.style.italic = Italic
viewer.utilityPane.annotation.freeText.font.style.bold = Bold
viewer.utilityPane.annotation.freeText.font.name.helvetica = Helvetica
viewer.utilityPane.annotation.freeText.font.name.helveticaOblique = Helvetica-Oblique
viewer.utilityPane.annotation.freeText.font.name.helveticaBold = Helvetica-Bold
viewer.utilityPane.annotation.freeText.font.name.HelveticaBoldOblique = Helvetica-BoldOblique
viewer.utilityPane.annotation.freeText.font.name.timesItalic = Times-Italic
viewer.utilityPane.annotation.freeText.font.name.timesBold = Times-Bold
viewer.utilityPane.annotation.freeText.font.name.timesBoldItalic = Times-BoldItalic
viewer.utilityPane.annotation.freeText.font.name.timesRoman = Times-Roman
viewer.utilityPane.annotation.freeText.font.name.courier = Courier
viewer.utilityPane.annotation.freeText.font.name.courierOblique = Courier-Oblique
viewer.utilityPane.annotation.freeText.font.name.courierBoldOblique = Courier-BoldOblique
viewer.utilityPane.annotation.freeText.font.name.courierBold = Courier-Bold
## Utility Pane Annotation text Tab
viewer.utilityPane.annotation.text.appearance.title = Text Annotation
viewer.utilityPane.annotation.text.iconName = Icon:
viewer.utilityPane.annotation.text.iconName.comment = Comment
viewer.utilityPane.annotation.text.iconName.check = Check
viewer.utilityPane.annotation.text.iconName.checkMark = CheckMark
viewer.utilityPane.annotation.text.iconName.circle = Circle
viewer.utilityPane.annotation.text.iconName.cross = Cross
viewer.utilityPane.annotation.text.iconName.crossHairs = CrossHairs
viewer.utilityPane.annotation.text.iconName.help = Help
viewer.utilityPane.annotation.text.iconName.insert = Insert
viewer.utilityPane.annotation.text.iconName.key = Key
viewer.utilityPane.annotation.text.iconName.newParagraph = NewParagraph
viewer.utilityPane.annotation.text.iconName.paragraph = Paragraph
viewer.utilityPane.annotation.text.iconName.rightArrow = RightArrow
viewer.utilityPane.annotation.text.iconName.rightPointer = RightPointer
viewer.utilityPane.annotation.text.iconName.star = Star
viewer.utilityPane.annotation.text.iconName.upArrow = UpArrow
viewer.utilityPane.annotation.text.iconName.upLeftArrow = UpLeftArrow
## Utility Pane Annotation circle Tab
viewer.utilityPane.annotation.circle.appearance.title = Circle Annotation
viewer.utilityPane.annotation.circle.lineThickness = Border Thickness:
viewer.utilityPane.annotation.circle.lineStyle = Border Style:
viewer.utilityPane.annotation.circle.colorBorderChooserTitle = Border Color
viewer.utilityPane.annotation.circle.colorInteriorChooserTitle = Interior Color
viewer.utilityPane.annotation.circle.colorBorderLabel = Border Color:
viewer.utilityPane.annotation.circle.colorInteriorLabel = Fill Color:
viewer.utilityPane.annotation.circle.fillTypeLabel = Fill Type:
viewer.utilityPane.annotation.circle.transparencyLabel = Transparency:
## Utility Pane Annotation ink Tab
viewer.utilityPane.annotation.ink.appearance.title = Ink Annotation
viewer.utilityPane.annotation.ink.lineThickness = Ink Thickness:
viewer.utilityPane.annotation.ink.lineStyle = Ink Style:
viewer.utilityPane.annotation.ink.colorBorderChooserTitle = Ink Color
viewer.utilityPane.annotation.ink.colorBorderLabel = Ink Color:
viewer.utilityPane.annotation.ink.transparencyLabel = Transparency:
## Utility Pane border Tab
viewer.utilityPane.annotation.border.title = Border
viewer.utilityPane.annotation.border.linkType = Border Type:
viewer.utilityPane.annotation.border.lineThickness = Border Thickness:
viewer.utilityPane.annotation.border.lineStyle = Border Style:
viewer.utilityPane.annotation.border.colorChooserTitle = Border Color
viewer.utilityPane.annotation.border.colorLabel = Color:
viewer.utilityPane.annotation.border.borderType.visibleRectangle = Visible
viewer.utilityPane.annotation.border.borderType.invisibleRectangle = Invisible
viewer.utilityPane.annotation.border.solid = Solid
viewer.utilityPane.annotation.border.dashed = Dashed
viewer.utilityPane.annotation.border.beveled = Beveled
viewer.utilityPane.annotation.border.inset = Inset
viewer.utilityPane.annotation.border.underline = Underline
## Utility Pane border Tab
viewer.utilityPane.annotation.flags.title = Flags
viewer.utilityPane.annotation.flags.noRotate = No Rotate:
viewer.utilityPane.annotation.flags.noZoom = No Zoom:
viewer.utilityPane.annotation.flags.readOnly = Read Only:
viewer.utilityPane.annotation.flags.printable = Printable:
viewer.utilityPane.annotation.flags.yes = Printable:
viewer.utilityPane.annotation.flags.enabled = Enabled
viewer.utilityPane.annotation.flags.disabled = Disabled
## annotation action pane and dialogs.
viewer.utilityPane.action.selectionTitle = Action
viewer.utilityPane.action.addAction = Add
viewer.utilityPane.action.editAction = Edit
viewer.utilityPane.action.removeAction = Remove
viewer.utilityPane.action.type.destination.label = Destination
viewer.utilityPane.action.type.uriAction.label = URI Action
viewer.utilityPane.action.type.goToAction.label = GoTo Action
viewer.utilityPane.action.type.launchAction.label = Launch Action
viewer.utilityPane.action.dialog.new.title = Add New Action
viewer.utilityPane.action.dialog.new.msgs = Action Type:
viewer.utilityPane.action.dialog.delete.title = Delete Confirmation
viewer.utilityPane.action.dialog.delete.msgs = Are you sure your want to delete this action?
## uri action dialog test
viewer.utilityPane.action.dialog.uri.title = URI Action Properties
viewer.utilityPane.action.dialog.uri.msgs = URI:
## launch action dialog test
viewer.utilityPane.action.dialog.launch.title = Launch Action Properties
viewer.utilityPane.action.dialog.launch.msgs = File Path:
## GoTo action dialog text
viewer.utilityPane.action.dialog.goto.title = GoTo Action Properties
viewer.utilityPane.action.dialog.goto.page.label = Page:
viewer.utilityPane.action.dialog.goto.type.label = Type
viewer.utilityPane.action.dialog.goto.type.xyz.label = Absolute
viewer.utilityPane.action.dialog.goto.type.fit.label = Fit Page
viewer.utilityPane.action.dialog.goto.type.fith.label = Fit Top Width
viewer.utilityPane.action.dialog.goto.type.fitv.label = Fit Left Width
viewer.utilityPane.action.dialog.goto.type.fitr.label = Fit Zoom Box
viewer.utilityPane.action.dialog.goto.type.fitb.label = Fit Page Bounds
viewer.utilityPane.action.dialog.goto.type.fitbh.label = Fit Bounds Top
viewer.utilityPane.action.dialog.goto.type.fitbv.label = Fit Bounds Left
viewer.utilityPane.action.dialog.goto.right.label = Right:
viewer.utilityPane.action.dialog.goto.left.label = Left:
viewer.utilityPane.action.dialog.goto.top.label = Top:
viewer.utilityPane.action.dialog.goto.bottom.label = Bottom:
viewer.utilityPane.action.dialog.goto.zoom.label = Zoom:
viewer.utilityPane.action.dialog.goto.unassigned.label = NaN
viewer.utilityPane.action.dialog.goto.current.label = Current View:
viewer.utilityPane.action.dialog.goto.current = Set Location
viewer.utilityPane.action.dialog.goto.name.label = Name:
viewer.utilityPane.action.dialog.goto.browse = Browse...
viewer.utilityPane.action.dialog.goto.explicitDestination.title = Implicit Destination
viewer.utilityPane.action.dialog.goto.nameDestination.title = Named Destination
# Destination Named Tree
viewer.utilityPane.action.dialog.goto.nameTree.title = Document Name Tree
viewer.utilityPane.action.dialog.goto.nameTree.root.label = Name Tree
viewer.utilityPane.action.dialog.goto.nameTree.branch.label = {0} to {1}
## Utility Pane Search Tab
viewer.utilityPane.search.tab.title = Search
viewer.utilityPane.search.searchText.label = Search Text:
viewer.utilityPane.search.results.label = Results:
viewer.utilityPane.search.searchButton.label = Search
viewer.utilityPane.search.clearSearchButton.label = Clear
viewer.utilityPane.search.caseSenstiveCheckbox.label = Case-sensitive
viewer.utilityPane.search.wholeWordCheckbox.label = Whole words only
viewer.utilityPane.search.cumlitiveCheckbox.label = Cumulative
viewer.utilityPane.search.showPagesCheckbox.label = Show Pages
viewer.utilityPane.search.stopButton.label = Stop
viewer.utilityPane.search.searching.msg = Search...
# Searching x out of y page(s)
viewer.utilityPane.search.searching1.msg = \
Searching {0} out of {1}
viewer.utilityPane.search.searching1.oneFile.msg = {2} page
viewer.utilityPane.search.searching1.moreFile.msg = {2} pages
# Page x (y result(s))
viewer.utilityPane.search.result.msg = Page {0} ({1})
viewer.utilityPane.search.result.oneFile.msg = {2} result
viewer.utilityPane.search.result.moreFile.msg = {2} results
# Searched x page(s) (y matches)
viewer.utilityPane.search.progress.msg = \
Searched {0} {1} ({2})
viewer.utilityPane.search.progress.onePage.msg = page
viewer.utilityPane.search.progress.morePage.msg = pages
viewer.utilityPane.search.progress.oneMatch.msg = {2} match
viewer.utilityPane.search.progress.moreMatch.msg = {2} matches
## Popup Annotation component
viewer.annotation.popup.reply.label = Reply
viewer.annotation.popup.delete.label = Delete
viewer.annotation.popup.status.label = Set Status
viewer.annotation.popup.status.accepted.label = Accepted
viewer.annotation.popup.status.cancelled.label = Cancelled
viewer.annotation.popup.status.completed.label = Completed
viewer.annotation.popup.status.rejected.label = Rejected
viewer.annotation.popup.status.none.label = None
viewer.annotation.popup.openAll.label = Open all Popups
viewer.annotation.popup.minimizeAll.label = Minimize Popups
viewer.annotation.popup.replyTo.label = Re: {0}
viewer.annotation.popup.status.none.title = None: {0}
viewer.annotation.popup.status.none.msg = None set by {0}
viewer.annotation.popup.status.accepted.title = Accepted: {0}
viewer.annotation.popup.status.accepted.msg = Accepted set by {0}
viewer.annotation.popup.status.cancelled.title = Cancelled: {0}
viewer.annotation.popup.status.cancelled.msg = Cancelled set by {0}
viewer.annotation.popup.status.completed.title = Completed: {0}
viewer.annotation.popup.status.completed.msg = Completed set by {0}
viewer.annotation.popup.status.rejected.title = Rejected: {0}
viewer.annotation.popup.status.rejected.msg = Rejected set by {0}
## Signature component
viewer.annotation.signature.menu.validateSignature.label = Validate Signature
viewer.annotation.signature.menu.showCertificates.label = Show Certificate Properties
viewer.annotation.signature.menu.signatureProperties.label = Show Signature Properties
viewer.annotation.signature.menu.signaturePageNavigation.label = Go to Page...
## Signature validation dialog.
viewer.annotation.signature.validation.dialog.title = Signature Validation Summary
viewer.annotation.signature.validation.dialog.close.button.label = Close
viewer.annotation.signature.validation.dialog.signerProperties.button.label = Signature Properties...
# common validation messages
viewer.annotation.signature.validation.common.invalid.label = Signature is invalid:
viewer.annotation.signature.validation.common.unknown.label = Signature is valid:
viewer.annotation.signature.validation.common.valid.label = Signature validity is unknown:
viewer.annotation.signature.validation.common.signedBy.label = - Signed by {0} {1}
viewer.annotation.signature.validation.common.doc.modified.label = \
- This version of the document is unaltered but subsequent changes have been made
viewer.annotation.signature.validation.common.doc.unmodified.label = - Document has not been modified since it was signed
viewer.annotation.signature.validation.common.doc.major.label = - Document has been altered or corrupted since it was signed
viewer.annotation.signature.validation.common.identity.unknown.label = \
- Signer's identity is unknown because it could not be found in your keystore
viewer.annotation.signature.validation.common.identity.unchecked.label = \
- Signature is valid, but revocation of the signer's identity could not be checked
viewer.annotation.signature.validation.common.identity.valid.label = - Signer's identity is valid
viewer.annotation.signature.validation.common.time.local.label = - Signing time is from the clock on this signer's computer
viewer.annotation.signature.validation.common.time.embedded.label = \
- Signature included an embedded timestamp but it could not be validated
viewer.annotation.signature.validation.common.notAvailable.label = N/A
## Signatures properties Dialog.
viewer.annotation.signature.properties.dialog.title = Signature Properties
viewer.annotation.signature.properties.dialog.invalid.label = Signature is invalid
viewer.annotation.signature.properties.dialog.unknown.label = Signature is valid
viewer.annotation.signature.properties.dialog.valid.label = Signature validity is unknown
viewer.annotation.signature.properties.dialog.signedBy.label = Signed by {0} {1}
viewer.annotation.signature.properties.dialog.signingTime.label = Signed time: {0}
viewer.annotation.signature.properties.dialog.reason.label = Reason: {0}
viewer.annotation.signature.properties.dialog.location.label = Location: {0}
# SignatureSigner Info
viewer.annotation.signature.properties.dialog.pathValidation.success = - Path validation checks were successful.
viewer.annotation.signature.properties.dialog.pathValidation.failure = - Path validation checks were unsuccessful.
viewer.annotation.signature.properties.dialog.revocation.success = - Signer's certificate is valid and has not been revoked.
viewer.annotation.signature.properties.dialog.revocation.failure = - Revocation checking was not performed.
viewer.annotation.signature.properties.dialog.certificateExpired.failure = - Signer certificate has expired.
viewer.annotation.signature.properties.dialog.showCertificates.label = Signer's Certificate...
viewer.annotation.signature.properties.dialog.validity.title = Validity Summary
viewer.annotation.signature.properties.dialog.signerInfo.title = Signer Info
## Common Button Labels
viewer.button.ok.label = Ok
viewer.button.ok.mnemonic = O
viewer.button.cancel.label = Cancel
viewer.button.cancel.mnemonic = C
## Pilot Specific Mesages
pilot.title = ICEbrowser - ICEpdf Pilot Errror
pilot.loading.msg =Opening document {0} ...
pilot.display.msg = Displaying {0}
pilot.loading.error.msg = PDF Pilot: Failed to load {0}.
pilot.error.classLoading = Required class {0} not found. Required library \
'icepdf.jar' may not be on the classpath - PDF Pilot disabled.";
###
# General Error Messages
# Command Line Errors
viewer.commandLin.error = \
Usage: java org.icepdf.ri.viewer.Main [-loadfile <value>] [-loadurl <value>]
# Launcher errors
viewer.launcher.URLError.dialog.title =ICEsoft ICEpdf
viewer.launcher.URLError.dialog.message = ICEpdf could not open the specified file. {0} at URL: {1}.
viewer.launcher.lookAndFeel.error.message = The specified look-and-feel ({0}) is not accessible from this platform.
# Pilot Loading Errors
### parser error dialogs
parse.title = Properties Parsing Error
parse.integer = Warning : {0} is not a correct integer.
parse.float = Warning : {0} is not a correct float.
parse.double = Warning : {0} is not a correct double.
parse.choice = Warning : {0} is not a valid choice.
parse.laf = Warning : look-and-feel {0} is not supported.
### Properties Manager Errors
manager.properties.title = ICEpdf Properties Manager
fontManager.properties.title = ICEpdf Font Manager
manager.properties.createNewDirectory = \
To create the directory {0},\n\
where the ICEpdf Viewer will store changes to its setup, click Yes.\n\n\
If you click "No", all changes you make to the ICEpdf Viewer setup\n\
will be lost when you quit the application. \n\n
manager.properties.failedCreation = \
ICEpdf Viewer directory to store user data can not be created:\n\
{0}\n\
ICEpdf Viewer will not save changes to its default setup.
manager.properties.session.nolock = \
Error creating the lock file :\n\
{0}\n
manager.properties.session.readError = \
Error loading properties file: \n\
{0}
manager.properties.deleted = Property file has been deleted\n\
({0})\n\
Recreate it ?
manager.properties.modified = Property file has been modified since last update\n\
({0,date,long})\n\
Would you like to merge changes in the file with the current properties?
manager.properties.saveError = Impossible to save property file.\n\
Encountered the folowing error :\n\
{0}
manager.properties.lafError =\
Look&Feel {0} given in the default properties is unsupported.\n\
Using system default.
manager.properties.brokenProperty = Broken default property {0} value: {1}
manager.properties.missingProperty = Missing default property {0} value: {1}

View File

@ -21,19 +21,24 @@ package org.sleuthkit.autopsy.contentviewers;
import java.awt.BorderLayout;
import java.awt.Component;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import java.util.ResourceBundle;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import org.icepdf.core.SecurityCallback;
import org.openide.util.NbBundle;
import org.sleuthkit.datamodel.AbstractFile;
import org.sleuthkit.datamodel.ReadContentInputStream;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
@ -42,6 +47,7 @@ import org.icepdf.core.exceptions.PDFSecurityException;
import org.icepdf.core.pobjects.Document;
import org.icepdf.ri.common.ComponentKeyBinding;
import org.icepdf.ri.common.MyGUISecurityCallback;
import org.icepdf.ri.common.SwingController;
import org.icepdf.ri.common.SwingViewBuilder;
import org.icepdf.ri.common.views.DocumentViewControllerImpl;
@ -51,15 +57,17 @@ import org.icepdf.ri.util.PropertiesManager;
/**
* Application content viewer for PDF files.
*/
public class PDFViewer implements FileTypeViewer {
final class PDFViewer implements FileTypeViewer {
private static final Logger logger = Logger.getLogger(PDFViewer.class.getName());
private JPanel container;
private final PropertiesManager propsManager;
private final ResourceBundle messagesBundle;
public PDFViewer() {
PDFViewer() {
container = createNewContainer();
messagesBundle = getMessagesBundle();
propsManager = getCustomProperties();
}
@ -71,7 +79,7 @@ public class PDFViewer implements FileTypeViewer {
@Override
public void setFile(AbstractFile file) {
// The 'C' in IcePDFs MVC set up.
SwingController controller = new SwingController();
SwingController controller = new SwingController(messagesBundle);
// Builder for the 'V' in IcePDFs MVC set up
SwingViewBuilder viewBuilder = new SwingViewBuilder(controller, propsManager);
@ -97,7 +105,13 @@ public class PDFViewer implements FileTypeViewer {
protected Document doInBackground() throws PDFException, PDFSecurityException, IOException {
ReadContentInputStream stream = new ReadContentInputStream(file);
Document doc = new Document();
// This will read the stream into memory.
// Prompts the user for a password if the document is password
// protected.
doc.setSecurityCallback(createPasswordDialogCallback());
// This will read the stream into memory and invoke the
// security callback if needed.
doc.setInputStream(stream, null);
return doc;
}
@ -169,9 +183,12 @@ public class PDFViewer implements FileTypeViewer {
// This suppresses a pop-up, from IcePDF, that asks if you'd like to
// save configuration changes to disk.
props.setProperty("application.showLocalStorageDialogs", "false");
ResourceBundle defaultMessageBundle = ResourceBundle.getBundle(PropertiesManager.DEFAULT_MESSAGE_BUNDLE);
return new PropertiesManager(System.getProperties(), props, defaultMessageBundle);
return new PropertiesManager(System.getProperties(), props, messagesBundle);
}
private ResourceBundle getMessagesBundle() {
return NbBundle.getBundle(PDFViewer.class);
}
@NbBundle.Messages({
@ -189,4 +206,27 @@ public class PDFViewer implements FileTypeViewer {
private void showEncryptionDialog() {
MessageNotifyUtil.Message.error(Bundle.PDFViewer_encryptedDialog());
}
/**
* Creates a callback that will prompt the user for password input.
*/
private SecurityCallback createPasswordDialogCallback() {
// MyGUISecurityCallback is a reference implementation from IcePDF.
return new MyGUISecurityCallback(null, messagesBundle) {
private String password;
@Override
public String requestPassword(Document document) {
try {
SwingUtilities.invokeAndWait(() -> {
// Show the password dialog on the EDT.
this.password = super.requestPassword(document);
});
return this.password;
} catch (InterruptedException | InvocationTargetException ex) {
return null;
}
}
};
}
}

View File

@ -19,11 +19,13 @@
package org.sleuthkit.autopsy.coreutils;
import com.google.common.collect.ImmutableSet;
import java.util.Arrays;
import static java.util.Arrays.asList;
import java.util.Collection;
import java.util.Collections;
import javax.imageio.ImageIO;
import static org.apache.commons.collections4.ListUtils.removeAll;
import org.apache.commons.lang.StringUtils;
import org.openide.util.NbBundle;
/**
@ -33,7 +35,14 @@ public final class FileTypeUtils {
private static final ImmutableSet<String> IMAGE_MIME_TYPES
= new ImmutableSet.Builder<String>()
.addAll(removeAll(asList(ImageIO.getReaderMIMETypes()),
.addAll(removeAll(
asList(
// remove any empty mime types provided by ImageIO.getReaderMIMETypes()
// This prevents mime types added by SPI implementations from causing errors
// (i.e. 'jai-imageio' utilized with IcePDF)
Arrays.stream(ImageIO.getReaderMIMETypes())
.filter((mimeType) -> StringUtils.isNotBlank(mimeType))
.toArray(String[]::new)),
asList("application/octet-stream"))) //this claims to be supported, but is not really an image.
.add("image/bmp", //NON-NLS
"image/gif", //NON-NLS

View File

@ -46,6 +46,8 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javafx.concurrent.Task;
import javafx.embed.swing.SwingFXUtils;
import javax.annotation.Nonnull;
@ -137,11 +139,25 @@ public class ImageUtils {
}
FFMPEG_LOADED = tempFfmpegLoaded;
SUPPORTED_IMAGE_EXTENSIONS.addAll(Arrays.asList(ImageIO.getReaderFileSuffixes()));
// remove any empty extension types provided by ImageIO.getReaderFileSuffixes()
// This prevents extensions added by SPI implementations from causing errors
// (i.e. 'jai-imageio' utilized with IcePDF)
List<String> imageSuffixList = Arrays.stream(ImageIO.getReaderFileSuffixes())
.filter((extension) -> StringUtils.isNotBlank(extension))
.collect(Collectors.toList());
SUPPORTED_IMAGE_EXTENSIONS.addAll(imageSuffixList);
SUPPORTED_IMAGE_EXTENSIONS.add("tec"); // Add JFIF .tec files
SUPPORTED_IMAGE_EXTENSIONS.removeIf("db"::equals); // remove db files
SUPPORTED_IMAGE_MIME_TYPES = new TreeSet<>(Arrays.asList(ImageIO.getReaderMIMETypes()));
List<String> mimeTypeList = Stream.of(ImageIO.getReaderMIMETypes())
// remove any empty mime types provided by ImageIO.getReaderMIMETypes()
// This prevents mime types added by SPI implementations from causing errors
// (i.e. 'jai-imageio' utilized with IcePDF)
.filter((mimeType) -> StringUtils.isNotBlank(mimeType))
.collect(Collectors.toList());
SUPPORTED_IMAGE_MIME_TYPES = new TreeSet<>(mimeTypeList);
/*
* special cases and variants that we support, but don't get registered
* with ImageIO automatically

View File

@ -23,6 +23,8 @@ import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@ -38,9 +40,9 @@ import javax.swing.SwingWorker;
import org.openide.util.NbBundle.Messages;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.datamodel.utils.IconsUtil;
import org.sleuthkit.datamodel.BlackboardArtifact;
import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
import org.sleuthkit.datamodel.BlackboardAttribute;
import org.sleuthkit.datamodel.DataSource;
import org.sleuthkit.datamodel.SleuthkitCase;
import org.sleuthkit.datamodel.TskCoreException;
@ -482,6 +484,54 @@ class GeoFilterPanel extends javax.swing.JPanel {
return new Sources(validSources, atCountsTotal);
}
/**
* Get a count of artifacts of the given type containing GPS data for
* the given data case and source. Does not include rejected artifacts.
*
* @param sleuthkitCase
* @param dataSource
* @param artifactType
*
* @return The artifacts count that match the criteria
*
* @throws TskCoreException
*/
private long getGPSDataCount(SleuthkitCase sleuthkitCase,
DataSource dataSource, BlackboardArtifact.ARTIFACT_TYPE artifactType) throws TskCoreException {
long count = 0;
String queryStr
= "SELECT count(DISTINCT artifact_id) AS count FROM"
+ " ("
+ " SELECT * FROM blackboard_artifacts as arts"
+ " INNER JOIN blackboard_attributes as attrs"
+ " ON attrs.artifact_id = arts.artifact_id"
+ " WHERE arts.artifact_type_id = " + artifactType.getTypeID()
+ " AND arts.data_source_obj_id = " + dataSource.getId()
+ " AND arts.review_status_id != " + BlackboardArtifact.ReviewStatus.REJECTED.getID()
+ " AND"
+ " ("
+ "attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE.getTypeID()
+ " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE.getTypeID()
+ " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_TRACKPOINTS.getTypeID()
+ " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_WAYPOINTS.getTypeID()
+ " )"
+ " )";
try (SleuthkitCase.CaseDbQuery queryResult = sleuthkitCase.executeQuery(queryStr);
ResultSet resultSet = queryResult.getResultSet()) {
if (resultSet.next()) {
count = resultSet.getLong("count");
}
} catch (SQLException ex) {
Throwable cause = ex.getCause();
if (cause != null) {
logger.log(Level.SEVERE, cause.getMessage(), cause);
} else {
logger.log(Level.SEVERE, ex.getMessage(), ex);
}
}
return count;
}
/**
* Returns a Map representing the number of sources found for each
* artifact type. If no data was found, an empty map is returned.
@ -496,7 +546,7 @@ class GeoFilterPanel extends javax.swing.JPanel {
private Map<ARTIFACT_TYPE, Long> getGPSDataSources(SleuthkitCase sleuthkitCase, DataSource dataSource) throws TskCoreException {
HashMap<ARTIFACT_TYPE, Long> ret = new HashMap<>();
for (BlackboardArtifact.ARTIFACT_TYPE type : GPS_ARTIFACT_TYPES) {
long count = sleuthkitCase.getBlackboardArtifactsTypeCount(type.getTypeID(), dataSource.getId());
long count = getGPSDataCount(sleuthkitCase, dataSource, type);
if (count > 0) {
ret.put(type, count);
}

View File

@ -39,6 +39,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@ -83,9 +84,13 @@ import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
final public class MapPanel extends javax.swing.JPanel {
static final String CURRENT_MOUSE_GEOPOSITION = "CURRENT_MOUSE_GEOPOSITION";
private static final Logger logger = Logger.getLogger(MapPanel.class.getName());
private static final long serialVersionUID = 1L;
private static final Set<Integer> DOT_WAYPOINT_TYPES = new HashSet<>();
private static final int DOT_SIZE = 12;
private boolean zoomChanging;
private KdTree<MapWaypoint> waypointTree;
private Set<MapWaypoint> waypointSet;
@ -104,6 +109,12 @@ final public class MapPanel extends javax.swing.JPanel {
private MapWaypoint currentlySelectedWaypoint;
private Set<MapWaypoint> currentlySelectedTrack;
static {
DOT_WAYPOINT_TYPES.add(ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID());
DOT_WAYPOINT_TYPES.add(ARTIFACT_TYPE.TSK_GPS_TRACK.getTypeID());
DOT_WAYPOINT_TYPES.add(ARTIFACT_TYPE.TSK_GPS_ROUTE.getTypeID());
}
/**
* Creates new form MapPanel
*/
@ -486,14 +497,30 @@ final public class MapPanel extends javax.swing.JPanel {
Iterator<MapWaypoint> iterator = waypoints.iterator();
// These maybe the points closest to lat/log was clicked but
// that doesn't mean they are close in terms of pixles.
// These may be the points closest to the lat/lon location that was
// clicked, but that doesn't mean they are close in terms of pixles.
List<MapWaypoint> closestPoints = new ArrayList<>();
while (iterator.hasNext()) {
MapWaypoint nextWaypoint = iterator.next();
Point2D point = mapViewer.convertGeoPositionToPoint(nextWaypoint.getPosition());
Rectangle rect = new Rectangle((int) point.getX() - (whiteWaypointImage.getWidth() / 2), (int) point.getY() - whiteWaypointImage.getHeight(), whiteWaypointImage.getWidth(), whiteWaypointImage.getHeight());
int pointX = (int) point.getX();
int pointY = (int) point.getY();
Rectangle rect;
if (DOT_WAYPOINT_TYPES.contains(nextWaypoint.getArtifactTypeID())) {
rect = new Rectangle(
pointX - (DOT_SIZE / 2),
pointY - (DOT_SIZE / 2),
DOT_SIZE,
DOT_SIZE
);
} else {
rect = new Rectangle(
pointX - (whiteWaypointImage.getWidth() / 2),
pointY - whiteWaypointImage.getHeight(),
whiteWaypointImage.getWidth(),
whiteWaypointImage.getHeight()
);
}
if (rect.contains(clickPoint)) {
closestPoints.add(nextWaypoint);
@ -689,6 +716,7 @@ final public class MapPanel extends javax.swing.JPanel {
if (waypoints.size() > 0) {
MapWaypoint selection = waypoints.get(0);
currentlySelectedWaypoint = selection;
currentlySelectedTrack = null;
for (Set<MapWaypoint> track : tracks) {
if (track.contains(selection)) {
currentlySelectedTrack = track;
@ -751,17 +779,16 @@ final public class MapPanel extends javax.swing.JPanel {
* @return the new dot image
*/
private BufferedImage createTrackDotImage(Color color) {
int w = 10;
int h = 10;
int s = DOT_SIZE;
BufferedImage ret = new BufferedImage(w + 2, h + 2, BufferedImage.TYPE_INT_ARGB);
BufferedImage ret = new BufferedImage(s, s, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = ret.createGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(color);
g.fillOval(1, 1, w, h);
g.fillOval(1, 1, s - 2, s - 2);
g.setColor(Color.BLACK);
g.setStroke(new BasicStroke(1));
g.drawOval(1, 1, w, h);
g.drawOval(1, 1, s - 2, s - 2);
g.dispose();
return ret;
}
@ -794,14 +821,11 @@ final public class MapPanel extends javax.swing.JPanel {
public void paintWaypoint(Graphics2D g, JXMapViewer map, MapWaypoint waypoint) {
Color color = getColor(waypoint);
BufferedImage image;
int artifactType = waypoint.getArtifactTypeID();
Point2D point = map.getTileFactory().geoToPixel(waypoint.getPosition(), map.getZoom());
int x = (int) point.getX();
int y = (int) point.getY();
if (artifactType == ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID()
|| artifactType == ARTIFACT_TYPE.TSK_GPS_TRACK.getTypeID()
|| artifactType == ARTIFACT_TYPE.TSK_GPS_ROUTE.getTypeID()) {
if (DOT_WAYPOINT_TYPES.contains(waypoint.getArtifactTypeID())) {
image = dotImageCache.computeIfAbsent(color, k -> {
return createTrackDotImage(color);
});

View File

@ -64,7 +64,7 @@ public class AddHashValuesToDatabaseProgressDialog extends javax.swing.JDialog {
display(parent);
this.hashes = new ArrayList<>();
this.invalidHashes = new ArrayList<>();
this.md5Pattern = Pattern.compile("^[a-fA-F0-9]{32}$"); // NON-NLS
this.md5Pattern = Pattern.compile("^([a-fA-F0-9]{32})"); // NON-NLS
this.parentRef = parent;
this.hashDb = hashDb;
this.text = text;
@ -162,9 +162,16 @@ public class AddHashValuesToDatabaseProgressDialog extends javax.swing.JDialog {
for (String hashEntry : linesInTextArea) {
hashEntry = hashEntry.trim();
Matcher m = md5Pattern.matcher(hashEntry);
if (m.find()) {
// more information can be added to the HashEntry - sha-1, sha-512, comment
hashes.add(new HashEntry(null, m.group(0), null, null, null));
if (m.find()) {
// Is there any text left on this line? If so, treat it as a comment.
String comment = hashEntry.substring(m.end()).trim();
if (comment.length() > 0) {
comment = (comment.charAt(0) == ',') ? comment.substring(1) : comment;
hashes.add(new HashEntry(null, m.group(0), null, null, comment));
} else {
// more information can be added to the HashEntry - sha-1, sha-512, comment
hashes.add(new HashEntry(null, m.group(0), null, null, null));
}
} else {
if (!hashEntry.isEmpty()) {
invalidHashes.add(hashEntry);

View File

@ -18,7 +18,7 @@ PortableCaseInterestingItemsListPanel.selectButton.text=Select All
PortableCaseInterestingItemsListPanel.descLabel.text=Include Interesting Items from these sets:
PortableCaseInterestingItemsListPanel.jAllSetsCheckBox.text=All Interesting Items
ReportVisualPanel2.allTaggedResultsRadioButton.text=All Tagged Results
ReportVisualPanel2.advancedButton.text=Result Types
ReportVisualPanel2.advancedButton.text=Choose Result Types...
ReportVisualPanel2.deselectAllButton.text=Deselect All
ReportVisualPanel2.selectAllButton.text=Select All
ReportVisualPanel2.dataLabel.text=Select which data to report on:

View File

@ -33,7 +33,7 @@ PortableCaseInterestingItemsListPanel.selectButton.text=Select All
PortableCaseInterestingItemsListPanel.descLabel.text=Include Interesting Items from these sets:
PortableCaseInterestingItemsListPanel.jAllSetsCheckBox.text=All Interesting Items
ReportVisualPanel2.allTaggedResultsRadioButton.text=All Tagged Results
ReportVisualPanel2.advancedButton.text=Result Types
ReportVisualPanel2.advancedButton.text=Choose Result Types...
ReportVisualPanel2.deselectAllButton.text=Deselect All
ReportVisualPanel2.selectAllButton.text=Select All
ReportVisualPanel2.dataLabel.text=Select which data to report on:

View File

@ -7,7 +7,7 @@
</NonVisualComponents>
<Properties>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[650, 250]"/>
<Dimension value="[650, 275]"/>
</Property>
</Properties>
<AuxValues>
@ -25,7 +25,7 @@
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
@ -33,7 +33,6 @@
<Component id="tagsScrollPane" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" max="-2" attributes="0">
<Component id="advancedButton" linkSize="1" alignment="1" max="32767" attributes="0"/>
<Component id="deselectAllButton" linkSize="1" max="32767" attributes="0"/>
<Component id="selectAllButton" linkSize="1" max="32767" attributes="0"/>
</Group>
@ -44,8 +43,9 @@
<Component id="dataLabel" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="allResultsRadioButton" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="specificTaggedResultsRadioButton" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="advancedButton" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="0" pref="402" max="32767" attributes="0"/>
<EmptySpace min="0" pref="454" max="32767" attributes="0"/>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/>
@ -64,17 +64,20 @@
<EmptySpace max="-2" attributes="0"/>
<Component id="specificTaggedResultsRadioButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
<Group type="103" groupAlignment="0" max="-2" attributes="0">
<Group type="102" alignment="1" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<Component id="selectAllButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="deselectAllButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
<Component id="advancedButton" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="136" max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="1" attributes="0">
<Component id="tagsScrollPane" min="-2" pref="150" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
<Component id="advancedButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
</Group>
<Component id="tagsScrollPane" alignment="1" min="-2" pref="161" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>

View File

@ -321,7 +321,7 @@ final class ReportVisualPanel2 extends JPanel {
advancedButton = new javax.swing.JButton();
allTaggedResultsRadioButton = new javax.swing.JRadioButton();
setPreferredSize(new java.awt.Dimension(650, 250));
setPreferredSize(new java.awt.Dimension(650, 275));
optionsButtonGroup.add(specificTaggedResultsRadioButton);
org.openide.awt.Mnemonics.setLocalizedText(specificTaggedResultsRadioButton, org.openide.util.NbBundle.getMessage(ReportVisualPanel2.class, "ReportVisualPanel2.specificTaggedResultsRadioButton.text")); // NOI18N
@ -381,7 +381,6 @@ final class ReportVisualPanel2 extends JPanel {
.addComponent(tagsScrollPane)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(advancedButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(deselectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(selectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addGroup(layout.createSequentialGroup()
@ -389,12 +388,13 @@ final class ReportVisualPanel2 extends JPanel {
.addComponent(allTaggedResultsRadioButton)
.addComponent(dataLabel)
.addComponent(allResultsRadioButton)
.addComponent(specificTaggedResultsRadioButton))
.addGap(0, 402, Short.MAX_VALUE)))
.addComponent(specificTaggedResultsRadioButton)
.addComponent(advancedButton))
.addGap(0, 454, Short.MAX_VALUE)))
.addContainerGap())
);
layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {advancedButton, deselectAllButton, selectAllButton});
layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {deselectAllButton, selectAllButton});
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@ -408,15 +408,17 @@ final class ReportVisualPanel2 extends JPanel {
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(specificTaggedResultsRadioButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(selectAllButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(deselectAllButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(advancedButton))
.addComponent(tagsScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 161, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap())
.addGap(136, 136, 136))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(tagsScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(5, 5, 5)
.addComponent(advancedButton)
.addContainerGap())))
);
}// </editor-fold>//GEN-END:initComponents

View File

@ -190,20 +190,16 @@
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Component class="javax.swing.JTextArea" name="instructionsTextArea">
<Component class="javax.swing.JTextPane" name="instructionsTextArea">
<Properties>
<Property name="editable" type="boolean" value="false"/>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="f0" green="f0" red="f0" type="rgb"/>
</Property>
<Property name="columns" type="int" value="20"/>
<Property name="lineWrap" type="boolean" value="true"/>
<Property name="rows" type="int" value="4"/>
<Property name="contentType" type="java.lang.String" value="text/html" noResource="true"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties" key="BingTranslatorSettingsPanel.instructionsTextArea.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties" key="BingTranslatorSettingsPanel.instructionsTextArea.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="wrapStyleWord" type="boolean" value="true"/>
<Property name="caretPosition" type="int" value="0"/>
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[1000, 200]"/>
</Property>

View File

@ -32,6 +32,10 @@ import java.util.logging.Level;
import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import java.awt.Desktop;
import java.net.URISyntaxException;
import org.apache.commons.lang3.StringUtils;
import org.openide.util.NbBundle.Messages;
@ -75,6 +79,23 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel {
populateComboBox();
selectLanguageByCode(code);
targetLanguageCode = code;
instructionsTextArea.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
// Try to display the URL in the user's browswer.
if(Desktop.isDesktopSupported()) {
try {
Desktop.getDesktop().browse(e.getURL().toURI());
} catch (IOException | URISyntaxException ex) {
logger.log(Level.WARNING, "Failed to display URL in external viewer", ex);
}
}
}
}
});
}
/**
@ -140,7 +161,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel {
testResultValueLabel = new javax.swing.JLabel();
authenticationKeyLabel = new javax.swing.JLabel();
instructionsScrollPane = new javax.swing.JScrollPane();
instructionsTextArea = new javax.swing.JTextArea();
instructionsTextArea = new javax.swing.JTextPane();
javax.swing.Box.Filler filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0));
setLayout(new java.awt.GridBagLayout());
@ -265,12 +286,8 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel {
instructionsTextArea.setEditable(false);
instructionsTextArea.setBackground(new java.awt.Color(240, 240, 240));
instructionsTextArea.setColumns(20);
instructionsTextArea.setLineWrap(true);
instructionsTextArea.setRows(4);
instructionsTextArea.setText(org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.instructionsTextArea.text")); // NOI18N
instructionsTextArea.setWrapStyleWord(true);
instructionsTextArea.setCaretPosition(0);
instructionsTextArea.setContentType("text/html"); // NOI18N
instructionsTextArea.setText(org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.instructionsTextArea.text_1")); // NOI18N
instructionsTextArea.setMaximumSize(new java.awt.Dimension(1000, 200));
instructionsTextArea.setPreferredSize(new java.awt.Dimension(164, 78));
instructionsScrollPane.setViewportView(instructionsTextArea);
@ -316,7 +333,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel {
private javax.swing.JTextField authenticationKeyField;
private javax.swing.JLabel authenticationKeyLabel;
private javax.swing.JScrollPane instructionsScrollPane;
private javax.swing.JTextArea instructionsTextArea;
private javax.swing.JTextPane instructionsTextArea;
private javax.swing.JLabel resultLabel;
private javax.swing.JComboBox<LanguageWrapper> targetLanguageComboBox;
private javax.swing.JLabel targetLanguageLabel;

View File

@ -13,5 +13,5 @@ GoogleTranslatorSettingsPanel.untranslatedLabel.text=Untranslated:
GoogleTranslatorSettingsPanel.resultLabel.text=Result:
GoogleTranslatorSettingsPanel.testResultValueLabel.text=
BingTranslatorSettingsPanel.authenticationKeyLabel.text=Authentication Key:
BingTranslatorSettingsPanel.instructionsTextArea.text=You will need to provide a Microsoft Translator authentication key for your Microsoft Translator account. Instructions on how to get one are available here: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup
GoogleTranslatorSettingsPanel.instructionsTextArea.text=You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: https://cloud.google.com/iam/docs/creating-managing-service-account-keys
GoogleTranslatorSettingsPanel.instructionsTextArea.text=<div style\\="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: <a style="color: #1E2A60;" href="https://cloud.google.com/iam/docs/creating-managing-service-account-keys">https://cloud.google.com/iam/docs/creating-managing-service-account-keys</a>.</div>
BingTranslatorSettingsPanel.instructionsTextArea.text_1=<div style\\="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">You will need to provide a Microsoft Translator authentication key for your Microsoft Translator account. Instructions on how to get one are available here: <a style="color: \\#1E2A60;" href="https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup">https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup</a>.</div>

View File

@ -26,5 +26,5 @@ GoogleTranslatorSettingsPanel.untranslatedLabel.text=Untranslated:
GoogleTranslatorSettingsPanel.resultLabel.text=Result:
GoogleTranslatorSettingsPanel.testResultValueLabel.text=
BingTranslatorSettingsPanel.authenticationKeyLabel.text=Authentication Key:
BingTranslatorSettingsPanel.instructionsTextArea.text=You will need to provide a Microsoft Translator authentication key for your Microsoft Translator account. Instructions on how to get one are available here: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup
GoogleTranslatorSettingsPanel.instructionsTextArea.text=You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: https://cloud.google.com/iam/docs/creating-managing-service-account-keys
GoogleTranslatorSettingsPanel.instructionsTextArea.text=<div style\\="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: <a style="color: #1E2A60;" href="https://cloud.google.com/iam/docs/creating-managing-service-account-keys">https://cloud.google.com/iam/docs/creating-managing-service-account-keys</a>.</div>
BingTranslatorSettingsPanel.instructionsTextArea.text_1=<div style\\="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">You will need to provide a Microsoft Translator authentication key for your Microsoft Translator account. Instructions on how to get one are available here: <a style="color: \\#1E2A60;" href="https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup">https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup</a>.</div>

View File

@ -26,5 +26,5 @@ GoogleTranslatorSettingsPanel.untranslatedLabel.text=\u672a\u7ffb\u8a33:
GoogleTranslatorSettingsPanel.resultLabel.text=\u7d50\u679c:
GoogleTranslatorSettingsPanel.testResultValueLabel.text=
BingTranslatorSettingsPanel.authenticationKeyLabel.text=\u8a8d\u8a3c\u30ad\u30fc:
BingTranslatorSettingsPanel.instructionsTextArea.text=\u304a\u4f7f\u3044\u306eMicrosoft Translator\u30a2\u30ab\u30a6\u30f3\u30c8\u306bMicrosoft Translator\u8a8d\u8a3c\u30ad\u30fc\u3092\u63d0\u4f9b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30ad\u30fc\u306e\u53d6\u5f97\u65b9\u6cd5\u306b\u95a2\u3059\u308b\u624b\u9806\u306f\u3053\u3061\u3089\u306b\u3042\u308a\u307e\u3059: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup
GoogleTranslatorSettingsPanel.instructionsTextArea.text=\u304a\u4f7f\u3044\u306eGoogle\u7ffb\u8a33\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30b5\u30fc\u30d3\u30b9\u30a2\u30ab\u30a6\u30f3\u30c8\u30ad\u30fc\u306b\u542b\u307e\u308c\u308bJSON\u8cc7\u683c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u304c\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002\u30b5\u30fc\u30d3\u30b9\u30a2\u30ab\u30a6\u30f3\u30c8\u30ad\u30fc\u306e\u4f5c\u6210\u65b9\u6cd5\u306b\u95a2\u3059\u308b\u60c5\u5831\u306f\u3053\u3061\u3089\u306b\u3042\u308a\u3042\u307e\u3059: https://cloud.google.com/iam/docs/creating-managing-service-account-keys
BingTranslatorSettingsPanel.instructionsTextArea.text=\u304a\u4f7f\u3044\u306eMicrosoft Translator\u30a2\u30ab\u30a6\u30f3\u30c8\u306bMicrosoft Translator\u8a8d\u8a3c\u30ad\u30fc\u3092\u63d0\u4f9b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30ad\u30fc\u306e\u53d6\u5f97\u65b9\u6cd5\u306b\u95a2\u3059\u308b\u624b\u9806\u306f\u3053\u3061\u3089\u306b\u3042\u308a\u307e\u3059: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup

View File

@ -212,20 +212,16 @@
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Component class="javax.swing.JTextArea" name="instructionsTextArea">
<Component class="javax.swing.JTextPane" name="instructionsTextArea">
<Properties>
<Property name="editable" type="boolean" value="false"/>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="f0" green="f0" red="f0" type="rgb"/>
</Property>
<Property name="columns" type="int" value="20"/>
<Property name="lineWrap" type="boolean" value="true"/>
<Property name="rows" type="int" value="4"/>
<Property name="contentType" type="java.lang.String" value="text/html" noResource="true"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties" key="GoogleTranslatorSettingsPanel.instructionsTextArea.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="wrapStyleWord" type="boolean" value="true"/>
<Property name="caretPosition" type="int" value="0"/>
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[1000, 200]"/>
</Property>

View File

@ -24,17 +24,21 @@ import com.google.cloud.translate.Language;
import com.google.cloud.translate.Translate;
import com.google.cloud.translate.TranslateOptions;
import com.google.cloud.translate.Translation;
import java.awt.Desktop;
import java.awt.event.ItemListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.JFileChooser;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.apache.commons.lang3.StringUtils;
import org.openide.util.NbBundle.Messages;
@ -59,6 +63,23 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel {
targetLanguageCode = languageCode;
credentialsPathField.setText(credentialsPath);
populateTargetLanguageComboBox();
instructionsTextArea.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
// Try to display the URL in the user's browswer.
if(Desktop.isDesktopSupported()) {
try {
Desktop.getDesktop().browse(e.getURL().toURI());
} catch (IOException | URISyntaxException ex) {
logger.log(Level.WARNING, "Failed to display URL in external viewer", ex);
}
}
}
}
});
}
/**
@ -198,7 +219,7 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel {
testUntranslatedTextField = new javax.swing.JTextField();
testButton = new javax.swing.JButton();
instructionsScrollPane = new javax.swing.JScrollPane();
instructionsTextArea = new javax.swing.JTextArea();
instructionsTextArea = new javax.swing.JTextPane();
javax.swing.Box.Filler filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0));
setLayout(new java.awt.GridBagLayout());
@ -335,12 +356,8 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel {
instructionsTextArea.setEditable(false);
instructionsTextArea.setBackground(new java.awt.Color(240, 240, 240));
instructionsTextArea.setColumns(20);
instructionsTextArea.setLineWrap(true);
instructionsTextArea.setRows(4);
instructionsTextArea.setContentType("text/html"); // NOI18N
instructionsTextArea.setText(org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.instructionsTextArea.text")); // NOI18N
instructionsTextArea.setWrapStyleWord(true);
instructionsTextArea.setCaretPosition(0);
instructionsTextArea.setMaximumSize(new java.awt.Dimension(1000, 200));
instructionsTextArea.setPreferredSize(new java.awt.Dimension(164, 78));
instructionsScrollPane.setViewportView(instructionsTextArea);
@ -405,7 +422,7 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel {
private javax.swing.JButton browseButton;
private javax.swing.JTextField credentialsPathField;
private javax.swing.JScrollPane instructionsScrollPane;
private javax.swing.JTextArea instructionsTextArea;
private javax.swing.JTextPane instructionsTextArea;
private javax.swing.JLabel resultLabel;
private javax.swing.JComboBox<org.sleuthkit.autopsy.texttranslation.translators.LanguageWrapper> targetLanguageComboBox;
private javax.swing.JButton testButton;

View File

@ -94,6 +94,10 @@ public enum FileTypeUtils {
ImageIO.scanForPlugins();
//add all extension ImageIO claims to support
imageExtensions.addAll(Stream.of(ImageIO.getReaderFileSuffixes())
// remove any empty extension types provided by ImageIO.getReaderFileSuffixes()
// This prevents extensions added by SPI implementations from causing errors
// (i.e. 'jai-imageio' utilized with IcePDF)
.filter((extension) -> StringUtils.isNotBlank(extension))
.map(String::toLowerCase)
.collect(Collectors.toList()));
//add list of known image extensions
@ -144,8 +148,12 @@ public enum FileTypeUtils {
* are not images) to show up in Image Gallery.
* supportedMimeTypes.addAll(Arrays.asList("application/x-emf"));
*/
//add list of mimetypes ImageIO claims to support
//add list of mimetypes ImageIO claims to support
supportedMimeTypes.addAll(Stream.of(ImageIO.getReaderMIMETypes())
// remove any empty mime types provided by ImageIO.getReaderMIMETypes()
// This prevents mime types added by SPI implementations from causing errors
// (i.e. 'jai-imageio' utilized with IcePDF)
.filter((mimeType) -> StringUtils.isNotBlank(mimeType))
.map(String::toLowerCase)
.collect(Collectors.toList()));

View File

@ -190,7 +190,7 @@ public final class DrawableTagsManager {
returnTagName = autopsyTagsManager.getDisplayNamesToTagNamesMap().get(displayName);
if (returnTagName != null) {
return returnTagName;
}
}
throw new TskCoreException("Tag name exists but an error occured in retrieving it", ex);
}
}

View File

@ -42,11 +42,12 @@ The following need to be done at least once. They do not need to be repeated for
Autopsy depends on a specific version of The Sleuth Kit. You need the Java libraries of The Sleuth Kit installed, which is not part of all packages.
- Linux: Install the sleuthkit-java.deb file that you can download from github.com/sleuthkit/sleuthkit/releases. This will install libewf, etc.
-- % sudo apt install ./sleuthkit-java_4.7.0-1_amd64.deb
- Linux: Install the sleuthkit-java.deb file that you can download from github.com/sleuthkit/sleuthkit/releases. This will install libewf, etc. For example:
-- % sudo apt install ./sleuthkit-java_4.8.0-1_amd64.deb
- OS X: Install The Sleuth Kit from brew.
-- % brew install sleuthkit
- OS X: Build The Sleuth Kit from source.
See https://slo-sleuth.github.io/tools/InstallingAutopsyOnMacOS.html for a comprehensive write-up
on building The Sleuth Kit and getting Autopsy to run on Mac OS.
* Install Autopsy *

View File

@ -13,6 +13,8 @@ Currently, the Drone Analyzer module works on images obtained from the internal
- Mavic Pro
- Mavic Air
The module will find DAT files and process them using DatCon (https://datfile.net/DatCon/intro.html).
\section drone_config Running the Module
To enable the Drone Analyzer ingest module select the checkbox in the \ref ingest_configure "Ingest Modules configuration screen".
@ -27,4 +29,4 @@ GPS results can also be seen in the \ref geolocation_page window and the KML Rep
\image html geolocation_drone_path.png
*/
*/

View File

@ -4,7 +4,11 @@ You can configure a machine translation service to use with Autopsy. If one is c
\section mt_config Configuration
To set up a machine translation service, go to Options->Tools and then select the Machine Translation tab. Select the service you want to use from the drop down menu at the top.
To set up a machine translation service, go to Options->Tools and then select the Machine Translation tab. Select the service you want to use from the drop down menu at the top. You will have to set up an account with either Bing or Google and then enter account information.
<ul>
<li> Bing Translate: <a href="https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup">https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup</a>
<li> Google Translate: <a href="https://cloud.google.com/iam/docs/creating-managing-service-account-keys">https://cloud.google.com/iam/docs/creating-managing-service-account-keys</a>
</ul>
\image html mt_config.png