| /* |
| * Copyright (C) 2007 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.ide.eclipse.ddms.views; |
| |
| import com.android.ddmlib.Log.LogLevel; |
| import com.android.ddmuilib.ImageLoader; |
| import com.android.ddmuilib.logcat.LogColors; |
| import com.android.ddmuilib.logcat.LogFilter; |
| import com.android.ddmuilib.logcat.LogPanel; |
| import com.android.ddmuilib.logcat.LogPanel.ILogFilterStorageManager; |
| import com.android.ddmuilib.logcat.LogPanel.LogCatViewInterface; |
| import com.android.ide.eclipse.ddms.CommonAction; |
| import com.android.ide.eclipse.ddms.DdmsPlugin; |
| import com.android.ide.eclipse.ddms.i18n.Messages; |
| import com.android.ide.eclipse.ddms.preferences.PreferenceInitializer; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IMarker; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.action.IMenuManager; |
| import org.eclipse.jface.action.IToolBarManager; |
| import org.eclipse.jface.action.Separator; |
| import org.eclipse.jface.preference.IPreferenceStore; |
| import org.eclipse.swt.dnd.Clipboard; |
| import org.eclipse.swt.graphics.Color; |
| import org.eclipse.swt.graphics.Font; |
| import org.eclipse.swt.graphics.FontData; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.ui.IActionBars; |
| import org.eclipse.ui.IPerspectiveRegistry; |
| import org.eclipse.ui.IWorkbench; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.WorkbenchException; |
| import org.eclipse.ui.actions.ActionFactory; |
| import org.eclipse.ui.ide.IDE; |
| |
| import java.util.ArrayList; |
| |
| /** |
| * The log cat view displays log output from the current device selection. |
| */ |
| public final class OldLogCatView extends SelectionDependentViewPart implements LogCatViewInterface { |
| |
| public static final String ID = "com.android.ide.eclipse.ddms.views.OldLogCatView"; //$NON-NLS-1$ |
| |
| private static final String PREFS_COL_TIME = |
| DdmsPlugin.PLUGIN_ID + ".logcat.time"; //$NON-NLS-1$ |
| private static final String PREFS_COL_LEVEL = |
| DdmsPlugin.PLUGIN_ID + ".logcat.level"; //$NON-NLS-1$ |
| private static final String PREFS_COL_PID = |
| DdmsPlugin.PLUGIN_ID + ".logcat.pid"; //$NON-NLS-1$ |
| private static final String PREFS_COL_TAG = |
| DdmsPlugin.PLUGIN_ID + ".logcat.tag"; //$NON-NLS-1$ |
| private static final String PREFS_COL_MESSAGE = |
| DdmsPlugin.PLUGIN_ID + ".logcat.message"; //$NON-NLS-1$ |
| |
| private static final String PREFS_FILTERS = |
| DdmsPlugin.PLUGIN_ID + ".logcat.filters"; //$NON-NLS-1$ |
| |
| public static final String CHOICE_METHOD_DECLARATION = |
| DdmsPlugin.PLUGIN_ID + ".logcat.MethodDeclaration"; //$NON-NLS-1$ |
| public static final String CHOICE_ERROR_LINE = |
| DdmsPlugin.PLUGIN_ID + ".logcat.ErrorLine"; //$NON-NLS-1$ |
| |
| /* Default values for the switch of perspective. */ |
| public static final boolean DEFAULT_SWITCH_PERSPECTIVE = true; |
| public static final String DEFAULT_PERSPECTIVE_ID = "org.eclipse.jdt.ui.JavaPerspective"; //$NON-NLS-1$ |
| private static OldLogCatView sThis; |
| private LogPanel mLogPanel; |
| |
| private CommonAction mCreateFilterAction; |
| private CommonAction mDeleteFilterAction; |
| private CommonAction mEditFilterAction; |
| private CommonAction mExportAction; |
| |
| private CommonAction[] mLogLevelActions; |
| private String[] mLogLevelIcons = { |
| "v.png", //$NON-NLS-1S |
| "d.png", //$NON-NLS-1S |
| "i.png", //$NON-NLS-1S |
| "w.png", //$NON-NLS-1S |
| "e.png", //$NON-NLS-1S |
| }; |
| |
| private Action mClearAction; |
| |
| private Clipboard mClipboard; |
| |
| /** |
| * An implementation of {@link ILogFilterStorageManager} to bridge to the |
| * eclipse preference store, and saves the log filters. |
| */ |
| private final class FilterStorage implements ILogFilterStorageManager { |
| |
| @Override |
| public LogFilter[] getFilterFromStore() { |
| String filterPrefs = DdmsPlugin.getDefault().getPreferenceStore().getString( |
| PREFS_FILTERS); |
| |
| // split in a string per filter |
| String[] filters = filterPrefs.split("\\|"); //$NON-NLS-1$ |
| |
| ArrayList<LogFilter> list = |
| new ArrayList<LogFilter>(filters.length); |
| |
| for (String f : filters) { |
| if (f.length() > 0) { |
| LogFilter logFilter = new LogFilter(); |
| if (logFilter.loadFromString(f)) { |
| list.add(logFilter); |
| } |
| } |
| } |
| |
| return list.toArray(new LogFilter[list.size()]); |
| } |
| |
| @Override |
| public void saveFilters(LogFilter[] filters) { |
| StringBuilder sb = new StringBuilder(); |
| for (LogFilter f : filters) { |
| String filterString = f.toString(); |
| sb.append(filterString); |
| sb.append('|'); |
| } |
| |
| DdmsPlugin.getDefault().getPreferenceStore().setValue(PREFS_FILTERS, sb.toString()); |
| } |
| |
| @Override |
| public boolean requiresDefaultFilter() { |
| return true; |
| } |
| } |
| |
| public OldLogCatView() { |
| sThis = this; |
| LogPanel.PREFS_TIME = PREFS_COL_TIME; |
| LogPanel.PREFS_LEVEL = PREFS_COL_LEVEL; |
| LogPanel.PREFS_PID = PREFS_COL_PID; |
| LogPanel.PREFS_TAG = PREFS_COL_TAG; |
| LogPanel.PREFS_MESSAGE = PREFS_COL_MESSAGE; |
| } |
| |
| /** |
| * Returns the singleton instance. |
| */ |
| public static OldLogCatView getInstance() { |
| return sThis; |
| } |
| |
| /** |
| * Sets the display font. |
| * |
| * @param font The font. |
| */ |
| public static void setFont(Font font) { |
| if (sThis != null && sThis.mLogPanel != null) { |
| sThis.mLogPanel.setFont(font); |
| } |
| } |
| |
| @Override |
| public void createPartControl(Composite parent) { |
| Display d = parent.getDisplay(); |
| LogColors colors = new LogColors(); |
| |
| ImageLoader loader = ImageLoader.getDdmUiLibLoader(); |
| |
| colors.infoColor = new Color(d, 0, 127, 0); |
| colors.debugColor = new Color(d, 0, 0, 127); |
| colors.errorColor = new Color(d, 255, 0, 0); |
| colors.warningColor = new Color(d, 255, 127, 0); |
| colors.verboseColor = new Color(d, 0, 0, 0); |
| |
| mCreateFilterAction = new CommonAction(Messages.LogCatView_Create_Filter) { |
| @Override |
| public void run() { |
| mLogPanel.addFilter(); |
| } |
| }; |
| mCreateFilterAction.setToolTipText(Messages.LogCatView_Create_Filter_Tooltip); |
| mCreateFilterAction.setImageDescriptor(loader.loadDescriptor("add.png")); //$NON-NLS-1$ |
| |
| mEditFilterAction = new CommonAction(Messages.LogCatView_Edit_Filter) { |
| @Override |
| public void run() { |
| mLogPanel.editFilter(); |
| } |
| }; |
| mEditFilterAction.setToolTipText(Messages.LogCatView_Edit_Filter_Tooltip); |
| mEditFilterAction.setImageDescriptor(loader.loadDescriptor("edit.png")); //$NON-NLS-1$ |
| |
| mDeleteFilterAction = new CommonAction(Messages.LogCatView_Delete_Filter) { |
| @Override |
| public void run() { |
| mLogPanel.deleteFilter(); |
| } |
| }; |
| mDeleteFilterAction.setToolTipText(Messages.LogCatView_Delete_Filter_Tooltip); |
| mDeleteFilterAction.setImageDescriptor(loader.loadDescriptor("delete.png")); //$NON-NLS-1$ |
| |
| mExportAction = new CommonAction(Messages.LogCatView_Export_Selection_As_Text) { |
| @Override |
| public void run() { |
| mLogPanel.save(); |
| } |
| }; |
| mExportAction.setToolTipText(Messages.LogCatView_Export_Selection_As_Text_Tooltip); |
| mExportAction.setImageDescriptor(loader.loadDescriptor("save.png")); //$NON-NLS-1$ |
| |
| LogLevel[] levels = LogLevel.values(); |
| mLogLevelActions = new CommonAction[mLogLevelIcons.length]; |
| for (int i = 0; i < mLogLevelActions.length; i++) { |
| String name = levels[i].getStringValue(); |
| mLogLevelActions[i] = new CommonAction(name, IAction.AS_CHECK_BOX) { |
| @Override |
| public void run() { |
| // disable the other actions and record current index |
| for (int j = 0; j < mLogLevelActions.length; j++) { |
| Action a = mLogLevelActions[j]; |
| if (a == this) { |
| a.setChecked(true); |
| |
| // set the log level |
| mLogPanel.setCurrentFilterLogLevel(j + 2); |
| } else { |
| a.setChecked(false); |
| } |
| } |
| } |
| }; |
| |
| mLogLevelActions[i].setToolTipText(name); |
| mLogLevelActions[i].setImageDescriptor(loader.loadDescriptor(mLogLevelIcons[i])); |
| } |
| |
| mClearAction = new Action(Messages.LogCatView_Clear_Log) { |
| @Override |
| public void run() { |
| mLogPanel.clear(); |
| } |
| }; |
| mClearAction.setImageDescriptor(loader.loadDescriptor("clear.png")); //$NON-NLS-1$ |
| |
| // now create the log view |
| mLogPanel = new LogPanel(colors, new FilterStorage(), LogPanel.FILTER_MANUAL); |
| mLogPanel.setLogCatViewInterface(this); |
| mLogPanel.setActions(mDeleteFilterAction, mEditFilterAction, mLogLevelActions); |
| |
| // get the font |
| String fontStr = DdmsPlugin.getDefault().getPreferenceStore().getString( |
| PreferenceInitializer.ATTR_LOGCAT_FONT); |
| if (fontStr != null) { |
| FontData data = new FontData(fontStr); |
| |
| if (fontStr != null) { |
| mLogPanel.setFont(new Font(parent.getDisplay(), data)); |
| } |
| } |
| |
| mLogPanel.createPanel(parent); |
| setSelectionDependentPanel(mLogPanel); |
| |
| // place the actions. |
| placeActions(); |
| |
| // setup the copy action |
| mClipboard = new Clipboard(d); |
| IActionBars actionBars = getViewSite().getActionBars(); |
| actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), new Action( |
| Messages.LogCatView_Copy) { |
| @Override |
| public void run() { |
| mLogPanel.copy(mClipboard); |
| } |
| }); |
| |
| // setup the select all action |
| actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), |
| new Action(Messages.LogCatView_Select_All) { |
| @Override |
| public void run() { |
| mLogPanel.selectAll(); |
| } |
| }); |
| } |
| |
| @Override |
| public void dispose() { |
| mLogPanel.stopLogCat(true); |
| mClipboard.dispose(); |
| } |
| |
| @Override |
| public void setFocus() { |
| mLogPanel.setFocus(); |
| } |
| |
| /** |
| * Place the actions in the ui. |
| */ |
| private void placeActions() { |
| IActionBars actionBars = getViewSite().getActionBars(); |
| |
| // first in the menu |
| IMenuManager menuManager = actionBars.getMenuManager(); |
| menuManager.add(mCreateFilterAction); |
| menuManager.add(mEditFilterAction); |
| menuManager.add(mDeleteFilterAction); |
| menuManager.add(new Separator()); |
| menuManager.add(mClearAction); |
| menuManager.add(new Separator()); |
| menuManager.add(mExportAction); |
| |
| // and then in the toolbar |
| IToolBarManager toolBarManager = actionBars.getToolBarManager(); |
| for (CommonAction a : mLogLevelActions) { |
| toolBarManager.add(a); |
| } |
| toolBarManager.add(new Separator()); |
| toolBarManager.add(mCreateFilterAction); |
| toolBarManager.add(mEditFilterAction); |
| toolBarManager.add(mDeleteFilterAction); |
| toolBarManager.add(new Separator()); |
| toolBarManager.add(mClearAction); |
| } |
| |
| void openFile(IFile file, IMarker marker) { |
| try { |
| IWorkbenchPage page = getViewSite().getWorkbenchWindow() |
| .getActivePage(); |
| if (page != null) { |
| IDE.openEditor(page, marker); |
| marker.delete(); |
| } |
| } catch (CoreException e) { |
| Status s = new Status(Status.ERROR, DdmsPlugin.PLUGIN_ID, e.getMessage(), e); |
| DdmsPlugin.getDefault().getLog().log(s); |
| } |
| } |
| |
| void switchPerspective() { |
| IPreferenceStore store = DdmsPlugin.getDefault().getPreferenceStore(); |
| if (store.getBoolean(PreferenceInitializer.ATTR_SWITCH_PERSPECTIVE)) { |
| IWorkbench workbench = PlatformUI.getWorkbench(); |
| IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); |
| IPerspectiveRegistry perspectiveRegistry = workbench.getPerspectiveRegistry(); |
| String perspectiveId = store.getString(PreferenceInitializer.ATTR_PERSPECTIVE_ID); |
| if (perspectiveId != null |
| && perspectiveId.length() > 0 |
| && perspectiveRegistry.findPerspectiveWithId(perspectiveId) != null) { |
| try { |
| workbench.showPerspective(perspectiveId, window); |
| } catch (WorkbenchException e) { |
| e.printStackTrace(); |
| } |
| } |
| } |
| } |
| |
| @Override |
| public void onDoubleClick() { |
| } |
| } |