/******************************************************************************* * Copyright (c) 2014 Zend Technologies. * All rights reserved. This program and the accompanying materials * are the copyright of Zend Technologies and is protected under * copyright laws of the United States. * You must not copy, adapt or redistribute this document for * any use. *******************************************************************************/ package org.zend.php.zendserver.monitor.ui.preferences; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.jface.dialogs.IInputValidator; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.window.Window; import org.eclipse.php.internal.server.core.Server; import org.eclipse.php.internal.ui.wizards.IControlHandler; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.zend.php.server.core.utils.ServerUtils; import org.zend.php.server.ui.fragments.AbstractCompositeFragment; import org.zend.php.zendserver.monitor.core.MonitorManager; import org.zend.php.zendserver.monitor.internal.ui.Activator; import org.zend.php.zendserver.monitor.internal.ui.Messages; import org.zend.sdklib.target.IZendTarget; import org.zend.webapi.core.connection.data.values.IssueSeverity; /** * @author Wojciech Galanciak, 2014 * */ @SuppressWarnings("restriction") public class MonitoringCompositeFragment extends AbstractCompositeFragment { private class URLInputValidator implements IInputValidator { public String isValid(String newText) { try { new URL(newText); } catch (MalformedURLException e) { return Messages.MonitoringCompositeFragment_InvalidUrlMessage; } return null; } } public static String ID = "org.zend.php.zendserver.monitor.ui.preferences.MonitoringCompositeFragment"; //$NON-NLS-1$ private static final String EMPTY_STRING = ""; //$NON-NLS-1$ private TableViewer viewer; private Button removeButton; private Button modifyButton; private Button addButton; private Button[] severityButtons; private Button hideButton; private Text delayText; private List<String> input; private boolean[] severities; private boolean hide; private int delay; /** * PlatformCompositeFragment constructor * * @param parent * @param handler * @param isForEditing */ public MonitoringCompositeFragment(Composite parent, IControlHandler handler, boolean isForEditing) { super(parent, handler, isForEditing, Messages.MonitoringCompositeFragment_Name, Messages.MonitoringCompositeFragment_Title, Messages.MonitoringCompositeFragment_Description); setImageDescriptor(Activator.getImageDescriptor(Activator.MONITORING_ICON_WIZ)); } /** * Saves the page's state */ public void saveValues() { hide = hideButton.getSelection(); try { delay = Integer.valueOf(delayText.getText()); } catch (NumberFormatException ex) { // just keep the old value } for (int i = 0; i < severityButtons.length; i++) { severities[i] = severityButtons[i].getSelection(); } } @Override public boolean performOk() { Server server = getServer(); if (server != null) { IZendTarget target = ServerUtils.getTarget(server); if (isDeploymentEnabled() || target != null) { updateAttribute(MonitorManager.FILTERS_ATTRIBUTE, getValue(input), server); updateAttribute(MonitorManager.HIDE_ATTRIBUTE, String.valueOf(hideButton.getSelection()), server); updateAttribute(MonitorManager.HIDE_TIME_ATTRIBUTE, delayText.getText(), server); for (int i = 0; i < severityButtons.length; i++) { String severityName = getSeverityName(severityButtons[i]); updateAttribute(MonitorManager.SEVERITY_ATTRIBUTE + severityName, String.valueOf(severities[i]), server); } } } return true; } private void updateAttribute(String attributeName, String newValue, Server server) { String oldValue = server.getAttribute(attributeName, ""); //$NON-NLS-1$ if (newValue.isEmpty()) { server.removeAttribute(attributeName); } else if (!newValue.equals(oldValue)) { server.setAttribute(attributeName, newValue); } } @Override public String getId() { return ID; } @Override public void validate() { if (isDeploymentEnabled()) { try { String val = delayText.getText(); delay = Integer.valueOf(val); } catch (NumberFormatException ex) { setMessage( Messages.MonitoringCompositeFragment_DelayNaNMessage, IMessageProvider.ERROR); return; } setMessage(getDescription(), IMessageProvider.NONE); } } @Override public boolean isComplete() { return true; } @Override public void setVisible(boolean visible) { super.setVisible(visible); if (visible) { updateEnablement(isDeploymentEnabled()); } } @Override protected void createContents(Composite parent) { createFiltersSection(parent); createSeveritySection(parent); createDelaySection(parent); } @Override protected void init() { severities = new boolean[] { true, true, true }; input = new ArrayList<String>(); delay = MonitorManager.DELAY_DEFAULT; hide = false; Server server = getServer(); if (server != null) { IZendTarget target = ServerUtils.getTarget(server); input = getFilters(server); hide = getHide(server); delay = getDelay(server); for (int i = 0; i < severityButtons.length; i++) { String severityName = getSeverityName(severityButtons[i]); severities[i] = getSeverity(server, severityName); } for (int i = 0; i < severityButtons.length; i++) { severityButtons[i].setSelection(severities[i]); } hideButton.setSelection(hide); delayText.setEnabled(hideButton.getSelection()); delayText.setText(String.valueOf(delay)); updateEnablement(target != null); viewer.setInput(input); viewer.refresh(); } } private String getSeverityName(Button button) { return button.getText(); } private String getValue(List<String> list) { StringBuilder builder = new StringBuilder(); if (list != null && !list.isEmpty()) { for (String val : list) { builder.append(val).append(MonitorManager.FILTER_SEPARATOR); } return builder.substring(0, builder.length() - 1); } return ""; //$NON-NLS-1$ } private void createSeveritySection(Composite composite) { Composite container = new Composite(composite, SWT.NONE); container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 3, 1)); container.setLayout(new GridLayout(1, true)); Label label = new Label(container, SWT.WRAP); label.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); label.setText(Messages.MonitoringCompositeFragment_SeverityDesc); Group group = new Group(container, SWT.NONE); group.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); group.setLayout(new GridLayout(1, false)); IssueSeverity[] severityValues = IssueSeverity.values(); severityButtons = new Button[severityValues.length]; for (int i = 0; i < severityValues.length; i++) { severityButtons[i] = createCheckBox(group, severityValues[i]); severityButtons[i].addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { for (int i = 0; i < severityButtons.length; i++) { severities[i] = severityButtons[i].getSelection(); } } }); } } private Button createCheckBox(Composite parent, IssueSeverity severity) { Button button = new Button(parent, SWT.CHECK | SWT.LEFT); button.setText(severity.getName()); button.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); return button; } private void createDelaySection(Composite composite) { Composite container = new Composite(composite, SWT.NONE); container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 3, 1)); container.setLayout(new GridLayout(1, true)); hideButton = new Button(container, SWT.CHECK); hideButton.setText(Messages.MonitoringCompositeFragment_HideLabel); hideButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { hide = hideButton.getSelection(); delayText.setEnabled(hide); } }); hideButton.setLayoutData(new GridData(SWT.TOP, SWT.FILL, false, false)); Group group = new Group(container, SWT.NONE); group.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true)); group.setLayout(new GridLayout(1, false)); Composite labelComposite = new Composite(group, SWT.NONE); labelComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); GridLayout layout = new GridLayout(2, false); layout.marginWidth = 0; layout.marginHeight = 0; labelComposite.setLayout(layout); Label label = new Label(labelComposite, SWT.NONE); label.setText(Messages.MonitoringCompositeFragment_DelayLabel); GridData gd = new GridData(SWT.LEFT, SWT.CENTER, true, true); gd.minimumWidth = 100; label.setLayoutData(gd); delayText = new Text(labelComposite, SWT.BORDER | SWT.SINGLE); delayText.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { validate(); } }); delayText.setText(String.valueOf(MonitorManager.DELAY_DEFAULT)); delayText .setToolTipText(Messages.MonitoringCompositeFragment_DelayDesc); GridData data = new GridData(SWT.LEFT, SWT.CENTER, true, true); data.minimumWidth = 100; delayText.setLayoutData(data); } private void createFiltersSection(Composite parent) { Composite filtersSection = new Composite(parent, SWT.NONE); filtersSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1)); GridLayout gl = new GridLayout(2, false); gl.marginWidth = 0; gl.marginHeight = 0; filtersSection.setLayout(gl); Label filtersLabel = new Label(filtersSection, SWT.NONE); filtersLabel.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1)); filtersLabel.setText(Messages.MonitoringCompositeFragment_FiltersDesc); viewer = new TableViewer(filtersSection, SWT.SINGLE | SWT.BORDER); viewer.getTable().setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, true)); viewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { ISelection selection = viewer.getSelection(); if (selection != null && !selection.isEmpty()) { removeButton.setEnabled(true); modifyButton.setEnabled(true); } else { removeButton.setEnabled(false); modifyButton.setEnabled(false); } } }); viewer.setContentProvider(new FiltersContentProvider()); viewer.setLabelProvider(new LabelProvider() { public String getText(Object element) { if (element instanceof String) { return (String) element; } return super.getText(element); } }); Composite buttonsSection = new Composite(filtersSection, SWT.NONE); GridData gd = new GridData(SWT.FILL, SWT.FILL, false, true); gd.widthHint = 90; buttonsSection.setLayoutData(gd); GridLayout layout = new GridLayout(1, true); layout.marginWidth = 0; layout.marginHeight = 0; buttonsSection.setLayout(layout); addButton = new Button(buttonsSection, SWT.PUSH); addButton.setText(Messages.MonitoringCompositeFragment_AddLabel); addButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); addButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { InputDialog dlg = new InputDialog(getShell(), Messages.MonitoringCompositeFragment_AddTitle, Messages.MonitoringCompositeFragment_AddDesc, EMPTY_STRING, new URLInputValidator()); if (dlg.open() == Window.OK) { input.add(dlg.getValue()); viewer.refresh(); } } }); modifyButton = new Button(buttonsSection, SWT.PUSH); modifyButton.setText(Messages.MonitoringCompositeFragment_ModifyLabel); modifyButton .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); modifyButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { IStructuredSelection sel = (IStructuredSelection) viewer .getSelection(); Object[] selected = sel.toArray(); if (selected.length > 0) { InputDialog dlg = new InputDialog(getShell(), Messages.MonitoringCompositeFragment_ModifyTitle, Messages.MonitoringCompositeFragment_ModifyDesc, (String) selected[0], new URLInputValidator()); if (dlg.open() == Window.OK) { int index = input.indexOf(selected[0]); input.remove(selected[0]); input.add(index, dlg.getValue()); viewer.refresh(); } } } }); removeButton = new Button(buttonsSection, SWT.PUSH); removeButton.setText(Messages.MonitoringCompositeFragment_RemoveLabel); removeButton .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); removeButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { removeElement(viewer.getSelection()); } }); removeButton.setEnabled(false); modifyButton.setEnabled(false); } private void removeElement(ISelection selection) { IStructuredSelection sel = (IStructuredSelection) selection; Object[] toRemove = sel.toArray(); for (Object elem : toRemove) { if (elem == null) { return; } input.remove((String) elem); } viewer.refresh(); } private void updateEnablement(boolean enabled) { addButton.setEnabled(enabled); removeButton.setEnabled(false); modifyButton.setEnabled(false); viewer.getTable().setEnabled(enabled); for (Button button : severityButtons) { button.setEnabled(enabled); } hideButton.setEnabled(enabled); delayText.setEnabled(enabled && hideButton.getSelection()); if (enabled) { setDescription(Messages.MonitoringCompositeFragment_Description); } else { setMessage( Messages.MonitoringCompositeFragment_NotAvailableMessage, IMessageProvider.WARNING); } } private List<String> getFilters(Server server) { String value = server.getAttribute(MonitorManager.FILTERS_ATTRIBUTE, null); if (value != null) { return new ArrayList<String>(Arrays.asList(value .split(MonitorManager.FILTER_SEPARATOR))); } return new ArrayList<String>(); } private boolean getHide(Server server) { String hideValue = server.getAttribute(MonitorManager.HIDE_ATTRIBUTE, null); return hideValue != null ? Boolean.valueOf(hideValue) : false; } private int getDelay(Server server) { String delayValue = server.getAttribute(MonitorManager.HIDE_TIME_ATTRIBUTE, null); return delayValue != null ? Integer.valueOf(delayValue) : MonitorManager.DELAY_DEFAULT; } public static boolean getSeverity(Server server, String severityName) { String value = server.getAttribute(MonitorManager.SEVERITY_ATTRIBUTE + severityName, null); return value != null ? Boolean.valueOf(value) : true; } }