KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > pde > internal > runtime > logview > OpenLogDialog


1 /*******************************************************************************
2  * Copyright (c) 2003, 2007 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11
12 package org.eclipse.pde.internal.runtime.logview;
13
14 import java.io.BufferedReader JavaDoc;
15 import java.io.File JavaDoc;
16 import java.io.FileNotFoundException JavaDoc;
17 import java.io.FileReader JavaDoc;
18 import java.io.IOException JavaDoc;
19 import java.io.PrintWriter JavaDoc;
20 import java.io.RandomAccessFile JavaDoc;
21 import java.io.StringWriter JavaDoc;
22 import java.lang.reflect.InvocationTargetException JavaDoc;
23
24 import org.eclipse.core.runtime.IProgressMonitor;
25 import org.eclipse.jface.dialogs.IDialogConstants;
26 import org.eclipse.jface.dialogs.IDialogSettings;
27 import org.eclipse.jface.dialogs.ProgressMonitorDialog;
28 import org.eclipse.jface.dialogs.TrayDialog;
29 import org.eclipse.jface.operation.IRunnableWithProgress;
30 import org.eclipse.pde.internal.runtime.PDERuntimeMessages;
31 import org.eclipse.pde.internal.runtime.PDERuntimePlugin;
32 import org.eclipse.swt.SWT;
33 import org.eclipse.swt.graphics.Point;
34 import org.eclipse.swt.layout.GridData;
35 import org.eclipse.swt.widgets.Composite;
36 import org.eclipse.swt.widgets.Control;
37 import org.eclipse.swt.widgets.Shell;
38 import org.eclipse.swt.widgets.Text;
39
40 /**
41  * Displays the error log in non-Win32 platforms - see bug 55314.
42  */

43 public final class OpenLogDialog extends TrayDialog {
44     // input log file
45
private File JavaDoc logFile;
46     // location/size configuration
47
private IDialogSettings dialogSettings;
48     private Point dialogLocation;
49     private Point dialogSize;
50     private int DEFAULT_WIDTH = 750;
51     private int DEFAULT_HEIGHT = 800;
52
53     public OpenLogDialog(Shell parentShell, File JavaDoc logFile) {
54         super(parentShell);
55         this.logFile = logFile;
56         setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN | SWT.MODELESS);
57
58     }
59
60     /*
61      * (non-Javadoc) Method declared on Window.
62      */

63     protected void configureShell(Shell newShell) {
64         super.configureShell(newShell);
65         newShell.setText(PDERuntimeMessages.OpenLogDialog_title);
66         readConfiguration();
67     }
68
69     /*
70      * (non-Javadoc) Method declared on Dialog.
71      */

72     protected void createButtonsForButtonBar(Composite parent) {
73         createButton(parent, IDialogConstants.CLOSE_ID, IDialogConstants.CLOSE_LABEL,
74                 true);
75     }
76
77     public void create() {
78         super.create();
79         // dialog location
80
if (dialogLocation != null)
81             getShell().setLocation(dialogLocation);
82         // dialog size
83
if (dialogSize != null)
84             getShell().setSize(dialogSize);
85         else
86             getShell().setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
87         getButton(IDialogConstants.CLOSE_ID).setFocus();
88     }
89
90     /*
91      * (non-Javadoc) Method declared on Dialog.
92      */

93     protected Control createDialogArea(Composite parent) {
94         Composite outer = (Composite) super.createDialogArea(parent);
95         Text text = new Text(outer, SWT.MULTI | SWT.BORDER | SWT.READ_ONLY | SWT.V_SCROLL
96                 | SWT.NO_FOCUS | SWT.H_SCROLL);
97         text.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
98         GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL
99                 | GridData.VERTICAL_ALIGN_FILL);
100         gridData.grabExcessVerticalSpace = true;
101         gridData.grabExcessHorizontalSpace = true;
102         text.setLayoutData(gridData);
103         text.setText(getLogSummary());
104         return outer;
105     }
106
107     private String JavaDoc getLogSummary() {
108         StringWriter JavaDoc out = new StringWriter JavaDoc();
109         PrintWriter JavaDoc writer = new PrintWriter JavaDoc(out);
110         if (logFile.length() > LogReader.MAX_FILE_LENGTH) {
111             readLargeFileWithMonitor(writer);
112         } else {
113             readFileWithMonitor(writer);
114         }
115         writer.close();
116         return out.toString();
117     }
118
119     /*
120      * (non-Javadoc)
121      *
122      * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
123      */

124     protected void buttonPressed(int buttonId) {
125         if (buttonId == IDialogConstants.CLOSE_ID) {
126             storeSettings();
127             close();
128         }
129         super.buttonPressed(buttonId);
130     }
131
132     //--------------- configuration handling --------------
133
/**
134      * Stores the current state in the dialog settings.
135      *
136      * @since 2.0
137      */

138     private void storeSettings() {
139         writeConfiguration();
140     }
141
142     /**
143      * Returns the dialog settings object used to share state between several
144      * event detail dialogs.
145      *
146      * @return the dialog settings to be used
147      */

148     private IDialogSettings getDialogSettings() {
149         IDialogSettings settings = PDERuntimePlugin.getDefault().getDialogSettings();
150         dialogSettings = settings.getSection(getClass().getName());
151         if (dialogSettings == null)
152             dialogSettings = settings.addNewSection(getClass().getName());
153         return dialogSettings;
154     }
155
156     /**
157      * Initializes itself from the dialog settings with the same state as at the
158      * previous invocation.
159      */

160     private void readConfiguration() {
161         IDialogSettings s = getDialogSettings();
162         try {
163             int x = s.getInt("x"); //$NON-NLS-1$
164
int y = s.getInt("y"); //$NON-NLS-1$
165
dialogLocation = new Point(x, y);
166             x = s.getInt("width"); //$NON-NLS-1$
167
y = s.getInt("height"); //$NON-NLS-1$
168
dialogSize = new Point(x, y);
169         } catch (NumberFormatException JavaDoc e) {
170             dialogLocation = null;
171             dialogSize = null;
172         }
173     }
174
175     private void writeConfiguration() {
176         IDialogSettings s = getDialogSettings();
177         Point location = getShell().getLocation();
178         s.put("x", location.x); //$NON-NLS-1$
179
s.put("y", location.y); //$NON-NLS-1$
180
Point size = getShell().getSize();
181         s.put("width", size.x); //$NON-NLS-1$
182
s.put("height", size.y); //$NON-NLS-1$
183
}
184
185     // reading file within MAX_FILE_LENGTH size
186
private void readFile(PrintWriter JavaDoc writer) throws FileNotFoundException JavaDoc, IOException JavaDoc {
187         BufferedReader JavaDoc bReader = new BufferedReader JavaDoc(new FileReader JavaDoc(logFile));
188         while (bReader.ready())
189             writer.println(bReader.readLine());
190     }
191
192     // reading large files
193
private void readLargeFile(PrintWriter JavaDoc writer) throws FileNotFoundException JavaDoc,
194             IOException JavaDoc {
195         RandomAccessFile JavaDoc random = null;
196         boolean hasStarted = false;
197         try {
198             random = new RandomAccessFile JavaDoc(logFile, "r"); //$NON-NLS-1$
199
random.seek(logFile.length() - LogReader.MAX_FILE_LENGTH);
200             for (;;) {
201                 String JavaDoc line = random.readLine();
202                 if (line == null)
203                     break;
204                 line = line.trim();
205                 if (line.length() == 0)
206                     continue;
207                 if (!hasStarted
208                         && (line.startsWith("!ENTRY") || line.startsWith("!SESSION"))) //$NON-NLS-1$ //$NON-NLS-2$
209
hasStarted = true;
210                 if (hasStarted)
211                     writer.println(line);
212                 continue;
213             }
214         } finally {
215             try {
216                 if (random != null)
217                     random.close();
218             } catch (IOException JavaDoc e1) {
219             }
220         }
221     }
222
223     private void readLargeFileWithMonitor(final PrintWriter JavaDoc writer) {
224         IRunnableWithProgress runnable = new IRunnableWithProgress() {
225             public void run(IProgressMonitor monitor) throws InvocationTargetException JavaDoc,
226                     InterruptedException JavaDoc {
227                 monitor
228                         .beginTask(
229                                 PDERuntimeMessages.OpenLogDialog_message, IProgressMonitor.UNKNOWN);
230                 try {
231                     readLargeFile(writer);
232                 } catch (IOException JavaDoc e) {
233                     writer.println(PDERuntimeMessages.OpenLogDialog_cannotDisplay);
234                 }
235             }
236         };
237         ProgressMonitorDialog dialog = new ProgressMonitorDialog(getParentShell());
238         try {
239             dialog.run(true, true, runnable);
240         } catch (InvocationTargetException JavaDoc e) {
241         } catch (InterruptedException JavaDoc e) {
242         }
243     }
244
245     private void readFileWithMonitor(final PrintWriter JavaDoc writer) {
246         IRunnableWithProgress runnable = new IRunnableWithProgress() {
247             public void run(IProgressMonitor monitor) throws InvocationTargetException JavaDoc,
248                     InterruptedException JavaDoc {
249                 monitor
250                         .beginTask(
251                                 PDERuntimeMessages.OpenLogDialog_message, IProgressMonitor.UNKNOWN);
252                 try {
253                     readFile(writer);
254                 } catch (IOException JavaDoc e) {
255                     writer.println(PDERuntimeMessages.OpenLogDialog_cannotDisplay);
256                 }
257             }
258         };
259         ProgressMonitorDialog dialog = new ProgressMonitorDialog(getParentShell());
260         try {
261             dialog.run(true, true, runnable);
262         } catch (InvocationTargetException JavaDoc e) {
263         } catch (InterruptedException JavaDoc e) {
264         }
265     }
266 }
267
Popular Tags