### Eclipse Workspace Patch 1.0 #P org.eclipse.ui.views.log Index: src/org/eclipse/ui/internal/views/log/LogSession.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.views.log/src/org/eclipse/ui/internal/views/log/LogSession.java,v retrieving revision 1.2 diff -u -r1.2 LogSession.java --- src/org/eclipse/ui/internal/views/log/LogSession.java 22 Oct 2007 15:18:42 -0000 1.2 +++ src/org/eclipse/ui/internal/views/log/LogSession.java 16 Nov 2007 11:17:14 -0000 @@ -11,22 +11,16 @@ *******************************************************************************/ package org.eclipse.ui.internal.views.log; +import java.io.PrintWriter; import java.text.ParseException; -import java.util.ArrayList; import java.util.Date; -import java.util.List; - -import org.eclipse.core.runtime.PlatformObject; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.ui.model.IWorkbenchAdapter; import com.ibm.icu.text.SimpleDateFormat; -public class LogSession extends PlatformObject implements IWorkbenchAdapter { +public class LogSession extends AbstractEntry { private String sessionData; private Date date; - private List entries = new ArrayList(); - + /** * Constructor for LogSession. */ @@ -63,24 +57,12 @@ String dateBuffer = line.substring(0, delim).trim(); setDate(dateBuffer); } - - public List getEntries() { - return entries; - } - public Object[] getChildren(Object o) { - return getEntries().toArray(new LogEntry[getEntries().size()]); + public void write(PrintWriter writer) { + writer.write(sessionData); } - - public ImageDescriptor getImageDescriptor(Object object) { - return null; - } - - public String getLabel(Object o) { - return null; - } - - public Object getParent(Object o) { - return null; + + public String toString() { + return Messages.LogViewLabelProvider_Session; // TODO maybe toString is not the best place for static... } } Index: src/org/eclipse/ui/internal/views/log/LogViewLabelProvider.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.views.log/src/org/eclipse/ui/internal/views/log/LogViewLabelProvider.java,v retrieving revision 1.4 diff -u -r1.4 LogViewLabelProvider.java --- src/org/eclipse/ui/internal/views/log/LogViewLabelProvider.java 22 Oct 2007 15:18:42 -0000 1.4 +++ src/org/eclipse/ui/internal/views/log/LogViewLabelProvider.java 16 Nov 2007 11:17:16 -0000 @@ -18,9 +18,6 @@ import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.graphics.Image; -import com.ibm.icu.text.DateFormat; -import com.ibm.icu.text.SimpleDateFormat; - public class LogViewLabelProvider extends LabelProvider implements ITableLabelProvider { @@ -49,7 +46,7 @@ } } public Image getColumnImage(Object element, int columnIndex) { - if (element instanceof LogSession) { + if (element instanceof Group) { return (columnIndex == 0) ? hierarchicalImage : null; } @@ -70,38 +67,41 @@ } public String getColumnText(Object element, int columnIndex) { - if (element instanceof LogSession) { - LogSession entry = (LogSession) element; + if (element instanceof Group) { + Group entry = (Group) element; if (columnIndex == 0) { - return Messages.LogViewLabelProvider_Session; + return entry.toString(); } else if (columnIndex == 2) { - if (entry.getDate() != null) { + /*if (entry.getDate() != null) { TODO Get date if Group DateFormat formatter = new SimpleDateFormat(LogEntry.F_DATE_FORMAT); return formatter.format(entry.getDate()); - } + }*/ } return null; } - LogEntry entry = (LogEntry) element; - switch (columnIndex) { - case 0: - if (entry.getMessage() != null) { - String message = entry.getMessage(); - if (message.length() > MAX_LABEL_LENGTH) { - String warning = Messages.LogViewLabelProvider_truncatedMessage; - StringBuffer sb = new StringBuffer(message.substring(0, MAX_LABEL_LENGTH - warning.length())); - sb.append(warning); - return sb.toString(); + if (element instanceof LogEntry) { + LogEntry entry = (LogEntry) element; + switch (columnIndex) { + case 0: + if (entry.getMessage() != null) { + String message = entry.getMessage(); + if (message.length() > MAX_LABEL_LENGTH) { + String warning = Messages.LogViewLabelProvider_truncatedMessage; + StringBuffer sb = new StringBuffer(message.substring(0, MAX_LABEL_LENGTH - warning.length())); + sb.append(warning); + return sb.toString(); + } + return entry.getMessage(); } - return entry.getMessage(); + case 1: + if (entry.getPluginId() != null) + return entry.getPluginId(); + case 2: + return entry.getFormattedDate(); } - case 1: - if (entry.getPluginId() != null) - return entry.getPluginId(); - case 2: - return entry.getFormattedDate(); } + return ""; //$NON-NLS-1$ } Index: src/org/eclipse/ui/internal/views/log/LogView.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.views.log/src/org/eclipse/ui/internal/views/log/LogView.java,v retrieving revision 1.11 diff -u -r1.11 LogView.java --- src/org/eclipse/ui/internal/views/log/LogView.java 8 Nov 2007 01:23:43 -0000 1.11 +++ src/org/eclipse/ui/internal/views/log/LogView.java 16 Nov 2007 11:17:16 -0000 @@ -27,6 +27,10 @@ import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import org.eclipse.core.runtime.ILogListener; import org.eclipse.core.runtime.IProgressMonitor; @@ -116,6 +120,7 @@ public static final String P_SHOW_FILTER_TEXT = "show_filter_text"; //$NON-NLS-1$ public static final String P_ORDER_TYPE = "orderType"; //$NON-NLS-1$ public static final String P_ORDER_VALUE = "orderValue"; //$NON-NLS-1$ + public static final String P_GROUP_BY = "groupBy"; //$NON-NLS-1$ private int MESSAGE_ORDER; private int PLUGIN_ORDER; @@ -127,7 +132,11 @@ public static int ASCENDING = 1; public static int DESCENDING = -1; - private ArrayList fLogs; + public static final int GROUP_BY_NONE = 0; + public static final int GROUP_BY_SESSION = 1; + public static final int GROUP_BY_PLUGIN = 2; + + private List fLogs; private Clipboard fClipboard; @@ -664,8 +673,8 @@ public void fillContextMenu(IMenuManager manager) { } - public LogSession[] getLogs() { - return (LogSession[]) fLogs.toArray(new LogSession[fLogs.size()]); + public AbstractEntry[] getLogs() { // TODO rename to getElements, reconsider this method! + return (AbstractEntry[]) fLogs.toArray(new AbstractEntry[fLogs.size()]); } protected void handleClear() { @@ -703,7 +712,65 @@ fLogs.clear(); if (!fInputFile.exists()) return; - LogReader.parseLogFile(fInputFile, fLogs, fMemento); + + List result = new ArrayList(); + LogReader.parseLogFile(fInputFile, result, fMemento); + group(result); // TODO make parseLogFile a function and have loa local var + } + + private void group(List entries) { + fLogs.clear(); + + if (fMemento.getInteger(P_GROUP_BY).intValue() == GROUP_BY_NONE) { + fLogs.addAll(entries); + } else { + Map groups = new HashMap(); + + for (Iterator i = entries.iterator(); i.hasNext(); ) { + LogEntry entry = (LogEntry) i.next(); + Group group = getGroup(groups, entry); + group.addChild(entry); + } + } + } + + /** + * Returns group appropriate for the entry. Group depends on P_GROUP_BY + * preference, or is null if grouping is disabled (GROUP_BY_NONE), or group + * could not be determined. May create group if it haven't existed before. + * + * @param entry entry to be grouped + * @return group or null if grouping is disabled + */ + protected Group getGroup(Map groups, LogEntry entry) { + + Object elementGroupId = null; + + switch (fMemento.getInteger(P_GROUP_BY).intValue()) { + case GROUP_BY_PLUGIN: + elementGroupId = entry.getPluginId(); + break; + + case GROUP_BY_SESSION: + elementGroupId = entry.getSession(); + break; + + default: // grouping is disabled + return null; + } + + if (elementGroupId == null) { // could not determine group + return null; + } + + Group group = (Group) groups.get(elementGroupId); + if (group == null) { + group = new Group(elementGroupId); + groups.put(elementGroupId, group); + fLogs.add(group); + } + + return group; } public void logging(IStatus status, String plugin) { @@ -723,7 +790,7 @@ if (fLogs.isEmpty()) { fLogs.add(new LogSession()); } - LogReader.addEntry(entry, ((LogSession)fLogs.get(fLogs.size() - 1)).getEntries(), fMemento, true); + LogReader.addEntry(entry, getCurrentSession(), fMemento, true); asyncRefresh(); } @@ -875,6 +942,9 @@ } fMemento.putInteger(P_ORDER_VALUE, DESCENDING); fMemento.putInteger(P_ORDER_TYPE, DATE); + if (fMemento.getInteger(P_GROUP_BY) == null) { + fMemento.putInteger(P_GROUP_BY, GROUP_BY_NONE); + } } public void saveState(IMemento memento) { @@ -1017,8 +1087,8 @@ } } - private int getNumberOfParents(LogEntry entry){ - LogEntry parent = (LogEntry)entry.getParent(entry); + private int getNumberOfParents(AbstractEntry entry){ + AbstractEntry parent = (AbstractEntry)entry.getParent(entry); if (parent ==null) return 0; return 1 + getNumberOfParents(parent); @@ -1176,6 +1246,7 @@ fMemento.putInteger(P_ORDER_VALUE, order == 0 ? DESCENDING : order); fMemento.putInteger(P_ORDER_TYPE, p.getInt(P_ORDER_TYPE)); fMemento.putBoolean(P_SHOW_FILTER_TEXT, p.getBoolean(P_SHOW_FILTER_TEXT)); + fMemento.putInteger(P_GROUP_BY, p.getInt(P_GROUP_BY)); } catch (NumberFormatException e) { fMemento.putInteger(P_LOG_LIMIT, 50); fMemento.putInteger(P_COLUMN_1, 300); @@ -1183,6 +1254,7 @@ fMemento.putInteger(P_COLUMN_3, 150); fMemento.putInteger(P_ORDER_TYPE, DATE); fMemento.putInteger(P_ORDER_VALUE, DESCENDING); + fMemento.putInteger(P_GROUP_BY, GROUP_BY_NONE); } } @@ -1251,4 +1323,8 @@ protected File getLogFile() { return fInputFile; } + + private LogSession getCurrentSession() { + return ((LogSession)fLogs.get(fLogs.size() - 1)); // TODO If in grouping, it may be not a LogSession, but Group + } } Index: src/org/eclipse/ui/internal/views/log/LogEntry.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.views.log/src/org/eclipse/ui/internal/views/log/LogEntry.java,v retrieving revision 1.2 diff -u -r1.2 LogEntry.java --- src/org/eclipse/ui/internal/views/log/LogEntry.java 1 Oct 2007 20:47:08 -0000 1.2 +++ src/org/eclipse/ui/internal/views/log/LogEntry.java 16 Nov 2007 11:17:14 -0000 @@ -13,24 +13,20 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.text.ParseException; -import java.util.ArrayList; import java.util.Date; import java.util.StringTokenizer; import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.PlatformObject; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.model.IWorkbenchAdapter; import com.ibm.icu.text.SimpleDateFormat; -public class LogEntry extends PlatformObject implements IWorkbenchAdapter { +public class LogEntry extends AbstractEntry { public static final String F_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS"; //$NON-NLS-1$ private static final SimpleDateFormat F_SDF = new SimpleDateFormat(F_DATE_FORMAT); - private ArrayList children; - private LogEntry parent; private String pluginId; private int severity; private int code; @@ -85,21 +81,11 @@ public String getSeverityText() { return getSeverityText(severity); } - public boolean hasChildren() { - return children != null && children.size() > 0; - } + public String toString() { return getSeverityText(); } - /** - * @see IWorkbenchAdapter#getChildren(Object) - */ - public Object[] getChildren(Object parent) { - if (children == null) - return new Object[0]; - return children.toArray(); - } - + /** * @see IWorkbenchAdapter#getImageDescriptor(Object) */ @@ -114,17 +100,6 @@ return getSeverityText(); } - /** - * @see IWorkbenchAdapter#getParent(Object) - */ - public Object getParent(Object obj) { - return parent; - } - - void setParent(LogEntry parent) { - this.parent = parent; - } - private String getSeverityText(int severity) { switch (severity) { case IStatus.ERROR : @@ -279,19 +254,13 @@ } IStatus[] schildren = status.getChildren(); if (schildren.length > 0) { - children = new ArrayList(); for (int i = 0; i < schildren.length; i++) { LogEntry child = new LogEntry(schildren[i]); addChild(child); } } } - void addChild(LogEntry child) { - if (children == null) - children = new ArrayList(); - children.add(child); - child.setParent(this); - } + public void write(PrintWriter writer) { if (session != null) writer.println(session.getSessionData()); Index: src/org/eclipse/ui/internal/views/log/EventDetailsDialogAction.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.views.log/src/org/eclipse/ui/internal/views/log/EventDetailsDialogAction.java,v retrieving revision 1.2 diff -u -r1.2 EventDetailsDialogAction.java --- src/org/eclipse/ui/internal/views/log/EventDetailsDialogAction.java 22 Oct 2007 15:18:42 -0000 1.2 +++ src/org/eclipse/ui/internal/views/log/EventDetailsDialogAction.java 16 Nov 2007 11:17:14 -0000 @@ -81,7 +81,7 @@ //get initial selection IAdaptable element = (IAdaptable) getStructuredSelection().getFirstElement(); - if ((element == null) || (element instanceof LogSession)) + if ((element == null) || (! (element instanceof AbstractEntry))) return; propertyDialog = new EventDetailsDialog(shell, element, provider, comparator); Index: src/org/eclipse/ui/internal/views/log/LogViewContentProvider.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.views.log/src/org/eclipse/ui/internal/views/log/LogViewContentProvider.java,v retrieving revision 1.2 diff -u -r1.2 LogViewContentProvider.java --- src/org/eclipse/ui/internal/views/log/LogViewContentProvider.java 22 Oct 2007 15:18:42 -0000 1.2 +++ src/org/eclipse/ui/internal/views/log/LogViewContentProvider.java 16 Nov 2007 11:17:16 -0000 @@ -11,8 +11,6 @@ *******************************************************************************/ package org.eclipse.ui.internal.views.log; -import java.util.List; - import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; @@ -25,11 +23,7 @@ public void dispose() { } public Object[] getChildren(Object element) { - if (element instanceof LogSession) { - List entries = ((LogSession) element).getEntries(); - return entries.toArray(new LogEntry[entries.size()]); - } - return ((LogEntry) element).getChildren(element); + return ((AbstractEntry) element).getChildren(element); } public Object[] getElements(Object element) { return logView.getLogs(); @@ -41,10 +35,7 @@ return ((LogEntry) element).getParent(element); } public boolean hasChildren(Object element) { - if (element instanceof LogSession) { - return ((LogSession) element).getEntries().size() > 0; - } - return ((LogEntry) element).hasChildren(); + return ((AbstractEntry) element).getChildren(element).length > 0; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } Index: src/org/eclipse/ui/internal/views/log/EventDetailsDialog.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.views.log/src/org/eclipse/ui/internal/views/log/EventDetailsDialog.java,v retrieving revision 1.5 diff -u -r1.5 EventDetailsDialog.java --- src/org/eclipse/ui/internal/views/log/EventDetailsDialog.java 25 Oct 2007 15:54:49 -0000 1.5 +++ src/org/eclipse/ui/internal/views/log/EventDetailsDialog.java 16 Nov 2007 11:17:11 -0000 @@ -15,8 +15,8 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.text.Collator; +import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; @@ -29,6 +29,7 @@ import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; @@ -49,12 +50,18 @@ import org.eclipse.ui.PlatformUI; public class EventDetailsDialog extends TrayDialog { - private LogEntry entry, parentEntry; + private AbstractEntry entry; + private AbstractEntry parentEntry; // parent of the entry + private AbstractEntry[] entryChildren; // children of the entry + private LogViewLabelProvider labelProvider; - private static int COPY_ID = 22; private TreeViewer provider; - private int elementNum, totalElementCount; - private LogEntry[] entryChildren; + + private static int COPY_ID = 22; + + private int elementNum; // number of selected element + private int totalElementCount; // number of all elements + private int childIndex = 0; private boolean isOpen; private boolean isLastChild; @@ -93,7 +100,7 @@ this.provider = (TreeViewer) provider; labelProvider = (LogViewLabelProvider)this.provider.getLabelProvider(); labelProvider.connect(this); - this.entry = (LogEntry)selection; + this.entry = (AbstractEntry)selection; this.comparator = comparator; setShellStyle(SWT.MODELESS | SWT.MIN | SWT.MAX | SWT.RESIZE | SWT.CLOSE | SWT.BORDER | SWT.TITLE); clipboard = new Clipboard(parentShell.getDisplay()); @@ -107,7 +114,7 @@ private void initialize() { elementNum = getParentElementNum(); resetTotalElementCount(); - parentEntry = (LogEntry) entry.getParent(entry); + parentEntry = (AbstractEntry) entry.getParent(entry); if (isChild(entry)){ setEntryChildren(parentEntry); resetChildIndex(); @@ -117,16 +124,30 @@ } private void resetChildIndex() { + if (! (entry instanceof AbstractEntry)) { + return; + } + + if (entryChildren == null) + return; + + LogEntry thisEntry = (LogEntry) entry; + for (int i = 0; i < entryChildren.length; i++) { - if (equal(entryChildren[i].getMessage(), entry.getMessage()) - && equal(entryChildren[i].getDate(), entry.getDate()) - && equal(entryChildren[i].getPluginId(), entry - .getPluginId()) - && entryChildren[i].getSeverity() == entry.getSeverity() - && equal(entryChildren[i].getSeverityText(), entry - .getSeverityText())) { - childIndex = i; - break; + if (entryChildren[i] instanceof LogEntry) { + + LogEntry logEntry = (LogEntry) entryChildren[i]; + + if (equal(logEntry.getMessage(), thisEntry.getMessage()) + && equal(logEntry.getDate(), thisEntry.getDate()) + && equal(logEntry.getPluginId(), thisEntry + .getPluginId()) + && logEntry.getSeverity() == thisEntry.getSeverity() + && equal(logEntry.getSeverityText(), thisEntry + .getSeverityText())) { + childIndex = i; + break; + } } } } @@ -144,7 +165,7 @@ return d1.equals(d2); } - private boolean isChild(LogEntry entry) { + private boolean isChild(AbstractEntry entry) { return entry.getParent(entry) != null; } @@ -306,8 +327,8 @@ updateProperties(); return; } - if (selectedEntry instanceof LogEntry) { - entry = (LogEntry)selectedEntry; + if (selectedEntry instanceof AbstractEntry) { + entry = (AbstractEntry)selectedEntry; initialize(); updateProperties(); } @@ -325,7 +346,7 @@ public void updateProperties() { if (isChild(entry)){ - parentEntry = (LogEntry) entry.getParent(entry); + parentEntry = (AbstractEntry) entry.getParent(entry); setEntryChildren(parentEntry); resetChildIndex(); if (childIndex == entryChildren.length - 1) @@ -334,21 +355,37 @@ resetTotalElementCount(); - String strDate = entry.getFormattedDate(); - dateLabel.setText(strDate); - severityImageLabel.setImage(labelProvider.getColumnImage(entry, 0)); - severityLabel.setText(entry.getSeverityText()); - msgText.setText(entry.getMessage() != null ? entry.getMessage() : ""); //$NON-NLS-1$ - String stack = entry.getStack(); - if (stack != null) { - stackTraceText.setText(stack); - } else { - stackTraceText.setText(Messages.EventDetailsDialog_noStack); + LogSession session = null; + + if (entry instanceof LogEntry) { + LogEntry logEntry = (LogEntry) entry; + + String strDate = logEntry.getFormattedDate(); + dateLabel.setText(strDate); + severityImageLabel.setImage(labelProvider.getColumnImage(entry, 0)); + severityLabel.setText(logEntry.getSeverityText()); + msgText.setText(logEntry.getMessage() != null ? logEntry.getMessage() : ""); //$NON-NLS-1$ + String stack = logEntry.getStack(); + if (stack != null) { + stackTraceText.setText(stack); + } else { + stackTraceText.setText(Messages.EventDetailsDialog_noStack); + } + session = logEntry.getSession(); + + } else if (entry instanceof LogSession) { + session = (LogSession) entry; + + dateLabel.setText(""); //$NON-NLS-1$ + severityImageLabel.setImage(null); + severityLabel.setText(""); //$NON-NLS-1$ + msgText.setText(""); //$NON-NLS-1$ + stackTraceText.setText(""); //$NON-NLS-1$ } - LogSession session = entry.getSession(); + if (session != null && session.getSessionData() != null) sessionDataText.setText(session.getSessionData()); - + updateButtons(); } @@ -363,15 +400,15 @@ } } - private void findNextSelectedChild(LogEntry originalEntry){ + private void findNextSelectedChild(AbstractEntry originalEntry){ if (isChild (parentEntry)){ // we're at the end of the child list; find next parent // to select. If the parent is a child at the end of the child // list, find its next parent entry to select, etc. entry = parentEntry; - setEntryChildren((LogEntry)parentEntry.getParent(parentEntry)); - parentEntry = (LogEntry)parentEntry.getParent(parentEntry); + setEntryChildren((AbstractEntry)parentEntry.getParent(parentEntry)); + parentEntry = (AbstractEntry)parentEntry.getParent(parentEntry); resetChildIndex(); isLastChild = childIndex == entryChildren.length-1; if (isLastChild){ @@ -386,15 +423,15 @@ } } - private boolean nextChildExists(LogEntry originalEntry, LogEntry originalParent, LogEntry[] originalEntries){ + private boolean nextChildExists(AbstractEntry originalEntry, AbstractEntry originalParent, AbstractEntry[] originalEntries){ if (isChild (parentEntry)){ // we're at the end of the child list; find next parent // to select. If the parent is a child at the end of the child // list, find its next parent entry to select, etc. entry = parentEntry; - setEntryChildren((LogEntry)parentEntry.getParent(parentEntry)); - parentEntry = (LogEntry)parentEntry.getParent(parentEntry); + setEntryChildren((AbstractEntry)parentEntry.getParent(parentEntry)); + parentEntry = (AbstractEntry)parentEntry.getParent(parentEntry); resetChildIndex(); if (childIndex == entryChildren.length-1){ nextChildExists(originalEntry, originalParent, originalEntries); @@ -413,39 +450,67 @@ return false; } + + /** + * Sets entry children (Prev-Next navigable) to top-level elements + */ private void setEntryChildren(){ - Object[] children = ((LogViewContentProvider)provider.getContentProvider()).getElements(null); + AbstractEntry[] children = getElements(); if (comparator != null) Arrays.sort(children, comparator); - entryChildren = new LogEntry[children.length]; + entryChildren = new AbstractEntry[children.length]; System.arraycopy(children,0,entryChildren,0,children.length); } private void resetTotalElementCount(){ - totalElementCount = entry.getSession().getEntries().size(); + AbstractEntry parent = ((AbstractEntry)entry.getParent(entry)); + if (parent == null) { + totalElementCount = getElements().length; + } else { + totalElementCount = parent.getChildren(parent).length; + } } - private void setEntryChildren(LogEntry entry){ - LogSession session = entry.getSession(); - if (session == null) - return; + /** + * Sets entry children (Prev-Next navigable) to children of given entry + */ + private void setEntryChildren(AbstractEntry entry){ + Object[] children = entry.getChildren(entry); - List children = session.getEntries(); if (comparator != null) - Collections.sort(children, comparator); - entryChildren = (LogEntry[])children.toArray(new LogEntry[children.size()]); + Arrays.sort(children, comparator); + + List result = new ArrayList(); + for (int i = 0; i < children.length; i++) { + if (children[i] instanceof AbstractEntry) { + result.add(children[i]); + } + } + + entryChildren = (AbstractEntry[])result.toArray(new AbstractEntry[result.size()]); } - + + /** + * Returns number of children of current parent node. + * @return + */ private int getParentElementNum(){ - LogEntry itemEntry = (LogEntry)((IStructuredSelection)provider.getSelection()).getFirstElement(); - itemEntry = getRootEntry(itemEntry); + AbstractEntry itemEntry = (AbstractEntry)((IStructuredSelection)provider.getSelection()).getFirstElement(); + + //itemEntry = getRootEntry(itemEntry); + + AbstractEntry itemParent = (AbstractEntry) itemEntry.getParent(itemEntry); + if (itemParent != null) { + setEntryChildren(itemEntry); + } else { + setEntryChildren(); // if at top level, the children are top-level + } - setEntryChildren(itemEntry); for (int i = 0; i 0) { LogEntry entry = new LogEntry(); @@ -199,11 +197,44 @@ if (doAdd) { if (useCurrentSession) current.setSession(currentSession); + entries.add(0, current); - if (memento.getString(LogView.P_USE_LIMIT).equals("true") //$NON-NLS-1$ - && entries.size() > memento.getInteger(LogView.P_LOG_LIMIT).intValue()) - entries.remove(entries.size() - 1); + if (memento.getString(LogView.P_USE_LIMIT).equals("true")) {//$NON-NLS-1$ + int limit = memento.getInteger(LogView.P_LOG_LIMIT).intValue(); + if (entries.size() > limit) { + entries.remove(entries.size() - 1); + } + } + } + } + + // TODO Merge two addEntry methods into one + public synchronized static void addEntry(LogEntry current, LogSession session, IMemento memento, boolean useCurrentSession) { + int severity = current.getSeverity(); + boolean doAdd = true; + switch(severity) { + case IStatus.INFO: + doAdd = memento.getString(LogView.P_LOG_INFO).equals("true"); //$NON-NLS-1$ + break; + case IStatus.WARNING: + doAdd = memento.getString(LogView.P_LOG_WARNING).equals("true"); //$NON-NLS-1$ + break; + case IStatus.ERROR: + doAdd = memento.getString(LogView.P_LOG_ERROR).equals("true"); //$NON-NLS-1$ + break; + } + if (doAdd) { + if (useCurrentSession) + current.setSession(currentSession); + + + session.addChild(current); + + if (memento.getString(LogView.P_USE_LIMIT).equals("true")) {//$NON-NLS-1$ + int limit = memento.getInteger(LogView.P_LOG_LIMIT).intValue(); + session.addChild(current, limit); + } } } Index: src/org/eclipse/ui/internal/views/log/FilterDialog.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.views.log/src/org/eclipse/ui/internal/views/log/FilterDialog.java,v retrieving revision 1.1 diff -u -r1.1 FilterDialog.java --- src/org/eclipse/ui/internal/views/log/FilterDialog.java 1 Oct 2007 20:39:31 -0000 1.1 +++ src/org/eclipse/ui/internal/views/log/FilterDialog.java 16 Nov 2007 11:17:14 -0000 @@ -21,6 +21,7 @@ import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Group; @@ -39,6 +40,11 @@ private Button infoButton; private Button showAllButton; private IMemento memento; + private Combo groupByCombo; + + private static final String[] groupByItems = new String[] { // groupByItems must have the same order as their respective LogView.GROUP_BY_* consts + "None", "Session", "Plug-in" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ // TODO EXTERNALIZE + }; public FilterDialog(Shell parentShell, IMemento memento) { super(parentShell); @@ -50,6 +56,7 @@ createEventTypesGroup(container); createLimitSection(container); createSessionSection(container); + createGroupBySection(container); Dialog.applyDialogFont(container); return container; @@ -136,6 +143,22 @@ } } + protected void createGroupBySection(Composite parent) { + Composite container = new Composite(parent, SWT.NONE); + container.setLayout(new GridLayout()); + container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + Label label = new Label(container, SWT.NONE); + label.setText("Group by"); //$NON-NLS-1$ //TODO EXTERNALIZE + + groupByCombo = new Combo(container, SWT.NONE); + groupByCombo.setItems(groupByItems); + + Integer value = memento.getInteger(LogView.P_GROUP_BY); + groupByCombo.select(value == null ? LogView.GROUP_BY_NONE : value + .intValue()); + } + protected void createButtonsForButtonBar(Composite parent) { okButton = createButton( parent, @@ -156,6 +179,7 @@ memento.putString(LogView.P_LOG_LIMIT, limitText.getText()); memento.putString(LogView.P_USE_LIMIT, limit.getSelection() ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ memento.putString(LogView.P_SHOW_ALL_SESSIONS, showAllButton.getSelection() ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ + memento.putInteger(LogView.P_GROUP_BY, groupByCombo.getSelectionIndex()); super.okPressed(); } Index: src/org/eclipse/ui/internal/views/log/AbstractEntry.java =================================================================== RCS file: src/org/eclipse/ui/internal/views/log/AbstractEntry.java diff -N src/org/eclipse/ui/internal/views/log/AbstractEntry.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/ui/internal/views/log/AbstractEntry.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,74 @@ +package org.eclipse.ui.internal.views.log; + +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.runtime.PlatformObject; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.ui.model.IWorkbenchAdapter; + +/** + * + * + */ +public abstract class AbstractEntry extends PlatformObject implements IWorkbenchAdapter { + + private List children; + private Object parent; + + public void addChild(AbstractEntry child) { + if (children == null) { + children = new ArrayList(); + } + children.add(0, child); + child.setParent(this); + } + + public void addChild(AbstractEntry child, int limit) { + addChild(child); + if (children.size() > limit) { + children.remove(children.size() - 1); + } + } + + /** + * @see IWorkbenchAdapter#getChildren(Object) + */ + public Object[] getChildren(Object parent) { + if (children == null) + return new Object[0]; + return children.toArray(); + } + + public boolean hasChildren() { + return children != null && children.size() > 0; + } + + /** + * @see IWorkbenchAdapter#getImageDescriptor(Object) + */ + public ImageDescriptor getImageDescriptor(Object object) { + return null; + } + + /** + * @see IWorkbenchAdapter#getLabel(Object) + */ + public String getLabel(Object o) { + return null; + } + + /** + * @see IWorkbenchAdapter#getParent(Object) + */ + public Object getParent(Object o) { + return parent; + } + + public void setParent(AbstractEntry parent) { + this.parent = parent; + } + + public abstract void write(PrintWriter writer); +} Index: src/org/eclipse/ui/internal/views/log/Group.java =================================================================== RCS file: src/org/eclipse/ui/internal/views/log/Group.java diff -N src/org/eclipse/ui/internal/views/log/Group.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/ui/internal/views/log/Group.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,28 @@ +package org.eclipse.ui.internal.views.log; + +import java.io.PrintWriter; + +public class Group extends AbstractEntry { + + private Object groupId; + + public Group(Object groupId) { + this.groupId = groupId; + } + + public void write(PrintWriter writer) { + // empty + } + + public int hashCode() { + return groupId.hashCode(); + } + + public boolean equals(Object o) { + return groupId.equals(o); + } + + public String toString() { + return groupId.toString(); + } +}