/*******************************************************************************
* Copyright (c) 2007 Jeff Mesnil
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Benjamin Walstrum (issue #24)
*******************************************************************************/
package net.jmesnil.jmx.ui.internal.controls;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.FormToolkit;
import net.jmesnil.jmx.ui.JMXUIActivator;
import net.jmesnil.jmx.ui.extensions.IAttributeControlFactory;
import net.jmesnil.jmx.ui.extensions.IWritableAttributeHandler;
import net.jmesnil.jmx.ui.internal.MBeanUtils;
import net.jmesnil.jmx.ui.internal.Messages;
import net.jmesnil.jmx.ui.internal.StringUtils;
public class TextControlFactory implements IAttributeControlFactory {
public Control createControl(final Composite parent, final FormToolkit toolkit,
final boolean writable, final String type, final Object value,
final IWritableAttributeHandler handler) {
String attrValue = ""; //$NON-NLS-1$
try {
attrValue = StringUtils.toString(value, true);
} catch (Exception e) {
JMXUIActivator.log(IStatus.ERROR,
Messages.MBeanAttributeValue_Warning, e);
attrValue = Messages.unavailable;
}
int style = SWT.BORDER;
// fixed issue #12
if (value instanceof Number || value instanceof Character) {
style |= SWT.SINGLE;
} else {
style |= SWT.MULTI | SWT.WRAP;
}
if (!writable) {
final Text text = createTextControl(parent, toolkit, style);
text.setText(attrValue);
text.setEditable(false);
text.setForeground(parent.getDisplay().getSystemColor(
SWT.COLOR_BLACK));
return text;
} else {
// interpose a composite to contain both
// the text control and an "update" button
Composite composite = toolkit.createComposite(parent);
composite
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
GridLayout layout = new GridLayout(2, false);
composite.setLayout(layout);
final Text text = createTextControl(composite, toolkit, style);
text.setText(attrValue);
text.setEditable(true);
text.setForeground(parent.getDisplay().getSystemColor(
SWT.COLOR_BLUE));
if (handler != null) {
Button updateButton = toolkit.createButton(composite,
Messages.AttributeControlFactory_updateButtonTitle, SWT.PUSH);
updateButton.setLayoutData(new GridData(SWT.END, SWT.TOP,
false, false));
updateButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent event) {
try {
Object newValue = MBeanUtils.getValue(text
.getText(), type);
handler.write(newValue);
text.setText(newValue.toString());
} catch (Throwable t) {
IStatus errorStatus = new Status(IStatus.ERROR,
JMXUIActivator.PLUGIN_ID, IStatus.OK, t
.getMessage(), t);
ErrorDialog
.openError(
parent.getShell(),
Messages.AttributeDetailsSection_errorTitle,
t.getMessage(), errorStatus);
}
}
public void widgetSelected(SelectionEvent event) {
widgetDefaultSelected(event);
}
});
}
return text;
}
}
private static Text createTextControl(final Composite parent,
FormToolkit toolkit, int style) {
final Text text;
if (toolkit != null) {
text = toolkit.createText(parent, "", style); //$NON-NLS-1$
} else {
text = new Text(parent, style); //$NON-NLS-1$
}
return text;
}
}