/* * #%~ * 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.ui.log; import java.util.ArrayList; 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.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.TextViewer; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; 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.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.part.ViewPart; public class VdmDebugLogView extends ViewPart { public static final String VIEW_ID = "org.overture.ide.debug.ui.log.dbgpLogView"; //$NON-NLS-1$ public static final String THEME_ID = "org.eclipse.dltk.debug.ui.dbgpLogView.txtViewFont"; //$NON-NLS-1$ private final List<VdmDebugLogItem> items = new ArrayList<VdmDebugLogItem>(); private TableViewer viewer; private TextViewer textViewer; private IDocument textDocument; private IPropertyChangeListener fontRegistryChangeListener; private IAction executionFilterAction; public VdmDebugLogView() { super(); } public void setFocus() { viewer.getControl().setFocus(); } public void createPartControl(Composite parent) { final SashForm sashForm = new SashForm(parent, SWT.HORIZONTAL); viewer = new TableViewer(sashForm, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION | SWT.VIRTUAL); viewer.getTable().setHeaderVisible(true); viewer.getTable().setLinesVisible(true); // addColumn(Messages.Column_Date, 100, true); addColumn(Messages.Column_Time, 100, true); addColumn(Messages.Column_Type, 80, true); addColumn(Messages.Column_Session, 60, true); addColumn(Messages.Column_Message, 500, false); 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.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { if (event.getSelection() instanceof IStructuredSelection) { final Object first = ((IStructuredSelection) event.getSelection()).getFirstElement(); if (first instanceof VdmDebugLogItem) { textDocument.set(((VdmDebugLogItem) first).getMessage()); return; } } textDocument.set(""); //$NON-NLS-1$ } }); viewer.setContentProvider(new VdmDebugLogContentProvider()); viewer.setLabelProvider(new VdmDebugLogLabelProvider()); viewer.setInput(items); textDocument = new Document(); textViewer = new TextViewer(sashForm, SWT.V_SCROLL | SWT.H_SCROLL | SWT.WRAP | SWT.READ_ONLY); textViewer.setDocument(textDocument); fontRegistryChangeListener = new IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { handlePropertyChangeEvent(event); } }; JFaceResources.getFontRegistry().addListener(fontRegistryChangeListener); updateFont(); sashForm.setWeights(new int[] { 75, 25 }); createActions(); createMenu(); createToolbar(); createContextMenu(); } public void dispose() { if (fontRegistryChangeListener != null) { JFaceResources.getFontRegistry().removeListener(fontRegistryChangeListener); fontRegistryChangeListener = null; } super.dispose(); } /** * @param event */ protected void handlePropertyChangeEvent(PropertyChangeEvent event) { final String key = event.getProperty(); if (key.equals(THEME_ID)) { updateFont(); } } private void updateFont() { textViewer.getTextWidget().setFont(JFaceResources.getFont(THEME_ID)); } /** * @param caption * @param width */ private void addColumn(String caption, int width, boolean center) { final TableColumn column = new TableColumn(viewer.getTable(), SWT.LEFT); column.setText(caption); column.setWidth(width); } public void append(final VdmDebugLogItem item) { synchronized (items) { items.add(item); } final Table table = viewer.getTable(); if (table.isDisposed()) { return; } final Display display = table.getDisplay(); if (display.isDisposed()) { return; } display.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) { table.showItem(table.getItem(itemCount - 1)); } } }); } private IAction copyAction; private IAction clearAction; public void clear() { Display.getDefault().syncExec(new Runnable() { public void run() { clearAction.run(); } }); } public void createActions() { copyAction = new VdmDebugLogCopyAction(viewer); clearAction = new Action(Messages.VdmDebugLogView_clear) { public void run() { synchronized (items) { items.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 VdmDebugLogExecutionFilter()); } else { for (int i = 0; i < filters.size(); i++) { if (filters.get(i) instanceof VdmDebugLogExecutionFilter) { filters.remove(i); break; } } } viewer.setFilters(filters.toArray(new ViewerFilter[filters.size()])); viewer.refresh(); } } }; } private void createMenu() { IMenuManager manager = getViewSite().getActionBars().getMenuManager(); manager.add(copyAction); manager.add(clearAction); manager.add(executionFilterAction); } 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)); } }