/******************************************************************************* * Copyright (c) 2015 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.foundation.checkup.dialog; import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; 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.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.PatternFilter; import org.jboss.tools.foundation.checkup.JVMProblemDetectorMessages; import org.jboss.tools.foundation.checkup.internal.model.Dependant; import org.jboss.tools.foundation.checkup.internal.model.DependantList; import org.jboss.tools.foundation.checkup.internal.model.UnresolvedModule; public class UnresolvedModulesDialog extends Dialog{ public static volatile boolean showing = false; private List<UnresolvedModule> modules; private String currnetJavaVersion = ""; private boolean showNextTime = true; private ModuleFilter patternFilter; public UnresolvedModulesDialog(Shell parentShell, List<UnresolvedModule> modules, String currentJavaVersion) { super(parentShell); setShellStyle(getShellStyle() | SWT.RESIZE); this.modules = modules; this.currnetJavaVersion = currentJavaVersion; } public boolean showNextTime(){ return showNextTime; } protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); } protected Control createDialogArea(Composite parent) { getShell().setText("Warning"); Composite title = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginTop = layout.marginBottom = layout.marginLeft = layout.marginRight = 5; title.setLayout(layout); GridData data = new GridData(SWT.LEFT, SWT.FILL, true, false); data.widthHint = 500; title.setLayoutData(data); Composite composite = new Composite(parent, SWT.NONE); layout = new GridLayout(); layout.numColumns = 1; layout.marginTop = layout.marginBottom = layout.marginLeft = layout.marginRight = 5; composite.setLayout(layout); data = new GridData(SWT.FILL, SWT.FILL, true, true); composite.setLayoutData(data); // create image Image image = PlatformUI.getWorkbench().getDisplay().getSystemImage(SWT.ICON_WARNING); Label warning = new Label(title, 0); image.setBackground(warning.getBackground()); warning.setImage(image); warning.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING| GridData.VERTICAL_ALIGN_CENTER)); // message Label label = new Label(title, SWT.WRAP); data = new GridData(SWT.LEFT, SWT.FILL, true, false); label.setLayoutData(data); label.setFont(parent.getFont()); StringBuilder sb = new StringBuilder(); sb.append(NLS.bind(JVMProblemDetectorMessages.UNRESOLVED_MODULES_WARNING_DIALOG_MESSAGE, currnetJavaVersion)); label.setText(sb.toString()); final Text fFilterText= new Text(composite, SWT.SEARCH|SWT.ICON_SEARCH); data = new GridData(SWT.FILL, SWT.BEGINNING, true, false); fFilterText.setLayoutData(data); Dialog.applyDialogFont(fFilterText); final TreeViewer tree = new TreeViewer(composite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); tree.setAutoExpandLevel(TreeViewer.ALL_LEVELS); data = new GridData(SWT.FILL, SWT.FILL, true, true); data.heightHint = 200; tree.getTree().setLayoutData(data); tree.setContentProvider(new TreeContent()); tree.setLabelProvider(new LabelProvider()); tree.setInput(modules); patternFilter = new ModuleFilter(); tree.setFilters(new ViewerFilter[]{patternFilter}); fFilterText.setText(""); //$NON-NLS-1$ fFilterText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { patternFilter.setPattern(fFilterText.getText()); tree.refresh(); tree.expandAll(); } }); label = new Label(composite, SWT.WRAP); data = new GridData(SWT.LEFT, SWT.FILL, true, false); label.setLayoutData(data); label.setFont(parent.getFont()); label.setText(JVMProblemDetectorMessages.UNRESOLVED_MODULES_WARNING_DIALOG_ADVISE); final Button button = new Button(composite, SWT.CHECK); button.setText(JVMProblemDetectorMessages.DO_NOT_SHOW); button.addSelectionListener(new SelectionListener(){ public void widgetSelected(SelectionEvent e) { showNextTime = !button.getSelection(); } public void widgetDefaultSelected(SelectionEvent e) { } }); return composite; } class ModuleFilter extends PatternFilter{ protected boolean isLeafMatch(Viewer viewer, Object element){ String labelText = ((ILabelProvider) ((StructuredViewer) viewer) .getLabelProvider()).getText(element); if(labelText == null) { return false; } boolean result = wordMatches(labelText); if(!result){ labelText = labelText.replace('.', ' '); return wordMatches(labelText); } return true; } } public class TreeContent implements ITreeContentProvider { public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } public Object[] getElements(Object inputElement) { if(inputElement == modules){ return modules.toArray(); }else if(inputElement instanceof UnresolvedModule){ return new DependantList[]{((UnresolvedModule)inputElement).getDependantList()}; }else if(inputElement instanceof DependantList){ return ((DependantList) inputElement).getDependants().toArray(); } return null; } public Object[] getChildren(Object parentElement) { if(parentElement == modules){ return modules.toArray(); }else if(parentElement instanceof UnresolvedModule){ return new DependantList[]{((UnresolvedModule)parentElement).getDependantList()}; }else if(parentElement instanceof DependantList){ return ((DependantList) parentElement).getDependants().toArray(); } return null; } public Object getParent(Object element) { if(element instanceof Dependant){ return ((Dependant) element).getParent().getDependantList(); }else if(element instanceof UnresolvedModule){ return modules; }else if(element instanceof DependantList){ ((DependantList) element).getUnresolvedModule(); } return null; } public boolean hasChildren(Object inputElement) { if(inputElement == modules){ return modules.size() > 0; }else if(inputElement instanceof UnresolvedModule){ return ((UnresolvedModule) inputElement).getDependantList().getDependants().size() > 0; }else if(inputElement instanceof DependantList){ return ((DependantList) inputElement).getDependants().size() > 0; } return false; } } public class LabelProvider implements ILabelProvider{ public void addListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) { } public Image getImage(Object element) { return null; } public String getText(Object element) { if(element instanceof Dependant){ return ((Dependant) element).toString(); }else if(element instanceof UnresolvedModule){ return ((UnresolvedModule) element).toString(); }else if(element instanceof DependantList){ return JVMProblemDetectorMessages.DEPENDANT_MODULES; } return null; } } public boolean close() { showing = false; return super.close(); } public int open() { showing = true; return super.open(); } }