| /******************************************************************************* |
| * Copyright (c) 2000, 2018 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| *******************************************************************************/ |
| package org.eclipse.dltk.internal.debug.ui.log; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.dltk.ui.DLTKUIPlugin; |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.action.IAction; |
| 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.IStructuredSelection; |
| import org.eclipse.jface.viewers.TableViewer; |
| 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.Menu; |
| import org.eclipse.swt.widgets.Table; |
| import org.eclipse.swt.widgets.TableColumn; |
| import org.eclipse.ui.IWorkbenchActionConstants; |
| import org.eclipse.ui.contexts.IContextActivation; |
| import org.eclipse.ui.contexts.IContextService; |
| import org.eclipse.ui.part.ViewPart; |
| |
| public class ScriptDebugLogView extends ViewPart { |
| public static final String VIEW_ID = "org.eclipse.dltk.debug.ui.dbgpLogView"; //$NON-NLS-1$ |
| public static final String THEME_ID = "org.eclipse.dltk.debug.ui.dbgpLogView.txtViewFont"; //$NON-NLS-1$ |
| |
| private final List<ScriptDebugLogItem> items = new ArrayList<>(); |
| private TableViewer viewer; |
| private TextViewer textViewer; |
| private IDocument textDocument; |
| private IPropertyChangeListener fontRegistryChangeListener; |
| private IContextActivation fContextActivation; |
| |
| public ScriptDebugLogView() { |
| super(); |
| } |
| |
| @Override |
| public void setFocus() { |
| viewer.getControl().setFocus(); |
| } |
| |
| @Override |
| 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, 80, true); |
| addColumn(Messages.Column_Message, 400, false); |
| viewer.getTable().addListener(SWT.Resize, 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(event -> { |
| if (event.getSelection() instanceof IStructuredSelection) { |
| final Object first = event.getStructuredSelection() |
| .getFirstElement(); |
| if (first instanceof ScriptDebugLogItem) { |
| textDocument.set(((ScriptDebugLogItem) first).getMessage()); |
| return; |
| } |
| } |
| textDocument.set(""); //$NON-NLS-1$ |
| }); |
| viewer.setContentProvider(new ScriptDebugLogContentProvider()); |
| viewer.setLabelProvider(new ScriptDebugLogLabelProvider()); |
| 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 = event -> handlePropertyChangeEvent(event); |
| JFaceResources.getFontRegistry() |
| .addListener(fontRegistryChangeListener); |
| |
| updateFont(); |
| sashForm.setWeights(new int[] { 75, 25 }); |
| createActions(); |
| createMenu(); |
| createToolbar(); |
| createContextMenu(); |
| IContextService ctxService = getSite() |
| .getService(IContextService.class); |
| if (ctxService != null) { |
| fContextActivation = ctxService |
| .activateContext(DLTKUIPlugin.CONTEXT_VIEWS); |
| } |
| } |
| |
| @Override |
| public void dispose() { |
| if (fContextActivation != null) { |
| IContextService ctxService = getSite() |
| .getService(IContextService.class); |
| if (ctxService != null) { |
| ctxService.deactivateContext(fContextActivation); |
| } |
| } |
| 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 ScriptDebugLogItem 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(() -> { |
| 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 createActions() { |
| copyAction = new ScriptDebugLogCopyAction(viewer); |
| clearAction = new Action(Messages.ScriptDebugLogView_clear) { |
| @Override |
| public void run() { |
| synchronized (items) { |
| items.clear(); |
| } |
| viewer.refresh(); |
| } |
| }; |
| } |
| |
| private void createMenu() { |
| IMenuManager manager = getViewSite().getActionBars().getMenuManager(); |
| manager.add(copyAction); |
| manager.add(clearAction); |
| } |
| |
| 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(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)); |
| } |
| |
| } |