/* * 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.ddmuilib.logcat; import com.android.ddmuilib.IImageLoader; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Dialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; /** * Small dialog box to edit a static port number. */ public class EditFilterDialog extends Dialog { private static final int DLG_WIDTH = 400; private static final int DLG_HEIGHT = 250; private Shell mParent; private Shell mShell; private boolean mOk = false; private IImageLoader mImageLoader; /** * Filter being edited or created */ private LogFilter mFilter; private String mName; private String mTag; private String mPid; /** Log level as an index of the drop-down combo * @see getLogLevel * @see getComboIndex */ private int mLogLevel; private Button mOkButton; private Label mPidWarning; public EditFilterDialog(IImageLoader imageLoader, Shell parent) { super(parent, SWT.DIALOG_TRIM | SWT.BORDER | SWT.APPLICATION_MODAL); mImageLoader = imageLoader; } public EditFilterDialog(IImageLoader imageLoader, Shell shell, LogFilter filter) { this(imageLoader, shell); mFilter = filter; } /** * Opens the dialog. The method will return when the user closes the dialog * somehow. * * @return true if ok was pressed, false if cancelled. */ public boolean open() { createUI(); if (mParent == null || mShell == null) { return false; } mShell.setMinimumSize(DLG_WIDTH, DLG_HEIGHT); Rectangle r = mParent.getBounds(); // get the center new top left. int cx = r.x + r.width/2; int x = cx - DLG_WIDTH / 2; int cy = r.y + r.height/2; int y = cy - DLG_HEIGHT / 2; mShell.setBounds(x, y, DLG_WIDTH, DLG_HEIGHT); mShell.open(); Display display = mParent.getDisplay(); while (!mShell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } // we're quitting with OK. // Lets update the filter if needed if (mOk) { // if it was a "Create filter" action we need to create it first. if (mFilter == null) { mFilter = new LogFilter(mName); } // setup the filter mFilter.setTagMode(mTag); if (mPid != null && mPid.length() > 0) { mFilter.setPidMode(Integer.parseInt(mPid)); } else { mFilter.setPidMode(-1); } mFilter.setLogLevel(getLogLevel(mLogLevel)); } return mOk; } public LogFilter getFilter() { return mFilter; } private void createUI() { mParent = getParent(); mShell = new Shell(mParent, getStyle()); mShell.setText("Log Filter"); mShell.setLayout(new GridLayout(1, false)); mShell.addListener(SWT.Close, new Listener() { public void handleEvent(Event event) { } }); // top part with the filter name Composite nameComposite = new Composite(mShell, SWT.NONE); nameComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); nameComposite.setLayout(new GridLayout(2, false)); Label l = new Label(nameComposite, SWT.NONE); l.setText("Filter Name:"); final Text filterNameText = new Text(nameComposite, SWT.SINGLE | SWT.BORDER); if (mFilter != null) { mName = mFilter.getName(); if (mName != null) { filterNameText.setText(mName); } } filterNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); filterNameText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { mName = filterNameText.getText().trim(); validate(); } }); // separator l = new Label(mShell, SWT.SEPARATOR | SWT.HORIZONTAL); l.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // center part with the filter parameters Composite main = new Composite(mShell, SWT.NONE); main.setLayoutData(new GridData(GridData.FILL_BOTH)); main.setLayout(new GridLayout(3, false)); l = new Label(main, SWT.NONE); l.setText("by Log Tag:"); final Text tagText = new Text(main, SWT.SINGLE | SWT.BORDER); if (mFilter != null) { mTag = mFilter.getTagFilter(); if (mTag != null) { tagText.setText(mTag); } } GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; tagText.setLayoutData(gd); tagText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { mTag = tagText.getText().trim(); validate(); } }); l = new Label(main, SWT.NONE); l.setText("by pid:"); final Text pidText = new Text(main, SWT.SINGLE | SWT.BORDER); if (mFilter != null) { if (mFilter.getPidFilter() != -1) { mPid = Integer.toString(mFilter.getPidFilter()); } else { mPid = ""; } pidText.setText(mPid); } pidText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); pidText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { mPid = pidText.getText().trim(); validate(); } }); mPidWarning = new Label(main, SWT.NONE); mPidWarning.setImage(mImageLoader.loadImage("empty.png", // $NON-NLS-1$ mShell.getDisplay())); l = new Label(main, SWT.NONE); l.setText("by Log level:"); final Combo logCombo = new Combo(main, SWT.DROP_DOWN | SWT.READ_ONLY); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; logCombo.setLayoutData(gd); // add the labels logCombo.add("<none>"); logCombo.add("Error"); logCombo.add("Warning"); logCombo.add("Info"); logCombo.add("Debug"); logCombo.add("Verbose"); if (mFilter != null) { mLogLevel = getComboIndex(mFilter.getLogLevel()); logCombo.select(mLogLevel); } else { logCombo.select(0); } logCombo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { // get the selection mLogLevel = logCombo.getSelectionIndex(); validate(); } }); // separator l = new Label(mShell, SWT.SEPARATOR | SWT.HORIZONTAL); l.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // bottom part with the ok/cancel Composite bottomComp = new Composite(mShell, SWT.NONE); bottomComp .setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER)); bottomComp.setLayout(new GridLayout(2, true)); mOkButton = new Button(bottomComp, SWT.NONE); mOkButton.setText("OK"); mOkButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { mOk = true; mShell.close(); } }); mOkButton.setEnabled(false); mShell.setDefaultButton(mOkButton); Button cancelButton = new Button(bottomComp, SWT.NONE); cancelButton.setText("Cancel"); cancelButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { mShell.close(); } }); validate(); } /** * Returns the log level from a combo index. * @param index the Combo index * @return a log level valid for the Log class. */ protected int getLogLevel(int index) { if (index == 0) { return -1; } return 7 - index; } /** * Returns the index in the combo that matches the log level * @param logLevel The Log level. * @return the combo index */ private int getComboIndex(int logLevel) { if (logLevel == -1) { return 0; } return 7 - logLevel; } /** * Validates the content of the 2 text fields and enable/disable "ok", while * setting up the warning/error message. */ private void validate() { // then we check it only contains digits. if (mPid != null) { if (mPid.matches("[0-9]*") == false) { // $NON-NLS-1$ mOkButton.setEnabled(false); mPidWarning.setImage(mImageLoader.loadImage( "warning.png", // $NON-NLS-1$ mShell.getDisplay())); return; } else { mPidWarning.setImage(mImageLoader.loadImage( "empty.png", // $NON-NLS-1$ mShell.getDisplay())); } } if (mName == null || mName.length() == 0) { mOkButton.setEnabled(false); return; } mOkButton.setEnabled(true); } }