/*******************************************************************************
* Copyright (c) 2013 AGETO Service GmbH and others.
* 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:
* Gunnar Wagenknecht - initial API and implementation
*******************************************************************************/
package org.eclipse.gyrex.admin.ui.logback.internal;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.gyrex.admin.ui.adapter.AdapterUtil;
import org.eclipse.gyrex.admin.ui.adapter.ImageAdapter;
import org.eclipse.gyrex.admin.ui.internal.widgets.PatternFilter;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.DialogField;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.ITreeListAdapter;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.LayoutUtil;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.StringDialogField;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.TreeListDialogField;
import org.eclipse.gyrex.common.identifiers.IdHelper;
import org.eclipse.gyrex.logback.config.internal.AppenderProviderRegistry;
import org.eclipse.gyrex.logback.config.internal.LogbackConfigActivator;
import org.eclipse.gyrex.logback.config.model.Appender;
import org.eclipse.gyrex.logback.config.spi.AppenderProvider;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.apache.commons.lang.StringUtils;
/**
* Page for selecting the appender type and entering appender name.
*/
public class AppenderWizardPage extends WizardPage {
/** serialVersionUID */
private static final long serialVersionUID = 1L;
private final LabelProvider appenderTreeLabelProvider = new LabelProvider() {
private static final long serialVersionUID = 1L;
private LocalResourceManager resourceManager;
private Image createImage(final ImageDescriptor descriptor) {
if (descriptor == null)
return null;
if (resourceManager == null) {
resourceManager = new LocalResourceManager(JFaceResources.getResources());
}
return resourceManager.createImage(descriptor);
}
@Override
public void dispose() {
super.dispose();
if (resourceManager != null) {
resourceManager.dispose();
resourceManager = null;
}
}
@Override
public Image getImage(final Object element) {
final ImageAdapter adapter = AdapterUtil.getAdapter(element, ImageAdapter.class);
if (adapter != null)
return createImage(adapter.getImageDescriptor(element));
return super.getImage(element);
};
@Override
public String getText(final Object element) {
if (element instanceof AppenderType)
return ((AppenderType) element).getName();
return super.getText(element);
};
};
private final ITreeListAdapter appenderTreeListAdapter = new ITreeListAdapter() {
@Override
public void customButtonPressed(final TreeListDialogField field, final int index) {
// no-op
}
@Override
public void doubleClicked(final TreeListDialogField field) {
// no-op
}
@Override
public Object[] getChildren(final TreeListDialogField field, final Object element) {
return new Object[0];
}
@Override
public Object getParent(final TreeListDialogField field, final Object element) {
return null;
}
@Override
public boolean hasChildren(final TreeListDialogField field, final Object element) {
return false;
}
@Override
public void keyPressed(final TreeListDialogField field, final KeyEvent event) {
// no-op
}
@Override
public void selectionChanged(final TreeListDialogField field) {
validate();
}
};
private final TreeListDialogField appenderTypeField = new TreeListDialogField(appenderTreeListAdapter, null, appenderTreeLabelProvider, new PatternFilter());
private final StringDialogField nameField = new StringDialogField();
private final Appender appender;
protected AppenderWizardPage(final Appender appender) {
super("type");
this.appender = appender;
setTitle("Appender");
setDescription("Configure the appender basics (such as name and type).");
setPageComplete(false);
}
@Override
public void createControl(final Composite parent) {
final Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(GridLayoutFactory.fillDefaults().create());
composite.setLayoutData(GridDataFactory.fillDefaults().minSize(convertVerticalDLUsToPixels(200), convertHorizontalDLUsToPixels(400)).create());
setControl(composite);
nameField.setLabelText("Name:");
appenderTypeField.setLabelText("Type:");
appenderTypeField.setViewerComparator(new ViewerComparator());
final IDialogFieldListener validateListener = new IDialogFieldListener() {
@Override
public void dialogFieldChanged(final DialogField field) {
validate();
}
};
nameField.setDialogFieldListener(validateListener);
appenderTypeField.setDialogFieldListener(validateListener);
LayoutUtil.doDefaultLayout(composite, new DialogField[] { nameField, appenderTypeField }, false);
LayoutUtil.setHorizontalGrabbing(nameField.getTextControl(null));
LayoutUtil.setHorizontalGrabbing(appenderTypeField.getTreeControl(null));
final List<AppenderType> types = new ArrayList<>();
final AppenderProviderRegistry registry = LogbackConfigActivator.getInstance().getAppenderProviderRegistry();
for (final AppenderProvider provider : registry.getTracked().values()) {
for (final String typeId : provider.getProvidedTypeIds()) {
types.add(new AppenderType(typeId, registry.getName(typeId), provider));
}
}
appenderTypeField.setElements(types);
if (appender != null) {
nameField.setText(appender.getName());
for (final AppenderType type : types) {
if (appender.getTypeId().equals(type.getId())) {
appenderTypeField.selectElements(new StructuredSelection(type));
break;
}
}
appenderTypeField.setEnabled(false);
}
}
@Override
public String getName() {
return StringUtils.trimToNull(nameField.getText());
}
private void setAppenderType(final AppenderType type) {
final AddEditAppenderWizard wizard = (AddEditAppenderWizard) getWizard();
if (type != null) {
wizard.initializeCurrentAppenderConfigurationSession(type.getId(), type.getName(), type.getWizardAdapter());
} else {
wizard.clearCurrentAppenderConfigurationSession();
}
}
void validate() {
final String name = getName();
if (name == null) {
setMessage("Please enter an appender name.", INFORMATION);
setPageComplete(false);
return;
} else if (!IdHelper.isValidId(name)) {
setMessage("The entered appender name is invalid. It may only contain ASCII chars a-z, 0-9, '.', '-' and/or '_'.", IMessageProvider.ERROR);
setPageComplete(false);
return;
}
final List<Object> selectedElements = appenderTypeField.getSelectedElements();
if (selectedElements.size() != 1) {
setMessage("Please select an appender to use.", INFORMATION);
setPageComplete(false);
return;
}
setAppenderType((AppenderType) selectedElements.get(0));
setMessage(null);
setPageComplete(true);
}
}