1 11 12 package org.eclipse.pde.internal.runtime.logview; 13 14 import java.io.BufferedReader ; 15 import java.io.File ; 16 import java.io.FileNotFoundException ; 17 import java.io.FileReader ; 18 import java.io.IOException ; 19 import java.io.PrintWriter ; 20 import java.io.RandomAccessFile ; 21 import java.io.StringWriter ; 22 import java.lang.reflect.InvocationTargetException ; 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 43 public final class OpenLogDialog extends TrayDialog { 44 private File logFile; 46 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 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 63 protected void configureShell(Shell newShell) { 64 super.configureShell(newShell); 65 newShell.setText(PDERuntimeMessages.OpenLogDialog_title); 66 readConfiguration(); 67 } 68 69 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 if (dialogLocation != null) 81 getShell().setLocation(dialogLocation); 82 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 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 getLogSummary() { 108 StringWriter out = new StringWriter (); 109 PrintWriter writer = new PrintWriter (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 124 protected void buttonPressed(int buttonId) { 125 if (buttonId == IDialogConstants.CLOSE_ID) { 126 storeSettings(); 127 close(); 128 } 129 super.buttonPressed(buttonId); 130 } 131 132 138 private void storeSettings() { 139 writeConfiguration(); 140 } 141 142 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 160 private void readConfiguration() { 161 IDialogSettings s = getDialogSettings(); 162 try { 163 int x = s.getInt("x"); int y = s.getInt("y"); dialogLocation = new Point(x, y); 166 x = s.getInt("width"); y = s.getInt("height"); dialogSize = new Point(x, y); 169 } catch (NumberFormatException 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); s.put("y", location.y); Point size = getShell().getSize(); 181 s.put("width", size.x); s.put("height", size.y); } 184 185 private void readFile(PrintWriter writer) throws FileNotFoundException , IOException { 187 BufferedReader bReader = new BufferedReader (new FileReader (logFile)); 188 while (bReader.ready()) 189 writer.println(bReader.readLine()); 190 } 191 192 private void readLargeFile(PrintWriter writer) throws FileNotFoundException , 194 IOException { 195 RandomAccessFile random = null; 196 boolean hasStarted = false; 197 try { 198 random = new RandomAccessFile (logFile, "r"); random.seek(logFile.length() - LogReader.MAX_FILE_LENGTH); 200 for (;;) { 201 String 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"))) 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 e1) { 219 } 220 } 221 } 222 223 private void readLargeFileWithMonitor(final PrintWriter writer) { 224 IRunnableWithProgress runnable = new IRunnableWithProgress() { 225 public void run(IProgressMonitor monitor) throws InvocationTargetException , 226 InterruptedException { 227 monitor 228 .beginTask( 229 PDERuntimeMessages.OpenLogDialog_message, IProgressMonitor.UNKNOWN); 230 try { 231 readLargeFile(writer); 232 } catch (IOException 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 e) { 241 } catch (InterruptedException e) { 242 } 243 } 244 245 private void readFileWithMonitor(final PrintWriter writer) { 246 IRunnableWithProgress runnable = new IRunnableWithProgress() { 247 public void run(IProgressMonitor monitor) throws InvocationTargetException , 248 InterruptedException { 249 monitor 250 .beginTask( 251 PDERuntimeMessages.OpenLogDialog_message, IProgressMonitor.UNKNOWN); 252 try { 253 readFile(writer); 254 } catch (IOException 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 e) { 263 } catch (InterruptedException e) { 264 } 265 } 266 } 267 | Popular Tags |