From daa5a5c9200708b09983bf3852b94bb8ebab1e27 Mon Sep 17 00:00:00 2001 From: Siva Velusamy Date: Tue, 13 Dec 2011 09:33:51 -0800 Subject: logcat: when copying items, index into filtered list. The previous commit introduced a bug: The SWT table model is a list of logcat messages before any filters are applied. But the user sees the filtered messages. So when user selects items in the table, the selection index will not match the index in the input model. This patch applies all current filters to the input model and then indexes this filtered list to get the same items that the user has selected in the view. Change-Id: If955bd5c22e1c587bcf5fe32092f513d53c0d8ef --- .../com/android/ddmuilib/logcat/LogCatPanel.java | 49 ++++++++++++++++++---- 1 file changed, 42 insertions(+), 7 deletions(-) (limited to 'ddms/libs') diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPanel.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPanel.java index 22052f9..608086d 100644 --- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPanel.java +++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogCatPanel.java @@ -674,12 +674,12 @@ public final class LogCatPanel extends SelectionDependentPanel if (!(input instanceof LogCatMessageList)) { return Collections.emptyList(); } - Object []items = ((LogCatMessageList) input).toArray(); + List filteredItems = applyCurrentFilters((LogCatMessageList) input); List selectedMessages = new ArrayList(indices.length); for (int i : indices) { - if (i < items.length) { - LogCatMessage m = (LogCatMessage) items[i]; + if (i < filteredItems.size()) { + LogCatMessage m = filteredItems.get(i); selectedMessages.add(m); } } @@ -687,6 +687,36 @@ public final class LogCatPanel extends SelectionDependentPanel return selectedMessages; } + private List applyCurrentFilters(LogCatMessageList msgList) { + Object[] items = msgList.toArray(); + List filteredItems = new ArrayList(items.length); + List filters = getFiltersToApply(); + + for (Object item : items) { + if (!(item instanceof LogCatMessage)) { + continue; + } + + LogCatMessage msg = (LogCatMessage) item; + if (!isMessageFiltered(msg, filters)) { + filteredItems.add(msg); + } + } + + return filteredItems; + } + + private boolean isMessageFiltered(LogCatMessage msg, List filters) { + for (LogCatViewerFilter f : filters) { + if (!f.select(null, null, msg)) { + // message does not make it through this filter + return true; + } + } + + return false; + } + private void createLogcatViewTable(Composite parent) { // The SWT.VIRTUAL bit causes the table to be rendered faster. However it makes all rows // to be of the same height, thereby clipping any rows with multiple lines of text. @@ -912,10 +942,7 @@ public final class LogCatPanel extends SelectionDependentPanel } private void updateAppliedFilters() { - /* list of filters to apply = saved filter + live filters */ - List filters = new ArrayList(); - filters.add(getSelectedSavedFilter()); - filters.addAll(getCurrentLiveFilters()); + List filters = getFiltersToApply(); mViewer.setFilters(filters.toArray(new LogCatViewerFilter[filters.size()])); /* whenever filters are changed, the number of displayed logs changes @@ -923,6 +950,14 @@ public final class LogCatPanel extends SelectionDependentPanel scrollToLatestLog(); } + private List getFiltersToApply() { + /* list of filters to apply = saved filter + live filters */ + List filters = new ArrayList(); + filters.add(getSelectedSavedFilter()); + filters.addAll(getCurrentLiveFilters()); + return filters; + } + private List getCurrentLiveFilters() { List liveFilters = new ArrayList(); -- cgit v1.1