/******************************************************************************* * Copyright (c) 2000, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package net.sourceforge.phpdt.internal.debug.core.logview; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.text.Collator; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Comparator; import java.util.Date; import net.sourceforge.phpdt.internal.debug.core.PHPDebugCorePlugin; import net.sourceforge.phpdt.internal.debug.core.PHPDegugCorePluginImages; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableTreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; public class EventDetailsDialog extends Dialog { private LogEntry entry, parentEntry; private LogViewLabelProvider labelProvider; private static int COPY_ID = 22; private TableTreeViewer provider; private int elementNum, totalElementCount; private LogEntry[] entryChildren; private int childIndex = 0; private boolean isOpen; private Label dateLabel; private Label severityImageLabel; private Label severityLabel; private Text msgText; private Text stackTraceText; private Text sessionDataText; private Clipboard clipboard; private Button copyButton; private Button backButton; private Button nextButton; private Image imgNextEnabled; private Image imgPrevEnabled; private Image imgCopyEnabled; private SashForm sashForm; // sorting private static int ASCENDING = 1; private Comparator comparator = null; private Collator collator; // location configuration private IDialogSettings dialogSettings; private Point dialogLocation; private Point dialogSize; private int[] sashWeights; // externalize strings private String EVENT_NO_STACK = "EventDetailsDialog.noStack"; //$NON-NLS-1$ private String EVENT_PREVIOUS = "EventDetailsDialog.previous"; //$NON-NLS-1$ private String EVENT_NEXT = "EventDetailsDialog.next"; //$NON-NLS-1$ private String EVENT_COPY = "EventDetailsDialog.copy"; //$NON-NLS-1$ /** * @param parentShell * shell in which dialog is displayed */ protected EventDetailsDialog(Shell parentShell, IAdaptable selection, ISelectionProvider provider) { super(parentShell); labelProvider = new LogViewLabelProvider(); this.provider = (TableTreeViewer) provider; this.entry = (LogEntry)selection; setShellStyle(SWT.MODELESS | SWT.MIN | SWT.MAX | SWT.RESIZE | SWT.CLOSE | SWT.BORDER | SWT.TITLE); clipboard = new Clipboard(parentShell.getDisplay()); initialize(); createImages(); collator = Collator.getInstance(); readConfiguration(); } private void initialize() { elementNum = getParentElementNum(); totalElementCount = provider.getTableTree().getTable().getItemCount() - getVisibleChildrenCount(); parentEntry = (LogEntry) entry.getParent(entry); if (isChild(entry)){ setEntryChildren(parentEntry); resetChildIndex(); } } private void resetChildIndex(){ for (int i = 0; i 0) width -= 100; else width = width/2; sashWeights = new int[]{width, getSashForm().getClientArea().width-width}; } getSashForm().setWeights(sashWeights); return super.open(); } public boolean close() { storeSettings(); isOpen = false; imgCopyEnabled.dispose(); imgNextEnabled.dispose(); imgPrevEnabled.dispose(); return super.close(); } public void create() { super.create(); // dialog location if (dialogLocation != null) getShell().setLocation(dialogLocation); // dialog size if (dialogSize != null) getShell().setSize(dialogSize); else getShell().setSize(500,550); applyDialogFont(buttonBar); getButton(IDialogConstants.OK_ID).setFocus(); } protected void buttonPressed(int buttonId) { if (IDialogConstants.OK_ID == buttonId) okPressed(); else if (IDialogConstants.CANCEL_ID == buttonId) cancelPressed(); else if (IDialogConstants.BACK_ID == buttonId) backPressed(); else if (IDialogConstants.NEXT_ID == buttonId) nextPressed(); else if (COPY_ID == buttonId) copyPressed(); } protected void backPressed() { if (isChild(entry)) { if (childIndex > 0) { childIndex--; entry = entryChildren[childIndex]; } else entry = parentEntry; } else { if (elementNum - 1 >= 0) elementNum -= 1; entry = (LogEntry) provider.getElementAt(elementNum); } setEntrySelectionInTable(); } protected void nextPressed() { if (isChild(entry) && childIndex < entryChildren.length-1) { childIndex++; entry = entryChildren[childIndex]; } else if (elementNum + 1 < totalElementCount){ elementNum += 1; entry = (LogEntry) provider.getElementAt(elementNum); } else { // at end of list but can branch into child elements - bug 58083 setEntryChildren(entry); entry = entryChildren[0]; } setEntrySelectionInTable(); } protected void copyPressed() { StringWriter writer = new StringWriter(); PrintWriter pwriter = new PrintWriter(writer); entry.write(pwriter); pwriter.flush(); String textVersion = writer.toString(); try { pwriter.close(); writer.close(); } catch (IOException e) { } // set the clipboard contents clipboard.setContents(new Object[] { textVersion }, new Transfer[] { TextTransfer.getInstance()}); } public void setComparator(Comparator comparator){ this.comparator = comparator; updateProperties(); } private void setComparator(byte sortType, final int sortOrder){ if (sortType == LogView.DATE){ comparator = new Comparator(){ public int compare(Object e1, Object e2) { try { SimpleDateFormat formatter = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss.SS"); //$NON-NLS-1$ Date date1 = formatter.parse(((LogEntry)e1).getDate()); Date date2 = formatter.parse(((LogEntry)e2).getDate()); if (sortOrder == ASCENDING) return date1.before(date2) ? -1 : 1; return date1.after(date2) ? -1 : 1; } catch (ParseException e) { } return 0; } }; } else if (sortType == LogView.PLUGIN){ comparator = new Comparator(){ public int compare(Object e1, Object e2) { LogEntry entry1 = (LogEntry)e1; LogEntry entry2 = (LogEntry)e2; return collator.compare(entry1.getPluginId(), entry2.getPluginId()) * sortOrder; } }; } else { comparator = new Comparator(){ public int compare(Object e1, Object e2) { LogEntry entry1 = (LogEntry)e1; LogEntry entry2 = (LogEntry)e2; return collator.compare(entry1.getMessage(), entry2.getMessage()) * sortOrder; } }; } } public void resetSelection(IAdaptable selectedEntry, byte sortType, int sortOrder){ setComparator(sortType, sortOrder); resetSelection(selectedEntry); } public void resetSelection(IAdaptable selectedEntry){ if (entry.equals(selectedEntry) && elementNum == getParentElementNum()){ updateProperties(); return; } entry = (LogEntry)selectedEntry; initialize(); updateProperties(); } public void resetButtons(){ backButton.setEnabled(false); nextButton.setEnabled(false); } private void setEntrySelectionInTable(){ ISelection selection = new StructuredSelection(entry); provider.setSelection(selection); } public void updateProperties() { if (isChild(entry)){ parentEntry = (LogEntry) entry.getParent(entry); setEntryChildren(parentEntry); resetChildIndex(); } totalElementCount = provider.getTableTree().getTable().getItemCount() - getVisibleChildrenCount(); dateLabel.setText(entry.getDate()); severityImageLabel.setImage(labelProvider.getColumnImage(entry, 1)); severityLabel.setText(entry.getSeverityText()); msgText.setText(entry.getMessage()); String stack = entry.getStack(); if (stack != null) { stackTraceText.setText(stack); } else { stackTraceText.setText(PHPDebugCorePlugin.getResourceString(EVENT_NO_STACK)); } LogSession session = entry.getSession(); if (session != null && session.getSessionData() != null) sessionDataText.setText(session.getSessionData()); updateButtons(); } private void updateButtons(){ boolean isAtEnd = elementNum == totalElementCount - 1; if (isChild(entry)){ backButton.setEnabled(true); boolean isLastChild = childIndex == entryChildren.length-1; nextButton.setEnabled(!isLastChild || !isAtEnd || entry.hasChildren()); } else { backButton.setEnabled(elementNum != 0); nextButton.setEnabled(!isAtEnd || entry.hasChildren()); } } private void setEntryChildren(LogEntry parent){ Object[] children = parent.getChildren(parent); if (comparator != null) Arrays.sort(children, comparator); entryChildren = new LogEntry[children.length]; System.arraycopy(children,0,entryChildren,0,children.length); } private int getParentElementNum(){ LogEntry itemEntry = (LogEntry)((IStructuredSelection)provider.getSelection()).getFirstElement(); itemEntry = getRootEntry(itemEntry); for (int i = 0; i