blob: c66fe4844986695015788b93356aac67440ab60e [file] [log] [blame]
/*
* 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);
}
}