/* * 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() { } }