X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.message.ui%2Fsrc%2Forg%2Fsimantics%2Fmessage%2Fui%2FOpenLogDialog.java;fp=bundles%2Forg.simantics.message.ui%2Fsrc%2Forg%2Fsimantics%2Fmessage%2Fui%2FOpenLogDialog.java;h=5c5f8897e51f8fbe759f77cfe70da2caa615c927;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.message.ui/src/org/simantics/message/ui/OpenLogDialog.java b/bundles/org.simantics.message.ui/src/org/simantics/message/ui/OpenLogDialog.java new file mode 100644 index 000000000..5c5f8897e --- /dev/null +++ b/bundles/org.simantics.message.ui/src/org/simantics/message/ui/OpenLogDialog.java @@ -0,0 +1,240 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * 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 + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.message.ui; + +import java.io.*; +import java.lang.reflect.InvocationTargetException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.dialogs.*; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.*; + +/** + * Displays the error log in non-Win32 platforms - see bug 55314. + */ +public final class OpenLogDialog extends TrayDialog { + // input log file + private File logFile; + // location/size configuration + private IDialogSettings dialogSettings; + private Point dialogLocation; + private Point dialogSize; + private int DEFAULT_WIDTH = 750; + private int DEFAULT_HEIGHT = 800; + + public OpenLogDialog(Shell parentShell, File logFile) { + super(parentShell); + this.logFile = logFile; + setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN | SWT.MODELESS); + + } + + /* + * (non-Javadoc) Method declared on Window. + */ + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + newShell.setText(Messages.OpenLogDialog_title); + readConfiguration(); + } + + /* + * (non-Javadoc) Method declared on Dialog. + */ + protected void createButtonsForButtonBar(Composite parent) { + createButton(parent, IDialogConstants.CLOSE_ID, IDialogConstants.CLOSE_LABEL, true); + } + + public void create() { + super.create(); + // dialog location + if (dialogLocation != null) + getShell().setLocation(dialogLocation); + // dialog size + if (dialogSize != null) + getShell().setSize(dialogSize); + else + getShell().setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); + getButton(IDialogConstants.CLOSE_ID).setFocus(); + } + + /* + * (non-Javadoc) Method declared on Dialog. + */ + protected Control createDialogArea(Composite parent) { + Composite outer = (Composite) super.createDialogArea(parent); + Text text = new Text(outer, SWT.MULTI | SWT.BORDER | SWT.READ_ONLY | SWT.V_SCROLL | SWT.NO_FOCUS | SWT.H_SCROLL); + text.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); + GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL); + gridData.grabExcessVerticalSpace = true; + gridData.grabExcessHorizontalSpace = true; + text.setLayoutData(gridData); + text.setText(getLogSummary()); + return outer; + } + + private String getLogSummary() { + StringWriter out = new StringWriter(); + PrintWriter writer = new PrintWriter(out); + if (logFile.length() > LogReader.MAX_FILE_LENGTH) { + readLargeFileWithMonitor(writer); + } else { + readFileWithMonitor(writer); + } + writer.close(); + return out.toString(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int) + */ + protected void buttonPressed(int buttonId) { + if (buttonId == IDialogConstants.CLOSE_ID) { + storeSettings(); + close(); + } + super.buttonPressed(buttonId); + } + + //--------------- configuration handling -------------- + /** + * Stores the current state in the dialog settings. + * + * @since 2.0 + */ + private void storeSettings() { + writeConfiguration(); + } + + /** + * Returns the dialog settings object used to share state between several + * event detail dialogs. + * + * @return the dialog settings to be used + */ + private IDialogSettings getDialogSettings() { + IDialogSettings settings = Activator.getDefault().getDialogSettings(); + dialogSettings = settings.getSection(getClass().getName()); + if (dialogSettings == null) + dialogSettings = settings.addNewSection(getClass().getName()); + return dialogSettings; + } + + /** + * Initializes itself from the dialog settings with the same state as at the + * previous invocation. + */ + private void readConfiguration() { + IDialogSettings s = getDialogSettings(); + try { + int x = s.getInt("x"); //$NON-NLS-1$ + int y = s.getInt("y"); //$NON-NLS-1$ + dialogLocation = new Point(x, y); + x = s.getInt("width"); //$NON-NLS-1$ + y = s.getInt("height"); //$NON-NLS-1$ + dialogSize = new Point(x, y); + } catch (NumberFormatException e) { + dialogLocation = null; + dialogSize = null; + } + } + + private void writeConfiguration() { + IDialogSettings s = getDialogSettings(); + Point location = getShell().getLocation(); + s.put("x", location.x); //$NON-NLS-1$ + s.put("y", location.y); //$NON-NLS-1$ + Point size = getShell().getSize(); + s.put("width", size.x); //$NON-NLS-1$ + s.put("height", size.y); //$NON-NLS-1$ + } + + // reading file within MAX_FILE_LENGTH size + void readFile(PrintWriter writer) throws FileNotFoundException, IOException { + try (BufferedReader bReader = new BufferedReader(new FileReader(logFile))) { + while (bReader.ready()) + writer.println(bReader.readLine()); + } + } + + // reading large files + void readLargeFile(PrintWriter writer) throws FileNotFoundException, IOException { + RandomAccessFile random = null; + boolean hasStarted = false; + try { + random = new RandomAccessFile(logFile, "r"); //$NON-NLS-1$ + random.seek(logFile.length() - LogReader.MAX_FILE_LENGTH); + for (;;) { + String line = random.readLine(); + if (line == null) + break; + line = line.trim(); + if (line.length() == 0) + continue; + if (!hasStarted && (line.startsWith("!ENTRY") || line.startsWith("!SESSION"))) //$NON-NLS-1$ //$NON-NLS-2$ + hasStarted = true; + if (hasStarted) + writer.println(line); + continue; + } + } finally { + try { + if (random != null) + random.close(); + } catch (IOException e1) { // do nothing + } + } + } + + private void readLargeFileWithMonitor(final PrintWriter writer) { + IRunnableWithProgress runnable = new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) { + monitor.beginTask(Messages.OpenLogDialog_message, IProgressMonitor.UNKNOWN); + try { + readLargeFile(writer); + } catch (IOException e) { + writer.println(Messages.OpenLogDialog_cannotDisplay); + } + } + }; + ProgressMonitorDialog dialog = new ProgressMonitorDialog(getParentShell()); + try { + dialog.run(true, true, runnable); + } catch (InvocationTargetException e) { // do nothing + } catch (InterruptedException e) { // do nothing + } + } + + private void readFileWithMonitor(final PrintWriter writer) { + IRunnableWithProgress runnable = new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) { + monitor.beginTask(Messages.OpenLogDialog_message, IProgressMonitor.UNKNOWN); + try { + readFile(writer); + } catch (IOException e) { + writer.println(Messages.OpenLogDialog_cannotDisplay); + } + } + }; + ProgressMonitorDialog dialog = new ProgressMonitorDialog(getParentShell()); + try { + dialog.run(true, true, runnable); + } catch (InvocationTargetException e) { // do nothing + } catch (InterruptedException e) { // do nothing + } + } +}