/*
* #%~
* org.overture.ide.debug
* %%
* Copyright (C) 2008 - 2014 Overture
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #~%
*/
package org.overture.ide.debug.logging;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.part.ViewPart;
import org.overture.ide.debug.core.dbgp.IDbgpRawPacket;
import org.overture.ide.debug.core.dbgp.exceptions.DbgpException;
import org.overture.ide.debug.core.dbgp.internal.DbgpRawPacket;
import org.overture.ide.debug.core.dbgp.internal.packets.DbgpResponsePacket;
import org.overture.ide.debug.core.dbgp.internal.utils.DbgpXmlPacketParser;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class LogView extends ViewPart
{
private TableViewer viewer;
private IAction copyAction;
private IAction clearAction;
private IAction executionFilterAction;
private IAction scrollLockAction;
final Display display = Display.getCurrent();
private static final List<LogItem> content = new Vector<LogItem>();
@Override
public void createPartControl(Composite parent)
{
viewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL
| SWT.MULTI | SWT.FULL_SELECTION | SWT.VIRTUAL);
addColumn("Type", 80, true);
addColumn("Thread", 0, true);
addColumn("Message", 0, true);
viewer.getTable().setLinesVisible(true);
viewer.getTable().setHeaderVisible(true);
viewer.getTable().setSortDirection(SWT.NONE);
viewer.setSorter(null);
viewer.getTable().addListener(SWT.Resize, new Listener()
{
public void handleEvent(Event event)
{
final Table table = (Table) event.widget;
final int columnCount = table.getColumnCount();
int w = table.getClientArea().width;
for (int i = 0; i < columnCount - 1; ++i)
{
w -= table.getColumn(i).getWidth();
}
if (w > 0)
{
table.getColumn(columnCount - 1).setWidth(w);
}
}
});
viewer.setContentProvider(new LogContentProvider());
viewer.setLabelProvider(new LogLabelProvider());
viewer.setInput(content);
parent.layout();
createActions();
createMenu();
// createToolbar();
createContextMenu();
}
@Override
public void setFocus()
{
Shell shell = getShell();
if (shell != null)
{
final Table table = viewer.getTable();
if (table.isDisposed())
{
return;
}
final Display display = table.getDisplay();
if (display.isDisposed())
{
return;
}
shell.getDisplay().asyncExec(new Runnable()
{
public void run()
{
viewer.getControl().setFocus();
}
});
}
}
/**
* @param caption
* @param width
*/
private void addColumn(String caption, int width, boolean resizeable)
{
final TableColumn column = new TableColumn(viewer.getTable(), SWT.LEFT);
column.setText(caption);
column.setWidth(width);
column.setResizable(resizeable);
if (width == 0)
{
column.pack();
}
}
public void createActions()
{
copyAction = new DebugLogCopyAction(viewer);
clearAction = new Action("Clear")
{
public void run()
{
synchronized (content)
{
content.clear();
}
viewer.refresh();
}
};
executionFilterAction = new Action("Execution filter", SWT.TOGGLE)
{
public void run()
{
synchronized (viewer)
{
List<ViewerFilter> filters = new Vector<ViewerFilter>();
filters.addAll(Arrays.asList(viewer.getFilters()));
if (executionFilterAction.isChecked())
{
filters.add(new DebugLogExecutionControlFilter());
} else
{
for (int i = 0; i < filters.size(); i++)
{
if (filters.get(i) instanceof DebugLogExecutionControlFilter)
{
filters.remove(i);
break;
}
}
}
viewer.setFilters(filters.toArray(new ViewerFilter[filters.size()]));
viewer.refresh();
}
}
};
scrollLockAction = new Action("Scroll Lock", SWT.TOGGLE)
{
};
}
private void createMenu()
{
IMenuManager manager = getViewSite().getActionBars().getMenuManager();
manager.add(copyAction);
manager.add(clearAction);
manager.add(executionFilterAction);
manager.add(scrollLockAction);
}
// private void createToolbar() {
// IToolBarManager manager = getViewSite().getActionBars()
// .getToolBarManager();
// manager.add(copyAction);
// manager.add(clearAction);
// }
private void createContextMenu()
{
// Create menu manager.
MenuManager menuManager = new MenuManager();
menuManager.setRemoveAllWhenShown(true);
menuManager.addMenuListener(new IMenuListener()
{
public void menuAboutToShow(IMenuManager manager)
{
fillContextMenu(manager);
}
});
// Create menu.
Menu menu = menuManager.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
// Register menu for extension.
getSite().registerContextMenu(menuManager, viewer);
}
private void fillContextMenu(IMenuManager manager)
{
manager.add(copyAction);
manager.add(clearAction);
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
public synchronized void clear()
{
content.clear();
Shell shell = getShell();
if (shell != null)
{
final Table table = viewer.getTable();
if (table.isDisposed())
{
return;
}
final Display display = table.getDisplay();
if (display.isDisposed())
{
return;
}
shell.getDisplay().asyncExec(new Runnable()
{
public void run()
{
viewer.refresh();
}
});
}
}
public Shell getShell()
{
return getSite().getShell();
}
public synchronized void log(LogItem item)
{
content.add(item);
Shell shell = getShell();
if (shell != null)
{
final Table table = viewer.getTable();
if (table.isDisposed())
{
return;
}
final Display display = table.getDisplay();
if (display.isDisposed())
{
return;
}
shell.getDisplay().asyncExec(new Runnable()
{
public void run()
{
viewer.refresh(false, false);
if (table.isDisposed() || table.getDisplay().isDisposed())
{
return;
}
final int itemCount = table.getItemCount();
if (itemCount > 0 && !scrollLockAction.isChecked())
{
table.showItem(table.getItem(itemCount - 1));
}
}
});
}
}
private static final String INIT_TAG = "init"; //$NON-NLS-1$
private static final String RESPONSE_TAG = "response"; //$NON-NLS-1$
private static final String STREAM_TAG = "stream"; //$NON-NLS-1$
private static final String NOTIFY_TAG = "notify"; //$NON-NLS-1$
public void dbgpPacketReceived(int sessionId, IDbgpRawPacket content)
{
// FIXME: what is this! why is it here and is it used
try
{
Document doc = ((DbgpRawPacket) content).getParsedXml();
Element element = (Element) doc.getFirstChild();
String tag = element.getTagName();
if (tag.equals(INIT_TAG))
{
// DbgpResponsePacket responsePacket = new DbgpResponsePacket(element, -1);
} else if (tag.equals(RESPONSE_TAG))
{
DbgpResponsePacket packet = DbgpXmlPacketParser.parseResponsePacket(element);
System.out.println(packet.toString());
this.log(new LogItem(new Integer(sessionId).toString(), RESPONSE_TAG, "", false, ""));
} else if (tag.equals(STREAM_TAG))
{
// DbgpStreamPacket streamPacket = DbgpXmlPacketParser.parseStreamPacket(element);
} else if (tag.equals(NOTIFY_TAG))
{
// DbgpNotifyPacket notifyPacket = DbgpXmlPacketParser.parseNotifyPacket(element);
}
} catch (DbgpException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void dbgpPacketSent(int sessionId, IDbgpRawPacket content)
{
// TODO Auto-generated method stub
}
}