minor cleanup

- improve comments
- rename DescriptionLOD to DescriptionLoD
- use new isActive proprty
- rename quick hide mask to quick hide filter
- remove un used class FiltersChangedEvent
This commit is contained in:
jmillman
2015-10-01 16:08:44 -04:00
parent 7890461114
commit ddfe4381a3
22 changed files with 222 additions and 219 deletions
@@ -80,7 +80,7 @@ import org.sleuthkit.autopsy.timeline.filters.DescriptionFilter;
import org.sleuthkit.autopsy.timeline.filters.RootFilter;
import org.sleuthkit.autopsy.timeline.filters.TypeFilter;
import org.sleuthkit.autopsy.timeline.utils.IntervalUtils;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel;
import org.sleuthkit.autopsy.timeline.zooming.ZoomParams;
import org.sleuthkit.datamodel.SleuthkitCase;
@@ -138,10 +138,10 @@ public class TimeLineController {
private final Case autoCase;
@ThreadConfined(type = ThreadConfined.ThreadType.JFX)
private final ObservableList<DescriptionFilter> quickHideMasks = FXCollections.observableArrayList();
private final ObservableList<DescriptionFilter> quickHideMaskFilters = FXCollections.observableArrayList();
public ObservableList<DescriptionFilter> getQuickHideMasks() {
return quickHideMasks;
public ObservableList<DescriptionFilter> getQuickHideFilters() {
return quickHideMaskFilters;
}
/**
@@ -264,7 +264,7 @@ public class TimeLineController {
InitialZoomState = new ZoomParams(filteredEvents.getSpanningInterval(),
EventTypeZoomLevel.BASE_TYPE,
filteredEvents.filterProperty().get(),
DescriptionLOD.SHORT);
DescriptionLoD.SHORT);
historyManager.advance(InitialZoomState);
}
@@ -564,12 +564,12 @@ public class TimeLineController {
@NbBundle.Messages({"# {0} - the number of events",
"Timeline.pushDescrLOD.confdlg.msg=You are about to show details for {0} events."
+ " This might be very slow or even crash Autopsy.\n\nDo you want to continue?"})
synchronized public boolean pushDescrLOD(DescriptionLOD newLOD) {
synchronized public boolean pushDescrLOD(DescriptionLoD newLOD) {
Map<EventType, Long> eventCounts = filteredEvents.getEventCounts(filteredEvents.zoomParametersProperty().get().getTimeRange());
final Long count = eventCounts.values().stream().reduce(0l, Long::sum);
boolean shouldContinue = true;
if (newLOD == DescriptionLOD.FULL && count > 10_000) {
if (newLOD == DescriptionLoD.FULL && count > 10_000) {
String format = NumberFormat.getInstance().format(count);
int showConfirmDialog = JOptionPane.showConfirmDialog(mainFrame,
@@ -22,7 +22,7 @@ import com.google.common.collect.Range;
import java.util.Optional;
import java.util.Set;
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
/**
*
@@ -31,7 +31,7 @@ public interface EventBundle {
String getDescription();
DescriptionLOD getDescriptionLoD();
DescriptionLoD getDescriptionLoD();
Set<Long> getEventIDs();
@@ -28,7 +28,7 @@ import javax.annotation.concurrent.Immutable;
import org.joda.time.Interval;
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
import org.sleuthkit.autopsy.timeline.utils.IntervalUtils;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
/**
* Represents a set of other (TimeLineEvent) events clustered together. All the
@@ -39,13 +39,13 @@ import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
public class EventCluster implements EventBundle {
/**
* merge two aggregate events into one new aggregate event.
* merge two event clusters into one new event cluster.
*
* @param cluster1
* @param cluster2
*
* @return a new aggregate event that is the result of merging the given
* events
* @return a new event cluster that is the result of merging the given
* events clusters
*/
public static EventCluster merge(EventCluster cluster1, EventCluster cluster2) {
if (cluster1.getEventType() != cluster2.getEventType()) {
@@ -82,7 +82,7 @@ public class EventCluster implements EventBundle {
/**
* the description level of detail that the events were clustered at.
*/
private final DescriptionLOD lod;
private final DescriptionLoD lod;
/**
* the set of ids of the clustered events
@@ -101,7 +101,7 @@ public class EventCluster implements EventBundle {
*/
private final Set<Long> hashHits;
private EventCluster(Interval spanningInterval, EventType type, Set<Long> eventIDs, Set<Long> hashHits, Set<Long> tagged, String description, DescriptionLOD lod, EventBundle parent) {
private EventCluster(Interval spanningInterval, EventType type, Set<Long> eventIDs, Set<Long> hashHits, Set<Long> tagged, String description, DescriptionLoD lod, EventBundle parent) {
this.span = spanningInterval;
this.type = type;
@@ -113,7 +113,7 @@ public class EventCluster implements EventBundle {
this.parent = parent;
}
public EventCluster(Interval spanningInterval, EventType type, Set<Long> eventIDs, Set<Long> hashHits, Set<Long> tagged, String description, DescriptionLOD lod) {
public EventCluster(Interval spanningInterval, EventType type, Set<Long> eventIDs, Set<Long> hashHits, Set<Long> tagged, String description, DescriptionLoD lod) {
this(spanningInterval, type, eventIDs, hashHits, tagged, description, lod, null);
}
@@ -162,7 +162,7 @@ public class EventCluster implements EventBundle {
}
@Override
public DescriptionLOD getDescriptionLoD() {
public DescriptionLoD getDescriptionLoD() {
return lod;
}
@@ -195,5 +195,4 @@ public class EventCluster implements EventBundle {
return new EventCluster(span, type, eventIDs, hashHits, tagged, description, lod, parent);
}
}
@@ -18,7 +18,7 @@ import java.util.Set;
import javax.annotation.concurrent.Immutable;
import org.python.google.common.base.Objects;
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
/**
* A 'collection' of {@link EventCluster}s, all having the same type,
@@ -55,7 +55,7 @@ public final class EventStripe implements EventBundle {
/**
* the description level of detail that the events were clustered at.
*/
private final DescriptionLOD lod;
private final DescriptionLoD lod;
/**
* the set of ids of the events
@@ -118,7 +118,7 @@ public final class EventStripe implements EventBundle {
}
@Override
public DescriptionLOD getDescriptionLoD() {
public DescriptionLoD getDescriptionLoD() {
return lod;
}
@@ -56,7 +56,7 @@ import org.sleuthkit.autopsy.timeline.filters.TagNameFilter;
import org.sleuthkit.autopsy.timeline.filters.TagsFilter;
import org.sleuthkit.autopsy.timeline.filters.TextFilter;
import org.sleuthkit.autopsy.timeline.filters.TypeFilter;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel;
import org.sleuthkit.autopsy.timeline.zooming.ZoomParams;
import org.sleuthkit.datamodel.BlackboardArtifact;
@@ -105,7 +105,7 @@ public final class FilteredEventsModel {
private final ReadOnlyObjectWrapper< EventTypeZoomLevel> requestedTypeZoom = new ReadOnlyObjectWrapper<>(EventTypeZoomLevel.BASE_TYPE);
@GuardedBy("this")
private final ReadOnlyObjectWrapper< DescriptionLOD> requestedLOD = new ReadOnlyObjectWrapper<>(DescriptionLOD.SHORT);
private final ReadOnlyObjectWrapper< DescriptionLoD> requestedLOD = new ReadOnlyObjectWrapper<>(DescriptionLoD.SHORT);
@GuardedBy("this")
private final ReadOnlyObjectWrapper<ZoomParams> requestedZoomParamters = new ReadOnlyObjectWrapper<>();
@@ -180,7 +180,7 @@ public final class FilteredEventsModel {
return requestedTimeRange.getReadOnlyProperty();
}
synchronized public ReadOnlyObjectProperty<DescriptionLOD> descriptionLODProperty() {
synchronized public ReadOnlyObjectProperty<DescriptionLoD> descriptionLODProperty() {
return requestedLOD.getReadOnlyProperty();
}
@@ -192,7 +192,7 @@ public final class FilteredEventsModel {
return requestedTypeZoom.getReadOnlyProperty();
}
synchronized public DescriptionLOD getDescriptionLOD() {
synchronized public DescriptionLoD getDescriptionLOD() {
return requestedLOD.get();
}
@@ -322,17 +322,15 @@ public final class FilteredEventsModel {
}
/**
* @param aggregation
*
* @return a list of aggregated events that are within the requested time
* range and pass the requested filter, using the given aggregation
* to control the grouping of events
* @return a list of event clusters at the requested zoom levels that are
* within the requested time range and pass the requested filter
*/
public List<EventCluster> getEventClusters() {
final Interval range;
final RootFilter filter;
final EventTypeZoomLevel zoom;
final DescriptionLOD lod;
final DescriptionLoD lod;
synchronized (this) {
range = requestedTimeRange.get();
filter = requestedFilter.get();
@@ -22,7 +22,7 @@ import com.google.common.collect.ImmutableMap;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
import org.sleuthkit.datamodel.TskData;
/**
@@ -38,7 +38,7 @@ public class TimeLineEvent {
private final long time;
private final EventType subType;
private final ImmutableMap<DescriptionLOD, String> descriptions;
private final ImmutableMap<DescriptionLoD, String> descriptions;
private final TskData.FileKnown known;
private final boolean hashHit;
@@ -50,10 +50,9 @@ public class TimeLineEvent {
this.artifactID = artifactID == 0 ? null : artifactID;
this.time = time;
this.subType = type;
descriptions = ImmutableMap.<DescriptionLOD, String>of(
DescriptionLOD.FULL, fullDescription,
DescriptionLOD.MEDIUM, medDescription,
DescriptionLOD.SHORT, shortDescription);
descriptions = ImmutableMap.<DescriptionLoD, String>of(DescriptionLoD.FULL, fullDescription,
DescriptionLoD.MEDIUM, medDescription,
DescriptionLoD.SHORT, shortDescription);
this.known = known;
this.hashHit = hashHit;
@@ -94,22 +93,22 @@ public class TimeLineEvent {
}
public String getFullDescription() {
return getDescription(DescriptionLOD.FULL);
return getDescription(DescriptionLoD.FULL);
}
public String getMedDescription() {
return getDescription(DescriptionLOD.MEDIUM);
return getDescription(DescriptionLoD.MEDIUM);
}
public String getShortDescription() {
return getDescription(DescriptionLOD.SHORT);
return getDescription(DescriptionLoD.SHORT);
}
public TskData.FileKnown getKnown() {
return known;
}
public String getDescription(DescriptionLOD lod) {
public String getDescription(DescriptionLoD lod) {
return descriptions.get(lod);
}
@@ -64,7 +64,7 @@ import static org.sleuthkit.autopsy.timeline.db.SQLHelper.useTagTablesHelper;
import org.sleuthkit.autopsy.timeline.filters.RootFilter;
import org.sleuthkit.autopsy.timeline.filters.TagsFilter;
import org.sleuthkit.autopsy.timeline.utils.RangeDivisionInfo;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel;
import org.sleuthkit.autopsy.timeline.zooming.ZoomParams;
import org.sleuthkit.datamodel.SleuthkitCase;
@@ -1046,7 +1046,7 @@ public class EventDB {
//unpack params
Interval timeRange = params.getTimeRange();
RootFilter filter = params.getFilter();
DescriptionLOD descriptionLOD = params.getDescriptionLOD();
DescriptionLoD descriptionLOD = params.getDescriptionLOD();
EventTypeZoomLevel typeZoomLevel = params.getTypeZoomLevel();
//ensure length of querried interval is not 0
@@ -1109,7 +1109,7 @@ public class EventDB {
*
* @throws SQLException
*/
private EventCluster eventClusterHelper(ResultSet rs, boolean useSubTypes, DescriptionLOD descriptionLOD, TagsFilter filter) throws SQLException {
private EventCluster eventClusterHelper(ResultSet rs, boolean useSubTypes, DescriptionLoD descriptionLOD, TagsFilter filter) throws SQLException {
Interval interval = new Interval(rs.getLong("min(time)") * 1000, rs.getLong("max(time)") * 1000, TimeLineController.getJodaTimeZone());// NON-NLS
String eventIDsString = rs.getString("event_ids");// NON-NLS
Set<Long> eventIDs = SQLHelper.unGroupConcat(eventIDsString, Long::valueOf);
@@ -43,9 +43,9 @@ import org.sleuthkit.autopsy.timeline.filters.TextFilter;
import org.sleuthkit.autopsy.timeline.filters.TypeFilter;
import org.sleuthkit.autopsy.timeline.filters.UnionFilter;
import org.sleuthkit.autopsy.timeline.utils.RangeDivisionInfo;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
import static org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD.FULL;
import static org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD.MEDIUM;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
import static org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD.FULL;
import static org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD.MEDIUM;
import static org.sleuthkit.autopsy.timeline.zooming.TimeUnits.DAYS;
import static org.sleuthkit.autopsy.timeline.zooming.TimeUnits.HOURS;
import static org.sleuthkit.autopsy.timeline.zooming.TimeUnits.MINUTES;
@@ -62,12 +62,12 @@ class SQLHelper {
static String useHashHitTablesHelper(RootFilter filter) {
HashHitsFilter hashHitFilter = filter.getHashHitsFilter();
return hashHitFilter.isSelected() && false == hashHitFilter.isDisabled() ? " LEFT JOIN hash_set_hits " : " ";
return hashHitFilter.isActive() ? " LEFT JOIN hash_set_hits " : " ";
}
static String useTagTablesHelper(RootFilter filter) {
TagsFilter tagsFilter = filter.getTagsFilter();
return tagsFilter.isSelected() && false == tagsFilter.isDisabled() ? " LEFT JOIN tags " : " ";
return tagsFilter.isActive() ? " LEFT JOIN tags " : " ";
}
/**
@@ -149,7 +149,7 @@ class SQLHelper {
}
private static String getSQLWhere(HideKnownFilter filter) {
if (filter.isSelected()) {
if (filter.isActive()) {
return "(known_state IS NOT '" + TskData.FileKnown.KNOWN.getFileKnownValue() + "')"; // NON-NLS
} else {
return "1";
@@ -157,16 +157,16 @@ class SQLHelper {
}
private static String getSQLWhere(DescriptionFilter filter) {
if (filter.isSelected() && (false == filter.isDisabled())) {
return "(" + getDescriptionColumn(filter.getDescriptionLoD()) + (filter.getFilterMode() == DescriptionFilter.FilterMode.INCLUDE ? "" : " NOT") + " LIKE '" + filter.getDescription() + "' )"; // NON-NLS
if (filter.isActive()) {
String likeOrNotLike = (filter.getFilterMode() == DescriptionFilter.FilterMode.INCLUDE ? "" : " NOT") + " LIKE '";
return "(" + getDescriptionColumn(filter.getDescriptionLoD()) + likeOrNotLike + filter.getDescription() + "' )"; // NON-NLS
} else {
return "1";
}
}
private static String getSQLWhere(TagsFilter filter) {
if (filter.isSelected()
&& (false == filter.isDisabled())
if (filter.isActive()
&& (filter.getSubFilters().isEmpty() == false)) {
String tagNameIDs = filter.getSubFilters().stream()
.filter((TagNameFilter t) -> t.isSelected() && !t.isDisabled())
@@ -181,8 +181,7 @@ class SQLHelper {
}
private static String getSQLWhere(HashHitsFilter filter) {
if (filter.isSelected()
&& (false == filter.isDisabled())
if (filter.isActive()
&& (filter.getSubFilters().isEmpty() == false)) {
String hashSetIDs = filter.getSubFilters().stream()
.filter((HashSetFilter t) -> t.isSelected() && !t.isDisabled())
@@ -195,7 +194,7 @@ class SQLHelper {
}
private static String getSQLWhere(DataSourceFilter filter) {
if (filter.isSelected()) {
if (filter.isActive()) {
return "(datasource_id = '" + filter.getDataSourceID() + "')";
} else {
return "1";
@@ -203,15 +202,15 @@ class SQLHelper {
}
private static String getSQLWhere(DataSourcesFilter filter) {
return (filter.isSelected()) ? "(datasource_id in ("
return (filter.isActive()) ? "(datasource_id in ("
+ filter.getSubFilters().stream()
.filter(AbstractFilter::isSelected)
.filter(AbstractFilter::isActive)
.map((dataSourceFilter) -> String.valueOf(dataSourceFilter.getDataSourceID()))
.collect(Collectors.joining(", ")) + "))" : "1";
}
private static String getSQLWhere(TextFilter filter) {
if (filter.isSelected()) {
if (filter.isActive()) {
if (StringUtils.isBlank(filter.getText())) {
return "1";
}
@@ -237,7 +236,7 @@ class SQLHelper {
return "0";
} else if (typeFilter.getEventType() instanceof RootEventType) {
if (typeFilter.getSubFilters().stream()
.allMatch(subFilter -> subFilter.isSelected() && subFilter.getSubFilters().stream().allMatch(Filter::isSelected))) {
.allMatch(subFilter -> subFilter.isActive() && subFilter.getSubFilters().stream().allMatch(Filter::isActive))) {
return "1"; //then collapse clause to true
}
}
@@ -245,7 +244,7 @@ class SQLHelper {
}
private static List<Integer> getActiveSubTypes(TypeFilter filter) {
if (filter.isSelected()) {
if (filter.isActive()) {
if (filter.getSubFilters().isEmpty()) {
return Collections.singletonList(RootEventType.allTypes.indexOf(filter.getEventType()));
} else {
@@ -285,7 +284,7 @@ class SQLHelper {
}
}
static String getDescriptionColumn(DescriptionLOD lod) {
static String getDescriptionColumn(DescriptionLoD lod) {
switch (lod) {
case FULL:
return "full_description";
@@ -1,14 +0,0 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.sleuthkit.autopsy.timeline.events;
/**
*
*/
public class FiltersChangedEvent {
}
@@ -19,11 +19,11 @@
package org.sleuthkit.autopsy.timeline.filters;
import java.util.Objects;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
public class DescriptionFilter extends AbstractFilter {
private final DescriptionLOD descriptionLoD;
private final DescriptionLoD descriptionLoD;
private final String description;
private final FilterMode filterMode;
@@ -31,7 +31,7 @@ public class DescriptionFilter extends AbstractFilter {
return filterMode;
}
public DescriptionFilter(DescriptionLOD descriptionLoD, String description, FilterMode filterMode) {
public DescriptionFilter(DescriptionLoD descriptionLoD, String description, FilterMode filterMode) {
this.descriptionLoD = descriptionLoD;
this.description = description;
this.filterMode = filterMode;
@@ -58,7 +58,7 @@ public class DescriptionFilter extends AbstractFilter {
/**
* @return the descriptionLoD
*/
public DescriptionLOD getDescriptionLoD() {
public DescriptionLoD getDescriptionLoD() {
return descriptionLoD;
}
@@ -18,6 +18,7 @@
*/
package org.sleuthkit.autopsy.timeline.filters;
import javafx.beans.binding.BooleanBinding;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
@@ -79,4 +80,8 @@ public interface Filter {
SimpleBooleanProperty getDisabledProperty();
boolean isDisabled();
boolean isActive();
BooleanBinding activeProperty();
}
@@ -1,14 +1,20 @@
/**
* *************************************************************************
** This data and information is proprietary to, and a valuable trade secret *
* of, Basis Technology Corp. It is given in confidence by Basis Technology *
* and may only be used as permitted under the license agreement under which *
* it has been distributed, and in no other way. * * Copyright (c) 2014 Basis
* Technology Corp. All rights reserved. * * The technical data and information
* provided herein are provided with * `limited rights', and the computer
* software provided herein is provided * with `restricted rights' as those
* terms are defined in DAR and ASPR * 7-104.9(a).
* *************************************************************************
/*
* Autopsy Forensic Browser
*
* Copyright 2015 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* 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.
*/
package org.sleuthkit.autopsy.timeline.ui;
@@ -75,7 +75,7 @@ import org.sleuthkit.autopsy.timeline.datamodel.FilteredEventsModel;
import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
import org.sleuthkit.autopsy.timeline.ui.AbstractVisualization;
import org.sleuthkit.autopsy.timeline.utils.RangeDivisionInfo;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
/**
* Controller class for a {@link EventDetailChart} based implementation of a
@@ -468,11 +468,11 @@ public class DetailViewPane extends AbstractVisualization<DateTime, EventCluster
}
}
public Action newUnhideDescriptionAction(String description, DescriptionLOD descriptionLoD) {
public Action newUnhideDescriptionAction(String description, DescriptionLoD descriptionLoD) {
return chart.new UnhideDescriptionAction(description, descriptionLoD);
}
public Action newHideDescriptionAction(String description, DescriptionLOD descriptionLoD) {
public Action newHideDescriptionAction(String description, DescriptionLoD descriptionLoD) {
return chart.new HideDescriptionAction(description, descriptionLoD);
}
}
@@ -6,77 +6,81 @@
<?import javafx.scene.layout.*?>
<fx:root alignment="CENTER_LEFT" spacing="5.0" type="javafx.scene.layout.HBox" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<children>
<MenuButton fx:id="advancedLayoutOptionsButtonLabel" mnemonicParsing="false">
<items>
<CustomMenuItem fx:id="bandByTypeBoxMenuItem" hideOnClick="false" mnemonicParsing="false">
<content>
<CheckBox fx:id="bandByTypeBox" mnemonicParsing="false">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding></CheckBox>
</content>
</CustomMenuItem>
<CustomMenuItem fx:id="oneEventPerRowBoxMenuItem" hideOnClick="false" mnemonicParsing="false">
<content>
<CheckBox fx:id="oneEventPerRowBox" mnemonicParsing="false">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding></CheckBox>
</content>
</CustomMenuItem>
<SeparatorMenuItem mnemonicParsing="false" />
<CustomMenuItem fx:id="truncateAllBoxMenuItem" hideOnClick="false" mnemonicParsing="false">
<content>
<CheckBox fx:id="truncateAllBox" mnemonicParsing="false">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding></CheckBox>
</content>
</CustomMenuItem>
<CustomMenuItem fx:id="truncateSliderLabelMenuItem" hideOnClick="false" mnemonicParsing="false">
<content>
<Label fx:id="truncateSliderLabel" contentDisplay="BOTTOM">
<graphic>
<Slider id="truncateAllSlider" fx:id="truncateWidthSlider" blockIncrement="50.0" disable="false" majorTickUnit="150.0" max="500.0" min="50.0" minorTickCount="0" prefHeight="33.0" prefWidth="150.0" showTickLabels="true" showTickMarks="false" value="200.0" />
</graphic>
</Label>
</content>
</CustomMenuItem>
<SeparatorMenuItem fx:id="descVisibilitySeparatorMenuItem" mnemonicParsing="false" />
<CustomMenuItem fx:id="showRadioMenuItem" hideOnClick="false" mnemonicParsing="false">
<content>
<RadioButton fx:id="showRadio" mnemonicParsing="false" selected="true">
<toggleGroup>
<ToggleGroup fx:id="descrVisibility" />
</toggleGroup>
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</RadioButton>
</content>
</CustomMenuItem>
<CustomMenuItem fx:id="countsRadioMenuItem" hideOnClick="false" mnemonicParsing="false">
<content>
<RadioButton fx:id="countsRadio" mnemonicParsing="false" toggleGroup="$descrVisibility">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding></RadioButton>
</content>
</CustomMenuItem>
<CustomMenuItem fx:id="hiddenRadioMenuItem" hideOnClick="false" mnemonicParsing="false">
<content>
<RadioButton fx:id="hiddenRadio" mnemonicParsing="false" toggleGroup="$descrVisibility">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding></RadioButton>
</content>
</CustomMenuItem>
</items>
</MenuButton>
<ToggleButton fx:id="testToggle" mnemonicParsing="false" selected="true" text="Test" />
</children>
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
<children>
<MenuButton fx:id="advancedLayoutOptionsButtonLabel" mnemonicParsing="false">
<items>
<CustomMenuItem fx:id="bandByTypeBoxMenuItem" hideOnClick="false" mnemonicParsing="false">
<content>
<CheckBox fx:id="bandByTypeBox" mnemonicParsing="false">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</CheckBox>
</content>
</CustomMenuItem>
<CustomMenuItem fx:id="oneEventPerRowBoxMenuItem" hideOnClick="false" mnemonicParsing="false">
<content>
<CheckBox fx:id="oneEventPerRowBox" mnemonicParsing="false">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</CheckBox>
</content>
</CustomMenuItem>
<SeparatorMenuItem mnemonicParsing="false" />
<CustomMenuItem fx:id="truncateAllBoxMenuItem" hideOnClick="false" mnemonicParsing="false">
<content>
<CheckBox fx:id="truncateAllBox" mnemonicParsing="false">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</CheckBox>
</content>
</CustomMenuItem>
<CustomMenuItem fx:id="truncateSliderLabelMenuItem" hideOnClick="false" mnemonicParsing="false">
<content>
<Label fx:id="truncateSliderLabel" contentDisplay="BOTTOM">
<graphic>
<Slider id="truncateAllSlider" fx:id="truncateWidthSlider" blockIncrement="50.0" disable="false" majorTickUnit="150.0" max="500.0" min="50.0" minorTickCount="0" prefHeight="33.0" prefWidth="150.0" showTickLabels="true" showTickMarks="false" value="200.0" />
</graphic>
</Label>
</content>
</CustomMenuItem>
<SeparatorMenuItem fx:id="descVisibilitySeparatorMenuItem" mnemonicParsing="false" />
<CustomMenuItem fx:id="showRadioMenuItem" hideOnClick="false" mnemonicParsing="false">
<content>
<RadioButton fx:id="showRadio" mnemonicParsing="false" selected="true">
<toggleGroup>
<ToggleGroup fx:id="descrVisibility" />
</toggleGroup>
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</RadioButton>
</content>
</CustomMenuItem>
<CustomMenuItem fx:id="countsRadioMenuItem" hideOnClick="false" mnemonicParsing="false">
<content>
<RadioButton fx:id="countsRadio" mnemonicParsing="false" toggleGroup="$descrVisibility">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</RadioButton>
</content>
</CustomMenuItem>
<CustomMenuItem fx:id="hiddenRadioMenuItem" hideOnClick="false" mnemonicParsing="false">
<content>
<RadioButton fx:id="hiddenRadio" mnemonicParsing="false" toggleGroup="$descrVisibility">
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</RadioButton>
</content>
</CustomMenuItem>
</items>
</MenuButton>
</children>
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</fx:root>
@@ -82,7 +82,7 @@ import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
import org.sleuthkit.autopsy.timeline.filters.AbstractFilter;
import org.sleuthkit.autopsy.timeline.filters.DescriptionFilter;
import org.sleuthkit.autopsy.timeline.ui.TimeLineChart;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
/**
* Custom implementation of {@link XYChart} to graph events on a horizontal
@@ -326,7 +326,7 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
public synchronized void setController(TimeLineController controller) {
this.controller = controller;
setModel(this.controller.getEventsModel());
getController().getQuickHideMasks().addListener(layoutInvalidationListener);
getController().getQuickHideFilters().addListener(layoutInvalidationListener);
}
@Override
@@ -478,18 +478,18 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
double minY = 0;
for (Series<DateTime, EventCluster> series : sortedSeriesList) {
hiddenPartition = series.getData().stream().map(Data::getNode).map(EventStripeNode.class::cast)
.collect(Collectors.partitioningBy(node -> getController().getQuickHideMasks().stream()
.collect(Collectors.partitioningBy(node -> getController().getQuickHideFilters().stream()
.filter(AbstractFilter::isActive)
.anyMatch(mask -> mask.getDescription().equals(node.getDescription()))));
.anyMatch(filter -> filter.getDescription().equals(node.getDescription()))));
layoutNodesHelper(hiddenPartition.get(true), hiddenPartition.get(false), minY, 0);
minY = maxY.get();
}
} else {
hiddenPartition = stripeNodeMap.values().stream()
.collect(Collectors.partitioningBy(node -> getController().getQuickHideMasks().stream()
.collect(Collectors.partitioningBy(node -> getController().getQuickHideFilters().stream()
.filter(AbstractFilter::isActive)
.anyMatch(mask -> mask.getDescription().equals(node.getDescription()))));
.anyMatch(filter -> filter.getDescription().equals(node.getDescription()))));
layoutNodesHelper(hiddenPartition.get(true), hiddenPartition.get(false), 0, 0);
}
setCursor(null);
@@ -607,8 +607,9 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
List<EventStripeNode> subNodes = stripeNode.getSubNodes();
if (subNodes.isEmpty() == false) {
Map<Boolean, List<EventStripeNode>> hiddenPartition = subNodes.stream()
.collect(Collectors.partitioningBy(testNode -> getController().getQuickHideMasks().stream()
.anyMatch(mask -> mask.getDescription().equals(testNode.getDescription()))));
.collect(Collectors.partitioningBy(testNode -> getController().getQuickHideFilters().stream()
.filter(AbstractFilter::isActive)
.anyMatch(filter -> filter.getDescription().equals(testNode.getDescription()))));
layoutNodesResultHeight = layoutNodesHelper(hiddenPartition.get(true), hiddenPartition.get(false), minY, rawDisplayPosition);
}
@@ -730,8 +731,6 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
return alternateLayout;
}
static private class DetailIntervalSelector extends IntervalSelector<DateTime> {
DetailIntervalSelector(double x, double height, Axis<DateTime> axis, TimeLineController controller) {
@@ -781,7 +780,7 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
class HideDescriptionAction extends Action {
HideDescriptionAction(String description, DescriptionLOD descriptionLoD) {
HideDescriptionAction(String description, DescriptionLoD descriptionLoD) {
super("Hide");
setGraphic(new ImageView(HIDE));
setEventHandler((ActionEvent t) -> {
@@ -790,11 +789,11 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
description,
DescriptionFilter.FilterMode.EXCLUDE);
DescriptionFilter descriptionFilter = getController().getQuickHideMasks().stream()
DescriptionFilter descriptionFilter = getController().getQuickHideFilters().stream()
.filter(testFilter::equals)
.findFirst().orElseGet(() -> {
testFilter.selectedProperty().addListener(layoutInvalidationListener);
getController().getQuickHideMasks().add(testFilter);
getController().getQuickHideFilters().add(testFilter);
return testFilter;
});
descriptionFilter.setSelected(true);
@@ -805,12 +804,12 @@ public final class EventDetailChart extends XYChart<DateTime, EventCluster> impl
class UnhideDescriptionAction extends Action {
UnhideDescriptionAction(String description, DescriptionLOD descriptionLoD) {
UnhideDescriptionAction(String description, DescriptionLoD descriptionLoD) {
super("Unhide");
setGraphic(new ImageView(SHOW));
setEventHandler((ActionEvent t) ->
getController().getQuickHideMasks().stream()
getController().getQuickHideFilters().stream()
.filter(descriptionFilter -> descriptionFilter.getDescriptionLoD().equals(descriptionLoD)
&& descriptionFilter.getDescription().equals(description))
.forEach(descriptionfilter -> descriptionfilter.setSelected(false))
@@ -81,7 +81,7 @@ import org.sleuthkit.autopsy.timeline.datamodel.eventtype.EventType;
import org.sleuthkit.autopsy.timeline.filters.DescriptionFilter;
import org.sleuthkit.autopsy.timeline.filters.RootFilter;
import org.sleuthkit.autopsy.timeline.filters.TypeFilter;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD;
import org.sleuthkit.autopsy.timeline.zooming.DescriptionLoD;
import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel;
import org.sleuthkit.autopsy.timeline.zooming.ZoomParams;
import org.sleuthkit.datamodel.SleuthkitCase;
@@ -116,7 +116,7 @@ final public class EventStripeNode extends StackPane {
b.setManaged(show);
}
private final SimpleObjectProperty<DescriptionLOD> descLOD = new SimpleObjectProperty<>();
private final SimpleObjectProperty<DescriptionLoD> descLOD = new SimpleObjectProperty<>();
private DescriptionVisibility descrVis;
private Tooltip tooltip;
@@ -398,7 +398,7 @@ final public class EventStripeNode extends StackPane {
}
}
private DescriptionLOD getDescriptionLoD() {
private DescriptionLoD getDescriptionLoD() {
return descLOD.get();
}
@@ -409,7 +409,7 @@ final public class EventStripeNode extends StackPane {
* @param expand
*/
@NbBundle.Messages(value = "EventStripeNode.loggedTask.name=Load sub clusters")
private synchronized void loadSubBundles(DescriptionLOD.RelativeDetail relativeDetail) {
private synchronized void loadSubBundles(DescriptionLoD.RelativeDetail relativeDetail) {
chart.getEventBundles().removeIf(bundle ->
getSubNodes().stream().anyMatch(subNode ->
bundle.equals(subNode.getEventStripe()))
@@ -436,7 +436,7 @@ final public class EventStripeNode extends StackPane {
Task<Collection<EventStripe>> loggedTask = new Task<Collection<EventStripe>>() {
private volatile DescriptionLOD loadedDescriptionLoD = getDescriptionLoD().withRelativeDetail(relativeDetail);
private volatile DescriptionLoD loadedDescriptionLoD = getDescriptionLoD().withRelativeDetail(relativeDetail);
{
updateTitle(Bundle.EventStripeNode_loggedTask_name());
@@ -445,7 +445,7 @@ final public class EventStripeNode extends StackPane {
@Override
protected Collection<EventStripe> call() throws Exception {
Collection<EventStripe> bundles;
DescriptionLOD next = loadedDescriptionLoD;
DescriptionLoD next = loadedDescriptionLoD;
do {
loadedDescriptionLoD = next;
if (loadedDescriptionLoD == eventStripe.getDescriptionLoD()) {
@@ -551,9 +551,9 @@ final public class EventStripeNode extends StackPane {
} else if (t.isShortcutDown()) {
chart.selectedNodes.removeAll(EventStripeNode.this);
} else if (t.getClickCount() > 1) {
final DescriptionLOD next = descLOD.get().moreDetailed();
final DescriptionLoD next = descLOD.get().moreDetailed();
if (next != null) {
loadSubBundles(DescriptionLOD.RelativeDetail.MORE);
loadSubBundles(DescriptionLoD.RelativeDetail.MORE);
}
} else {
@@ -586,13 +586,13 @@ final public class EventStripeNode extends StackPane {
setGraphic(new ImageView(PLUS));
setEventHandler((ActionEvent t) -> {
final DescriptionLOD next = descLOD.get().moreDetailed();
final DescriptionLoD next = descLOD.get().moreDetailed();
if (next != null) {
loadSubBundles(DescriptionLOD.RelativeDetail.MORE);
loadSubBundles(DescriptionLoD.RelativeDetail.MORE);
}
});
disabledProperty().bind(descLOD.isEqualTo(DescriptionLOD.FULL));
disabledProperty().bind(descLOD.isEqualTo(DescriptionLoD.FULL));
}
}
@@ -604,9 +604,9 @@ final public class EventStripeNode extends StackPane {
setGraphic(new ImageView(MINUS));
setEventHandler((ActionEvent t) -> {
final DescriptionLOD previous = descLOD.get().lessDetailed();
final DescriptionLoD previous = descLOD.get().lessDetailed();
if (previous != null) {
loadSubBundles(DescriptionLOD.RelativeDetail.LESS);
loadSubBundles(DescriptionLoD.RelativeDetail.LESS);
}
});
disabledProperty().bind(Bindings.createBooleanBinding(() -> nonNull(eventStripe) && descLOD.get() == eventStripe.getDescriptionLoD(), descLOD));
@@ -49,6 +49,7 @@ import org.sleuthkit.autopsy.timeline.TimeLineController;
import org.sleuthkit.autopsy.timeline.TimeLineView;
import org.sleuthkit.autopsy.timeline.datamodel.EventBundle;
import org.sleuthkit.autopsy.timeline.datamodel.FilteredEventsModel;
import org.sleuthkit.autopsy.timeline.filters.AbstractFilter;
import org.sleuthkit.autopsy.timeline.filters.DescriptionFilter;
import org.sleuthkit.autopsy.timeline.ui.detailview.DetailViewPane;
@@ -164,17 +165,17 @@ public class NavPanel extends BorderPane implements TimeLineView {
setTooltip(null);
setGraphic(null);
setContextMenu(null);
deRegisterListeners(controller.getQuickHideMasks());
deRegisterListeners(controller.getQuickHideFilters());
} else {
filterStateChangeListener = (filterState) -> updateHiddenState(item);
controller.getQuickHideMasks().addListener((ListChangeListener.Change<? extends DescriptionFilter> listChange) -> {
controller.getQuickHideFilters().addListener((ListChangeListener.Change<? extends DescriptionFilter> listChange) -> {
while (listChange.next()) {
deRegisterListeners(listChange.getRemoved());
registerListeners(listChange.getAddedSubList(), item);
}
updateHiddenState(item);
});
registerListeners(controller.getQuickHideMasks(), item);
registerListeners(controller.getQuickHideFilters(), item);
String text = item.getDescription() + " (" + item.getCount() + ")"; // NON-NLS
TreeItem<EventBundle> parent = getTreeItem().getParent();
if (parent != null && parent.getValue() != null && (parent instanceof EventDescriptionTreeItem)) {
@@ -207,7 +208,9 @@ public class NavPanel extends BorderPane implements TimeLineView {
private void updateHiddenState(EventBundle item) {
TreeItem<EventBundle> treeItem = getTreeItem();
ContextMenu newMenu;
if (controller.getQuickHideMasks().stream().anyMatch((mask) -> mask.isActive() && mask.getDescription().equals(item.getDescription()))) {
if (controller.getQuickHideFilters().stream().
filter(AbstractFilter::isActive)
.anyMatch(filter -> filter.getDescription().equals(item.getDescription()))) {
if (treeItem != null) {
treeItem.setExpanded(false);
}
@@ -201,7 +201,7 @@ final public class FilterSetPanel extends BorderPane implements TimeLineView {
defaultButton.disableProperty().bind(defaultFiltersAction.disabledProperty());
this.setModel(timeLineController.getEventsModel());
hiddenDescriptionsListView.setItems(controller.getQuickHideMasks());
hiddenDescriptionsListView.setItems(controller.getQuickHideFilters());
hiddenDescriptionsListView.setCellFactory((ListView<DescriptionFilter> param) -> {
final ListCell<DescriptionFilter> forList = new FilterCheckBoxCellFactory<DescriptionFilter>().forList();
@@ -217,7 +217,7 @@ final public class FilterSetPanel extends BorderPane implements TimeLineView {
configureText(forList.getItem().selectedProperty().get());
setOnAction((ActionEvent event) -> {
controller.getQuickHideMasks().remove(forList.getItem());
controller.getQuickHideFilters().remove(forList.getItem());
});
}
@@ -23,11 +23,11 @@ import org.openide.util.NbBundle;
/**
* Enumeration of all description levels of detail.
*/
public enum DescriptionLOD {
public enum DescriptionLoD {
SHORT(NbBundle.getMessage(DescriptionLOD.class, "DescriptionLOD.short")),
MEDIUM(NbBundle.getMessage(DescriptionLOD.class, "DescriptionLOD.medium")),
FULL(NbBundle.getMessage(DescriptionLOD.class, "DescriptionLOD.full"));
SHORT(NbBundle.getMessage(DescriptionLoD.class, "DescriptionLOD.short")),
MEDIUM(NbBundle.getMessage(DescriptionLoD.class, "DescriptionLOD.medium")),
FULL(NbBundle.getMessage(DescriptionLoD.class, "DescriptionLOD.full"));
private final String displayName;
@@ -35,11 +35,11 @@ public enum DescriptionLOD {
return displayName;
}
private DescriptionLOD(String displayName) {
private DescriptionLoD(String displayName) {
this.displayName = displayName;
}
public DescriptionLOD moreDetailed() {
public DescriptionLoD moreDetailed() {
try {
return values()[ordinal() + 1];
} catch (ArrayIndexOutOfBoundsException e) {
@@ -47,7 +47,7 @@ public enum DescriptionLOD {
}
}
public DescriptionLOD lessDetailed() {
public DescriptionLoD lessDetailed() {
try {
return values()[ordinal() - 1];
} catch (ArrayIndexOutOfBoundsException e) {
@@ -55,7 +55,7 @@ public enum DescriptionLOD {
}
}
public DescriptionLOD withRelativeDetail(RelativeDetail relativeDetail) {
public DescriptionLoD withRelativeDetail(RelativeDetail relativeDetail) {
switch (relativeDetail) {
case EQUAL:
return this;
@@ -68,7 +68,7 @@ public enum DescriptionLOD {
}
}
public RelativeDetail getDetailLevelRelativeTo(DescriptionLOD other) {
public RelativeDetail getDetailLevelRelativeTo(DescriptionLoD other) {
int compareTo = this.compareTo(other);
if (compareTo < 0) {
return RelativeDetail.LESS;
@@ -35,7 +35,7 @@ public class ZoomParams {
private final RootFilter filter;
private final DescriptionLOD descrLOD;
private final DescriptionLoD descrLOD;
public Interval getTimeRange() {
return timeRange;
@@ -49,11 +49,11 @@ public class ZoomParams {
return filter;
}
public DescriptionLOD getDescriptionLOD() {
public DescriptionLoD getDescriptionLOD() {
return descrLOD;
}
public ZoomParams(Interval timeRange, EventTypeZoomLevel zoomLevel, RootFilter filter, DescriptionLOD descrLOD) {
public ZoomParams(Interval timeRange, EventTypeZoomLevel zoomLevel, RootFilter filter, DescriptionLoD descrLOD) {
this.timeRange = timeRange;
this.typeZoomLevel = zoomLevel;
this.filter = filter;
@@ -72,7 +72,7 @@ public class ZoomParams {
return new ZoomParams(timeRange, typeZoomLevel, filter, descrLOD);
}
public ZoomParams withDescrLOD(DescriptionLOD descrLOD) {
public ZoomParams withDescrLOD(DescriptionLoD descrLOD) {
return new ZoomParams(timeRange, typeZoomLevel, filter, descrLOD);
}
@@ -92,7 +92,7 @@ public class ZoomParams {
return this.timeRange == null ? false : this.timeRange.equals(timeRange);
}
public boolean hasDescrLOD(DescriptionLOD newLOD) {
public boolean hasDescrLOD(DescriptionLoD newLOD) {
return this.descrLOD.equals(newLOD);
}
@@ -97,7 +97,7 @@ public class ZoomSettingsPane extends TitledPane implements TimeLineView {
typeZoomSlider.setMin(1);
typeZoomSlider.setMax(2);
typeZoomSlider.setLabelFormatter(new TypeZoomConverter());
descrLODSlider.setMax(DescriptionLOD.values().length - 1);
descrLODSlider.setMax(DescriptionLoD.values().length - 1);
descrLODSlider.setLabelFormatter(new DescrLODConverter());
descrLODLabel.setText(
NbBundle.getMessage(this.getClass(), "ZoomSettingsPane.descrLODLabel.text"));
@@ -154,7 +154,7 @@ public class ZoomSettingsPane extends TitledPane implements TimeLineView {
initializeSlider(descrLODSlider,
() -> {
DescriptionLOD newLOD = DescriptionLOD.values()[Math.round(descrLODSlider.valueProperty().floatValue())];
DescriptionLoD newLOD = DescriptionLoD.values()[Math.round(descrLODSlider.valueProperty().floatValue())];
if (controller.pushDescrLOD(newLOD) == false) {
descrLODSlider.setValue(new DescrLODConverter().fromString(filteredEvents.getDescriptionLOD().toString()));
}
@@ -244,12 +244,12 @@ public class ZoomSettingsPane extends TitledPane implements TimeLineView {
@Override
public String toString(Double object) {
return DescriptionLOD.values()[object.intValue()].getDisplayName();
return DescriptionLoD.values()[object.intValue()].getDisplayName();
}
@Override
public Double fromString(String string) {
return new Integer(DescriptionLOD.valueOf(string).ordinal()).doubleValue();
return new Integer(DescriptionLoD.valueOf(string).ordinal()).doubleValue();
}
}
}
+5
View File
@@ -29,13 +29,18 @@
<package>com.apple.eawt</package>
<package>com.apple.eawt.event</package>
<package>com.apple.eio</package>
<package>com.google.common.annotations</package>
<package>com.google.common.base</package>
<package>com.google.common.cache</package>
<package>com.google.common.collect</package>
<package>com.google.common.escape</package>
<package>com.google.common.eventbus</package>
<package>com.google.common.hash</package>
<package>com.google.common.html</package>
<package>com.google.common.io</package>
<package>com.google.common.math</package>
<package>com.google.common.net</package>
<package>com.google.common.primitives</package>
<package>com.google.common.reflect</package>
<package>com.google.common.util.concurrent</package>
<package>com.google.common.xml</package>