package org.objectstyle.wolips.eomodeler.editors;
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.objectstyle.wolips.eomodeler.core.model.EOModelObject;
import org.objectstyle.wolips.eomodeler.core.model.EOModelVerificationFailure;
public class EOModelErrorDialog extends Dialog {
public static final int DELETE_ANYWAY_ID = 100;
private EOModelEditor _editor;
private boolean _showDeleteAnywayButton;
private Set<? extends EOModelVerificationFailure> _failures;
public EOModelErrorDialog(Shell parentShell, Set<? extends EOModelVerificationFailure> failures) {
this(parentShell, failures, false, null);
}
public EOModelErrorDialog(Shell parentShell, Set<? extends EOModelVerificationFailure> failures, EOModelEditor editor) {
this(parentShell, failures, false, editor);
}
public EOModelErrorDialog(Shell parentShell, Set<? extends EOModelVerificationFailure> failures, boolean showDeleteAnywayButton) {
this(parentShell, failures, showDeleteAnywayButton, null);
}
public EOModelErrorDialog(Shell parentShell, Set<? extends EOModelVerificationFailure> failures, boolean showDeleteAnywayButton, EOModelEditor editor) {
super(parentShell);
_failures = failures;
_showDeleteAnywayButton = showDeleteAnywayButton;
_editor = editor;
}
protected void configureShell(Shell _newShell) {
super.configureShell(_newShell);
_newShell.setText("EOModel Verification Failures");
}
@Override
protected int getShellStyle() {
return super.getShellStyle() | SWT.RESIZE;
}
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
if (_editor == null) {
IWorkbenchWindow activeWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (activeWindow != null) {
IEditorPart editorPart = activeWindow.getActivePage().getActiveEditor();
if (editorPart instanceof EOModelEditor) {
_editor = (EOModelEditor) editorPart;
}
}
}
final ScrolledComposite scrollComposite = new ScrolledComposite(composite, SWT.V_SCROLL | SWT.BORDER);
scrollComposite.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_WHITE));
GridData failuresGridData = new GridData(GridData.FILL_BOTH);
failuresGridData.widthHint = 500;
failuresGridData.heightHint = 400;
scrollComposite.setLayoutData(failuresGridData);
final Composite failuresComposite = new Composite(scrollComposite, SWT.NONE);
failuresComposite.setBackground(scrollComposite.getBackground());
int columns = (_editor == null) ? 2 : 3;
GridLayout layout = new GridLayout(columns, false);
failuresComposite.setLayout(layout);
Iterator<? extends EOModelVerificationFailure> failuresIter = _failures.iterator();
if (!failuresIter.hasNext()) {
Label failedObjectLabel = new Label(failuresComposite, SWT.NONE);
failedObjectLabel.setBackground(failuresComposite.getBackground());
failedObjectLabel.setText("There are no verification failures with this model group.");
failedObjectLabel.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
failedObjectLabel.setAlignment(SWT.CENTER);
failedObjectLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
}
int count = 0;
while (failuresIter.hasNext()) {
if (++count > 100) {
break;
}
EOModelVerificationFailure failure = failuresIter.next();
Label iconLabel = new Label(failuresComposite, SWT.NONE);
iconLabel.setBackground(failuresComposite.getBackground());
if (failure.isWarning()) {
iconLabel.setImage(composite.getDisplay().getSystemImage(SWT.ICON_WARNING));
} else {
iconLabel.setImage(composite.getDisplay().getSystemImage(SWT.ICON_ERROR));
}
GridData iconLabelData = new GridData();
iconLabelData.verticalIndent = 3;
iconLabelData.verticalAlignment = SWT.BEGINNING;
iconLabelData.horizontalIndent = 3;
iconLabel.setLayoutData(iconLabelData);
Composite groupFailureComposite = new Composite(failuresComposite, SWT.NONE);
groupFailureComposite.setBackground(failuresComposite.getBackground());
groupFailureComposite.setLayout(new GridLayout(1, true));
GridData groupFailureLabelData = new GridData(GridData.FILL_HORIZONTAL);
//groupFailureLabelData.verticalIndent = 3;
// failureLabelData.verticalAlignment = SWT.BEGINNING;
groupFailureLabelData.horizontalIndent = 3;
groupFailureComposite.setLayoutData(groupFailureLabelData);
Label failedObjectLabel = new Label(groupFailureComposite, SWT.NONE);
failedObjectLabel.setBackground(failuresComposite.getBackground());
EOModelObject failedObject = failure.getFailedObject();
if (failedObject != null) {
failedObjectLabel.setText(failedObject.getFullyQualifiedName());
}
else {
failedObjectLabel.setText("General Failure");
}
failedObjectLabel.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
failedObjectLabel.setForeground(failuresComposite.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
failedObjectLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
StyledText failureLabel = new StyledText(groupFailureComposite, SWT.WRAP);
failureLabel.setEditable(false);
failureLabel.setWordWrap(true);
failureLabel.setEnabled(false);
String failureMessage = failure.getMessage();
failureLabel.setText(failureMessage);
GridData failureLabelData = new GridData(GridData.FILL_HORIZONTAL);
//failureLabelData.verticalIndent = 3;
// failureLabelData.verticalAlignment = SWT.BEGINNING;
//failureLabelData.horizontalIndent = 3;
failureLabel.setLayoutData(failureLabelData);
if (_editor != null && failure.getFailedObject() != null) {
Button showButton = new Button(failuresComposite, SWT.PUSH);
showButton.setText("Show");
GridData showButtonData = new GridData();
showButtonData.verticalAlignment = SWT.CENTER;
showButtonData.horizontalIndent = 3;
showButton.setLayoutData(showButtonData);
showButton.setData(failure);
showButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
public void widgetSelected(SelectionEvent e) {
EOModelVerificationFailure selectedFailure = (EOModelVerificationFailure) ((Widget) e.getSource()).getData();
if (selectedFailure != null && _editor != null && selectedFailure.getFailedObject() != null) {
_editor.getContentOutlinePage().showModelGroup();
_editor.setSelection(new StructuredSelection(selectedFailure.getFailedObject()));
EOModelErrorDialog.this.close();
}
}
});
}
Matcher matcher = Pattern.compile("(\\S+: \\S+)").matcher(failureMessage);
while (matcher.find()) {
int start = matcher.start(1);
int end = matcher.end(1);
StyleRange styleRange = new StyleRange();
styleRange.start = start;
styleRange.length = (end - start);
styleRange.fontStyle = SWT.BOLD;
// styleRange.foreground = orange;
failureLabel.setStyleRange(styleRange);
}
if (failuresIter.hasNext()) {
Composite separator = new Composite(failuresComposite, SWT.NONE);
separator.setBackground(failuresComposite.getDisplay().getSystemColor(SWT.COLOR_GRAY));
GridData separatorData = new GridData(GridData.FILL_HORIZONTAL);
separatorData.heightHint = 1;
separatorData.verticalIndent = 3;
separatorData.horizontalSpan = columns;
separator.setLayoutData(separatorData);
}
}
scrollComposite.setContent(failuresComposite);
scrollComposite.setExpandVertical(true);
scrollComposite.setExpandHorizontal(true);
scrollComposite.addControlListener(new ControlAdapter() {
public void controlResized(ControlEvent e) {
Rectangle r = scrollComposite.getClientArea();
scrollComposite.setMinSize(failuresComposite.computeSize(r.width, SWT.DEFAULT));
}
});
return composite;
}
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
if (_showDeleteAnywayButton) {
createButton(parent, EOModelErrorDialog.DELETE_ANYWAY_ID, "Delete Anyway", false);
}
}
protected void buttonPressed(int buttonId) {
if (buttonId == EOModelErrorDialog.DELETE_ANYWAY_ID) {
setReturnCode(EOModelErrorDialog.DELETE_ANYWAY_ID);
close();
} else {
super.buttonPressed(buttonId);
}
}
protected static class FailureLabelProvider implements ILabelProvider {
public void addListener(ILabelProviderListener listener) {
// DO NOTHING
}
public void dispose() {
// DO NOTHING
}
public Image getImage(Object element) {
return null;
}
public String getText(Object element) {
EOModelVerificationFailure failure = (EOModelVerificationFailure) element;
return failure.getMessage();
}
public boolean isLabelProperty(Object element, String property) {
return true;
}
public void removeListener(ILabelProviderListener listener) {
// DO NOTHING
}
}
protected static class FailureContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement) {
Collection failures = (Collection) inputElement;
return failures.toArray();
}
public void dispose() {
// DO NOTHING
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// DO NOTHING
}
}
}