diff options
Diffstat (limited to 'ddms/libs/ddmuilib/src/com/android/ddmuilib/log/event/EventLogPanel.java')
-rw-r--r-- | ddms/libs/ddmuilib/src/com/android/ddmuilib/log/event/EventLogPanel.java | 938 |
1 files changed, 0 insertions, 938 deletions
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/log/event/EventLogPanel.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/log/event/EventLogPanel.java deleted file mode 100644 index 937ee40..0000000 --- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/log/event/EventLogPanel.java +++ /dev/null @@ -1,938 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.ddmuilib.log.event; - -import com.android.ddmlib.Client; -import com.android.ddmlib.IDevice; -import com.android.ddmlib.Log; -import com.android.ddmlib.Log.LogLevel; -import com.android.ddmlib.log.EventContainer; -import com.android.ddmlib.log.EventLogParser; -import com.android.ddmlib.log.LogReceiver; -import com.android.ddmlib.log.LogReceiver.ILogListener; -import com.android.ddmlib.log.LogReceiver.LogEntry; -import com.android.ddmuilib.DdmUiPreferences; -import com.android.ddmuilib.TablePanel; -import com.android.ddmuilib.actions.ICommonAction; -import com.android.ddmuilib.annotation.UiThread; -import com.android.ddmuilib.annotation.WorkerThread; -import com.android.ddmuilib.log.event.EventDisplay.ILogColumnListener; - -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.swt.SWT; -import org.eclipse.swt.SWTException; -import org.eclipse.swt.custom.ScrolledComposite; -import org.eclipse.swt.events.ControlAdapter; -import org.eclipse.swt.events.ControlEvent; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.RowData; -import org.eclipse.swt.layout.RowLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.regex.Pattern; - -/** - * Event log viewer - */ -public class EventLogPanel extends TablePanel implements ILogListener, - ILogColumnListener { - - private final static String TAG_FILE_EXT = ".tag"; //$NON-NLS-1$ - - private final static String PREFS_EVENT_DISPLAY = "EventLogPanel.eventDisplay"; //$NON-NLS-1$ - private final static String EVENT_DISPLAY_STORAGE_SEPARATOR = "|"; //$NON-NLS-1$ - - static final String PREFS_DISPLAY_WIDTH = "EventLogPanel.width"; //$NON-NLS-1$ - static final String PREFS_DISPLAY_HEIGHT = "EventLogPanel.height"; //$NON-NLS-1$ - - private final static int DEFAULT_DISPLAY_WIDTH = 500; - private final static int DEFAULT_DISPLAY_HEIGHT = 400; - - private IDevice mCurrentLoggedDevice; - private String mCurrentLogFile; - private LogReceiver mCurrentLogReceiver; - private EventLogParser mCurrentEventLogParser; - - private Object mLock = new Object(); - - /** list of all the events. */ - private final ArrayList<EventContainer> mEvents = new ArrayList<EventContainer>(); - - /** list of all the new events, that have yet to be displayed by the ui */ - private final ArrayList<EventContainer> mNewEvents = new ArrayList<EventContainer>(); - /** indicates a pending ui thread display */ - private boolean mPendingDisplay = false; - - /** list of all the custom event displays */ - private final ArrayList<EventDisplay> mEventDisplays = new ArrayList<EventDisplay>(); - - private final NumberFormat mFormatter = NumberFormat.getInstance(); - private Composite mParent; - private ScrolledComposite mBottomParentPanel; - private Composite mBottomPanel; - private ICommonAction mOptionsAction; - private ICommonAction mClearAction; - private ICommonAction mSaveAction; - private ICommonAction mLoadAction; - private ICommonAction mImportAction; - - /** file containing the current log raw data. */ - private File mTempFile = null; - - public EventLogPanel() { - super(); - mFormatter.setGroupingUsed(true); - } - - /** - * Sets the external actions. - * <p/>This method sets up the {@link ICommonAction} objects to execute the proper code - * when triggered by using {@link ICommonAction#setRunnable(Runnable)}. - * <p/>It will also make sure they are enabled only when possible. - * @param optionsAction - * @param clearAction - * @param saveAction - * @param loadAction - * @param importAction - */ - public void setActions(ICommonAction optionsAction, ICommonAction clearAction, - ICommonAction saveAction, ICommonAction loadAction, ICommonAction importAction) { - mOptionsAction = optionsAction; - mOptionsAction.setRunnable(new Runnable() { - @Override - public void run() { - openOptionPanel(); - } - }); - - mClearAction = clearAction; - mClearAction.setRunnable(new Runnable() { - @Override - public void run() { - clearLog(); - } - }); - - mSaveAction = saveAction; - mSaveAction.setRunnable(new Runnable() { - @Override - public void run() { - try { - FileDialog fileDialog = new FileDialog(mParent.getShell(), SWT.SAVE); - - fileDialog.setText("Save Event Log"); - fileDialog.setFileName("event.log"); - - String fileName = fileDialog.open(); - if (fileName != null) { - saveLog(fileName); - } - } catch (IOException e1) { - } - } - }); - - mLoadAction = loadAction; - mLoadAction.setRunnable(new Runnable() { - @Override - public void run() { - FileDialog fileDialog = new FileDialog(mParent.getShell(), SWT.OPEN); - - fileDialog.setText("Load Event Log"); - - String fileName = fileDialog.open(); - if (fileName != null) { - loadLog(fileName); - } - } - }); - - mImportAction = importAction; - mImportAction.setRunnable(new Runnable() { - @Override - public void run() { - FileDialog fileDialog = new FileDialog(mParent.getShell(), SWT.OPEN); - - fileDialog.setText("Import Bug Report"); - - String fileName = fileDialog.open(); - if (fileName != null) { - importBugReport(fileName); - } - } - }); - - mOptionsAction.setEnabled(false); - mClearAction.setEnabled(false); - mSaveAction.setEnabled(false); - } - - /** - * Opens the option panel. - * </p> - * <b>This must be called from the UI thread</b> - */ - @UiThread - public void openOptionPanel() { - try { - EventDisplayOptions dialog = new EventDisplayOptions(mParent.getShell()); - if (dialog.open(mCurrentEventLogParser, mEventDisplays, mEvents)) { - synchronized (mLock) { - // get the new EventDisplay list - mEventDisplays.clear(); - mEventDisplays.addAll(dialog.getEventDisplays()); - - // since the list of EventDisplay changed, we store it. - saveEventDisplays(); - - rebuildUi(); - } - } - } catch (SWTException e) { - Log.e("EventLog", e); //$NON-NLS-1$ - } - } - - /** - * Clears the log. - * <p/> - * <b>This must be called from the UI thread</b> - */ - public void clearLog() { - try { - synchronized (mLock) { - mEvents.clear(); - mNewEvents.clear(); - mPendingDisplay = false; - for (EventDisplay eventDisplay : mEventDisplays) { - eventDisplay.resetUI(); - } - } - } catch (SWTException e) { - Log.e("EventLog", e); //$NON-NLS-1$ - } - } - - /** - * Saves the content of the event log into a file. The log is saved in the same - * binary format than on the device. - * @param filePath - * @throws IOException - */ - public void saveLog(String filePath) throws IOException { - if (mCurrentLoggedDevice != null && mCurrentEventLogParser != null) { - File destFile = new File(filePath); - destFile.createNewFile(); - FileInputStream fis = new FileInputStream(mTempFile); - FileOutputStream fos = new FileOutputStream(destFile); - byte[] buffer = new byte[1024]; - - int count; - - while ((count = fis.read(buffer)) != -1) { - fos.write(buffer, 0, count); - } - - fos.close(); - fis.close(); - - // now we save the tag file - filePath = filePath + TAG_FILE_EXT; - mCurrentEventLogParser.saveTags(filePath); - } - } - - /** - * Loads a binary event log (if has associated .tag file) or - * otherwise loads a textual event log. - * @param filePath Event log path (and base of potential tag file) - */ - public void loadLog(String filePath) { - if ((new File(filePath + TAG_FILE_EXT)).exists()) { - startEventLogFromFiles(filePath); - } else { - try { - EventLogImporter importer = new EventLogImporter(filePath); - String[] tags = importer.getTags(); - String[] log = importer.getLog(); - startEventLogFromContent(tags, log); - } catch (FileNotFoundException e) { - // If this fails, display the error message from startEventLogFromFiles, - // and pretend we never tried EventLogImporter - Log.logAndDisplay(Log.LogLevel.ERROR, "EventLog", - String.format("Failure to read %1$s", filePath + TAG_FILE_EXT)); - } - - } - } - - public void importBugReport(String filePath) { - try { - BugReportImporter importer = new BugReportImporter(filePath); - - String[] tags = importer.getTags(); - String[] log = importer.getLog(); - - startEventLogFromContent(tags, log); - - } catch (FileNotFoundException e) { - Log.logAndDisplay(LogLevel.ERROR, "Import", - "Unable to import bug report: " + e.getMessage()); - } - } - - /* (non-Javadoc) - * @see com.android.ddmuilib.SelectionDependentPanel#clientSelected() - */ - @Override - public void clientSelected() { - // pass - } - - /* (non-Javadoc) - * @see com.android.ddmuilib.SelectionDependentPanel#deviceSelected() - */ - @Override - public void deviceSelected() { - startEventLog(getCurrentDevice()); - } - - /* - * (non-Javadoc) - * @see com.android.ddmlib.AndroidDebugBridge.IClientChangeListener#clientChanged(com.android.ddmlib.Client, int) - */ - @Override - public void clientChanged(Client client, int changeMask) { - // pass - } - - /* (non-Javadoc) - * @see com.android.ddmuilib.Panel#createControl(org.eclipse.swt.widgets.Composite) - */ - @Override - protected Control createControl(Composite parent) { - mParent = parent; - mParent.addDisposeListener(new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - synchronized (mLock) { - if (mCurrentLogReceiver != null) { - mCurrentLogReceiver.cancel(); - mCurrentLogReceiver = null; - mCurrentEventLogParser = null; - mCurrentLoggedDevice = null; - mEventDisplays.clear(); - mEvents.clear(); - } - } - } - }); - - final IPreferenceStore store = DdmUiPreferences.getStore(); - - // init some store stuff - store.setDefault(PREFS_DISPLAY_WIDTH, DEFAULT_DISPLAY_WIDTH); - store.setDefault(PREFS_DISPLAY_HEIGHT, DEFAULT_DISPLAY_HEIGHT); - - mBottomParentPanel = new ScrolledComposite(parent, SWT.V_SCROLL); - mBottomParentPanel.setLayoutData(new GridData(GridData.FILL_BOTH)); - mBottomParentPanel.setExpandHorizontal(true); - mBottomParentPanel.setExpandVertical(true); - - mBottomParentPanel.addControlListener(new ControlAdapter() { - @Override - public void controlResized(ControlEvent e) { - if (mBottomPanel != null) { - Rectangle r = mBottomParentPanel.getClientArea(); - mBottomParentPanel.setMinSize(mBottomPanel.computeSize(r.width, - SWT.DEFAULT)); - } - } - }); - - prepareDisplayUi(); - - // load the EventDisplay from storage. - loadEventDisplays(); - - // create the ui - createDisplayUi(); - - return mBottomParentPanel; - } - - /* (non-Javadoc) - * @see com.android.ddmuilib.Panel#postCreation() - */ - @Override - protected void postCreation() { - // pass - } - - /* (non-Javadoc) - * @see com.android.ddmuilib.Panel#setFocus() - */ - @Override - public void setFocus() { - mBottomParentPanel.setFocus(); - } - - /** - * Starts a new logcat and set mCurrentLogCat as the current receiver. - * @param device the device to connect logcat to. - */ - private void startEventLog(final IDevice device) { - if (device == mCurrentLoggedDevice) { - return; - } - - // if we have a logcat already running - if (mCurrentLogReceiver != null) { - stopEventLog(false); - } - mCurrentLoggedDevice = null; - mCurrentLogFile = null; - - if (device != null) { - // create a new output receiver - mCurrentLogReceiver = new LogReceiver(this); - - // start the logcat in a different thread - new Thread("EventLog") { //$NON-NLS-1$ - @Override - public void run() { - while (device.isOnline() == false && - mCurrentLogReceiver != null && - mCurrentLogReceiver.isCancelled() == false) { - try { - sleep(2000); - } catch (InterruptedException e) { - return; - } - } - - if (mCurrentLogReceiver == null || mCurrentLogReceiver.isCancelled()) { - // logcat was stopped/cancelled before the device became ready. - return; - } - - try { - mCurrentLoggedDevice = device; - synchronized (mLock) { - mCurrentEventLogParser = new EventLogParser(); - mCurrentEventLogParser.init(device); - } - - // update the event display with the new parser. - updateEventDisplays(); - - // prepare the temp file that will contain the raw data - mTempFile = File.createTempFile("android-event-", ".log"); - - device.runEventLogService(mCurrentLogReceiver); - } catch (Exception e) { - Log.e("EventLog", e); - } finally { - } - } - }.start(); - } - } - - private void startEventLogFromFiles(final String fileName) { - // if we have a logcat already running - if (mCurrentLogReceiver != null) { - stopEventLog(false); - } - mCurrentLoggedDevice = null; - mCurrentLogFile = null; - - // create a new output receiver - mCurrentLogReceiver = new LogReceiver(this); - - mSaveAction.setEnabled(false); - - // start the logcat in a different thread - new Thread("EventLog") { //$NON-NLS-1$ - @Override - public void run() { - try { - mCurrentLogFile = fileName; - synchronized (mLock) { - mCurrentEventLogParser = new EventLogParser(); - if (mCurrentEventLogParser.init(fileName + TAG_FILE_EXT) == false) { - mCurrentEventLogParser = null; - Log.logAndDisplay(LogLevel.ERROR, "EventLog", - String.format("Failure to read %1$s", fileName + TAG_FILE_EXT)); - return; - } - } - - // update the event display with the new parser. - updateEventDisplays(); - - runLocalEventLogService(fileName, mCurrentLogReceiver); - } catch (Exception e) { - Log.e("EventLog", e); - } finally { - } - } - }.start(); - } - - private void startEventLogFromContent(final String[] tags, final String[] log) { - // if we have a logcat already running - if (mCurrentLogReceiver != null) { - stopEventLog(false); - } - mCurrentLoggedDevice = null; - mCurrentLogFile = null; - - // create a new output receiver - mCurrentLogReceiver = new LogReceiver(this); - - mSaveAction.setEnabled(false); - - // start the logcat in a different thread - new Thread("EventLog") { //$NON-NLS-1$ - @Override - public void run() { - try { - synchronized (mLock) { - mCurrentEventLogParser = new EventLogParser(); - if (mCurrentEventLogParser.init(tags) == false) { - mCurrentEventLogParser = null; - return; - } - } - - // update the event display with the new parser. - updateEventDisplays(); - - runLocalEventLogService(log, mCurrentLogReceiver); - } catch (Exception e) { - Log.e("EventLog", e); - } finally { - } - } - }.start(); - } - - - public void stopEventLog(boolean inUiThread) { - if (mCurrentLogReceiver != null) { - mCurrentLogReceiver.cancel(); - - // when the thread finishes, no one will reference that object - // and it'll be destroyed - synchronized (mLock) { - mCurrentLogReceiver = null; - mCurrentEventLogParser = null; - - mCurrentLoggedDevice = null; - mEvents.clear(); - mNewEvents.clear(); - mPendingDisplay = false; - } - - resetUI(inUiThread); - } - - if (mTempFile != null) { - mTempFile.delete(); - mTempFile = null; - } - } - - private void resetUI(boolean inUiThread) { - mEvents.clear(); - - // the ui is static we just empty it. - if (inUiThread) { - resetUiFromUiThread(); - } else { - try { - Display d = mBottomParentPanel.getDisplay(); - - // run sync as we need to update right now. - d.syncExec(new Runnable() { - @Override - public void run() { - if (mBottomParentPanel.isDisposed() == false) { - resetUiFromUiThread(); - } - } - }); - } catch (SWTException e) { - // display is disposed, we're quitting. Do nothing. - } - } - } - - private void resetUiFromUiThread() { - synchronized (mLock) { - for (EventDisplay eventDisplay : mEventDisplays) { - eventDisplay.resetUI(); - } - } - mOptionsAction.setEnabled(false); - mClearAction.setEnabled(false); - mSaveAction.setEnabled(false); - } - - private void prepareDisplayUi() { - mBottomPanel = new Composite(mBottomParentPanel, SWT.NONE); - mBottomParentPanel.setContent(mBottomPanel); - } - - private void createDisplayUi() { - RowLayout rowLayout = new RowLayout(); - rowLayout.wrap = true; - rowLayout.pack = false; - rowLayout.justify = true; - rowLayout.fill = true; - rowLayout.type = SWT.HORIZONTAL; - mBottomPanel.setLayout(rowLayout); - - IPreferenceStore store = DdmUiPreferences.getStore(); - int displayWidth = store.getInt(PREFS_DISPLAY_WIDTH); - int displayHeight = store.getInt(PREFS_DISPLAY_HEIGHT); - - for (EventDisplay eventDisplay : mEventDisplays) { - Control c = eventDisplay.createComposite(mBottomPanel, mCurrentEventLogParser, this); - if (c != null) { - RowData rd = new RowData(); - rd.height = displayHeight; - rd.width = displayWidth; - c.setLayoutData(rd); - } - - Table table = eventDisplay.getTable(); - if (table != null) { - addTableToFocusListener(table); - } - } - - mBottomPanel.layout(); - mBottomParentPanel.setMinSize(mBottomPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT)); - mBottomParentPanel.layout(); - } - - /** - * Rebuild the display ui. - */ - @UiThread - private void rebuildUi() { - synchronized (mLock) { - // we need to rebuild the ui. First we get rid of it. - mBottomPanel.dispose(); - mBottomPanel = null; - - prepareDisplayUi(); - createDisplayUi(); - - // and fill it - - boolean start_event = false; - synchronized (mNewEvents) { - mNewEvents.addAll(0, mEvents); - - if (mPendingDisplay == false) { - mPendingDisplay = true; - start_event = true; - } - } - - if (start_event) { - scheduleUIEventHandler(); - } - - Rectangle r = mBottomParentPanel.getClientArea(); - mBottomParentPanel.setMinSize(mBottomPanel.computeSize(r.width, - SWT.DEFAULT)); - } - } - - - /** - * Processes a new {@link LogEntry} by parsing it with {@link EventLogParser} and displaying it. - * @param entry The new log entry - * @see LogReceiver.ILogListener#newEntry(LogEntry) - */ - @Override - @WorkerThread - public void newEntry(LogEntry entry) { - synchronized (mLock) { - if (mCurrentEventLogParser != null) { - EventContainer event = mCurrentEventLogParser.parse(entry); - if (event != null) { - handleNewEvent(event); - } - } - } - } - - @WorkerThread - private void handleNewEvent(EventContainer event) { - // add the event to the generic list - mEvents.add(event); - - // add to the list of events that needs to be displayed, and trigger a - // new display if needed. - boolean start_event = false; - synchronized (mNewEvents) { - mNewEvents.add(event); - - if (mPendingDisplay == false) { - mPendingDisplay = true; - start_event = true; - } - } - - if (start_event == false) { - // we're done - return; - } - - scheduleUIEventHandler(); - } - - /** - * Schedules the UI thread to execute a {@link Runnable} calling {@link #displayNewEvents()}. - */ - private void scheduleUIEventHandler() { - try { - Display d = mBottomParentPanel.getDisplay(); - d.asyncExec(new Runnable() { - @Override - public void run() { - if (mBottomParentPanel.isDisposed() == false) { - if (mCurrentEventLogParser != null) { - displayNewEvents(); - } - } - } - }); - } catch (SWTException e) { - // if the ui is disposed, do nothing - } - } - - /** - * Processes raw data coming from the log service. - * @see LogReceiver.ILogListener#newData(byte[], int, int) - */ - @Override - public void newData(byte[] data, int offset, int length) { - if (mTempFile != null) { - try { - FileOutputStream fos = new FileOutputStream(mTempFile, true /* append */); - fos.write(data, offset, length); - fos.close(); - } catch (FileNotFoundException e) { - } catch (IOException e) { - } - } - } - - @UiThread - private void displayNewEvents() { - // never display more than 1,000 events in this loop. We can't do too much in the UI thread. - int count = 0; - - // prepare the displays - for (EventDisplay eventDisplay : mEventDisplays) { - eventDisplay.startMultiEventDisplay(); - } - - // display the new events - EventContainer event = null; - boolean need_to_reloop = false; - do { - // get the next event to display. - synchronized (mNewEvents) { - if (mNewEvents.size() > 0) { - if (count > 200) { - // there are still events to be displayed, but we don't want to hog the - // UI thread for too long, so we stop this runnable, but launch a new - // one to keep going. - need_to_reloop = true; - event = null; - } else { - event = mNewEvents.remove(0); - count++; - } - } else { - // we're done. - event = null; - mPendingDisplay = false; - } - } - - if (event != null) { - // notify the event display - for (EventDisplay eventDisplay : mEventDisplays) { - eventDisplay.newEvent(event, mCurrentEventLogParser); - } - } - } while (event != null); - - // we're done displaying events. - for (EventDisplay eventDisplay : mEventDisplays) { - eventDisplay.endMultiEventDisplay(); - } - - // if needed, ask the UI thread to re-run this method. - if (need_to_reloop) { - scheduleUIEventHandler(); - } - } - - /** - * Loads the {@link EventDisplay}s from the preference store. - */ - private void loadEventDisplays() { - IPreferenceStore store = DdmUiPreferences.getStore(); - String storage = store.getString(PREFS_EVENT_DISPLAY); - - if (storage.length() > 0) { - String[] values = storage.split(Pattern.quote(EVENT_DISPLAY_STORAGE_SEPARATOR)); - - for (String value : values) { - EventDisplay eventDisplay = EventDisplay.load(value); - if (eventDisplay != null) { - mEventDisplays.add(eventDisplay); - } - } - } - } - - /** - * Saves the {@link EventDisplay}s into the {@link DdmUiPreferences} store. - */ - private void saveEventDisplays() { - IPreferenceStore store = DdmUiPreferences.getStore(); - - boolean first = true; - StringBuilder sb = new StringBuilder(); - - for (EventDisplay eventDisplay : mEventDisplays) { - String storage = eventDisplay.getStorageString(); - if (storage != null) { - if (first == false) { - sb.append(EVENT_DISPLAY_STORAGE_SEPARATOR); - } else { - first = false; - } - - sb.append(storage); - } - } - - store.setValue(PREFS_EVENT_DISPLAY, sb.toString()); - } - - /** - * Updates the {@link EventDisplay} with the new {@link EventLogParser}. - * <p/> - * This will run asynchronously in the UI thread. - */ - @WorkerThread - private void updateEventDisplays() { - try { - Display d = mBottomParentPanel.getDisplay(); - - d.asyncExec(new Runnable() { - @Override - public void run() { - if (mBottomParentPanel.isDisposed() == false) { - for (EventDisplay eventDisplay : mEventDisplays) { - eventDisplay.setNewLogParser(mCurrentEventLogParser); - } - - mOptionsAction.setEnabled(true); - mClearAction.setEnabled(true); - if (mCurrentLogFile == null) { - mSaveAction.setEnabled(true); - } else { - mSaveAction.setEnabled(false); - } - } - } - }); - } catch (SWTException e) { - // display is disposed: do nothing. - } - } - - @Override - @UiThread - public void columnResized(int index, TableColumn sourceColumn) { - for (EventDisplay eventDisplay : mEventDisplays) { - eventDisplay.resizeColumn(index, sourceColumn); - } - } - - /** - * Runs an event log service out of a local file. - * @param fileName the full file name of the local file containing the event log. - * @param logReceiver the receiver that will handle the log - * @throws IOException - */ - @WorkerThread - private void runLocalEventLogService(String fileName, LogReceiver logReceiver) - throws IOException { - byte[] buffer = new byte[256]; - - FileInputStream fis = new FileInputStream(fileName); - try { - int count; - while ((count = fis.read(buffer)) != -1) { - logReceiver.parseNewData(buffer, 0, count); - } - } finally { - fis.close(); - } - } - - @WorkerThread - private void runLocalEventLogService(String[] log, LogReceiver currentLogReceiver) { - synchronized (mLock) { - for (String line : log) { - EventContainer event = mCurrentEventLogParser.parse(line); - if (event != null) { - handleNewEvent(event); - } - } - } - } -} |