Package name.abuchen.portfolio.ui.log

Source Code of name.abuchen.portfolio.ui.log.ErrorLogPart$LogEntryDetailDialog

package name.abuchen.portfolio.ui.log;

import java.text.DateFormat;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.inject.Inject;

import name.abuchen.portfolio.ui.Messages;
import name.abuchen.portfolio.ui.PortfolioPlugin;
import name.abuchen.portfolio.ui.UIConstants;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.ui.di.Focus;
import org.eclipse.e4.ui.di.UIEventTopic;
import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class ErrorLogPart
{
    public static class LogEntryDetailDialog extends Dialog
    {
        private LogEntry entry;
        private Text entryText;

        protected LogEntryDetailDialog(Shell parentShell, LogEntry entry)
        {
            super(parentShell);
            this.entry = entry;
        }

        @Override
        protected boolean isResizable()
        {
            return true;
        }

        @Override
        protected void createButtonsForButtonBar(Composite parent)
        {
            createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
            Button button = createButton(parent, 9999, Messages.LabelCopyToClipboard, false);
            button.addSelectionListener(new SelectionAdapter()
            {
                @Override
                public void widgetSelected(SelectionEvent e)
                {
                    if (entryText.isDisposed())
                        return;
                    Clipboard cb = new Clipboard(Display.getCurrent());
                    TextTransfer textTransfer = TextTransfer.getInstance();
                    cb.setContents(new Object[] { entryText.getText() }, new Transfer[] { textTransfer });
                }
            });
        }

        @Override
        protected Control createDialogArea(Composite parent)
        {
            Composite container = new Composite(parent, SWT.None);
            GridDataFactory.fillDefaults().grab(true, true).hint(600, 200).applyTo(container);
            GridLayoutFactory.fillDefaults().numColumns(1).applyTo(container);

            entryText = new Text(container, SWT.MULTI | SWT.WRAP | SWT.READ_ONLY | SWT.BORDER | SWT.V_SCROLL);
            entryText.setText(entry.getText());
            GridDataFactory.fillDefaults().grab(true, true).applyTo(entryText);
            return container;
        }
    }

    public class LogEntryContentProvider implements ITreeContentProvider
    {
        private List<?> entries;

        @Override
        public void dispose()
        {}

        @Override
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
        {
            this.entries = (List<?>) newInput;
        }

        @Override
        public Object[] getElements(Object inputElement)
        {
            return entries.toArray();
        }

        @Override
        public boolean hasChildren(Object element)
        {
            return ((LogEntry) element).getChildren() != null;
        }

        @Override
        public Object[] getChildren(Object parentElement)
        {
            return ((LogEntry) parentElement).getChildren().toArray();
        }

        @Override
        public Object getParent(Object element)
        {
            return null;
        }
    }

    private List<LogEntry> entries = new ArrayList<LogEntry>();

    private TreeViewer logViewer;

    @Inject
    UISynchronize sync;

    @PostConstruct
    public void createComposite(Composite parent, LogEntryCache cache)
    {
        this.entries = cache.getEntries();

        Composite container = new Composite(parent, SWT.NONE);
        TreeColumnLayout layout = new TreeColumnLayout();
        container.setLayout(layout);

        logViewer = new TreeViewer(container, SWT.FULL_SELECTION);

        TreeViewerColumn column = new TreeViewerColumn(logViewer, SWT.NONE);
        column.getColumn().setText(Messages.ColumnDate);
        layout.setColumnData(column.getColumn(), new ColumnPixelData(140));
        column.setLabelProvider(new ColumnLabelProvider()
        {
            private DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);

            @Override
            public String getText(Object element)
            {
                return dateFormat.format(((LogEntry) element).getDate());
            }
        });

        column = new TreeViewerColumn(logViewer, SWT.NONE);
        column.getColumn().setText(Messages.ColumnMessage);
        layout.setColumnData(column.getColumn(), new ColumnPixelData(500));
        column.setLabelProvider(new ColumnLabelProvider()
        {
            @Override
            public String getText(Object element)
            {
                return ((LogEntry) element).getMessage();
            }

            @Override
            public Image getImage(Object element)
            {
                LogEntry entry = (LogEntry) element;

                switch (entry.getSeverity())
                {
                    case IStatus.ERROR:
                        return PortfolioPlugin.image(PortfolioPlugin.IMG_ERROR);
                    case IStatus.WARNING:
                        return PortfolioPlugin.image(PortfolioPlugin.IMG_WARNING);
                    default:
                        return PortfolioPlugin.image(PortfolioPlugin.IMG_INFO);
                }
            }
        });

        logViewer.getTree().setHeaderVisible(true);
        logViewer.getTree().setLinesVisible(true);

        logViewer.setContentProvider(new LogEntryContentProvider());

        logViewer.setInput(entries);

        logViewer.addDoubleClickListener(new IDoubleClickListener()
        {
            @Override
            public void doubleClick(DoubleClickEvent event)
            {
                LogEntry entry = (LogEntry) ((IStructuredSelection) event.getSelection()).getFirstElement();
                LogEntryDetailDialog dialog = new LogEntryDetailDialog(Display.getCurrent().getActiveShell(), entry);
                dialog.open();
            }
        });
    }

    @Focus
    public void setFocus()
    {
        logViewer.getTree().setFocus();
    }

    @Inject
    @Optional
    public void onLogEntryCreated(@UIEventTopic(UIConstants.Event.Log.CREATED) LogEntry entry)
    {
        entries.add(entry);
        logViewer.refresh();
    }

    @Inject
    @Optional
    public void onLogEntriesDeleted(@UIEventTopic(UIConstants.Event.Log.CLEARED) LogEntry entry)
    {
        entries.clear();
        logViewer.refresh();
    }

}
TOP

Related Classes of name.abuchen.portfolio.ui.log.ErrorLogPart$LogEntryDetailDialog

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.