/* * Copyright (C) 2009 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.sdkuilib.internal.widgets; import com.android.sdklib.ISdkLog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import java.util.ArrayList; /** * Collects all log and displays it in a message box dialog. * <p/> * This is good if only a few lines of log are expected. * If you pass <var>logErrorsOnly</var> to the constructor, the message box * will be shown only if errors were generated, which is the typical use-case. * <p/> * To use this: </br> * - Construct a new {@link MessageBoxLog}. </br> * - Pass the logger to the action. </br> * - Once the action is completed, call {@link #displayResult(boolean)} * indicating whether the operation was successful or not. * * When <var>logErrorsOnly</var> is true, if the operation was not successful or errors * were generated, this will display the message box. */ public final class MessageBoxLog implements ISdkLog { final ArrayList<String> logMessages = new ArrayList<String>(); private final String mMessage; private final Display mDisplay; private final boolean mLogErrorsOnly; /** * Creates a logger that will capture all logs and eventually display them * in a simple message box. * * @param message * @param display * @param logErrorsOnly */ public MessageBoxLog(String message, Display display, boolean logErrorsOnly) { mMessage = message; mDisplay = display; mLogErrorsOnly = logErrorsOnly; } public void error(Throwable throwable, String errorFormat, Object... arg) { if (errorFormat != null) { logMessages.add(String.format("Error: " + errorFormat, arg)); } if (throwable != null) { logMessages.add(throwable.getMessage()); } } public void warning(String warningFormat, Object... arg) { if (!mLogErrorsOnly) { logMessages.add(String.format("Warning: " + warningFormat, arg)); } } public void printf(String msgFormat, Object... arg) { if (!mLogErrorsOnly) { logMessages.add(String.format(msgFormat, arg)); } } /** * Displays the log if anything was captured. * <p/> * @param success Used only when the logger was constructed with <var>logErrorsOnly</var>==true. * In this case the dialog will only be shown either if success if false or some errors * where captured. */ public void displayResult(final boolean success) { if (logMessages.size() > 0) { final StringBuilder sb = new StringBuilder(mMessage + "\n\n"); for (String msg : logMessages) { if (msg.length() > 0) { if (msg.charAt(0) != '\n') { int n = sb.length(); if (n > 0 && sb.charAt(n-1) != '\n') { sb.append('\n'); } } sb.append(msg); } } // display the message // dialog box only run in ui thread.. mDisplay.asyncExec(new Runnable() { public void run() { Shell shell = mDisplay.getActiveShell(); // Use the success icon if the call indicates success. // However just use the error icon if the logger was only recording errors. if (success && !mLogErrorsOnly) { MessageDialog.openInformation(shell, "Android Virtual Devices Manager", sb.toString()); } else { MessageDialog.openError(shell, "Android Virtual Devices Manager", sb.toString()); } } }); } } }