/**
* Copyright (c) 2005-2007 IBM Corporation 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:
* IBM - Initial API and implementation
*/
package org.eclipse.emf.converter.util;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.emf.common.ui.DiagnosticComposite;
import org.eclipse.emf.common.ui.dialogs.DiagnosticDialog;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.converter.ConverterPlugin;
import org.eclipse.emf.converter.util.ConverterUtil.ShellFinder;
/**
* @since 2.2.0
*/
public class ConverterUIUtil
{
public static class TreeCheckStateManager implements Listener
{
protected Tree tree;
protected boolean internalChange = false;
public TreeCheckStateManager(Tree tree)
{
this.tree = tree;
tree.addListener(SWT.Selection, this);
tree.addListener(SWT.Dispose, this);
}
public void handleEvent(Event event)
{
if (!internalChange)
{
if (event.widget == tree && event.detail == SWT.CHECK)
{
switch (event.type)
{
case SWT.Selection:
try
{
internalChange = true;
checkStateChanged((TreeItem)event.item, true);
}
finally
{
internalChange = false;
}
break;
case SWT.Dispose:
treeDisposed();
break;
}
}
}
}
protected void checkStateChanged(TreeItem item, boolean changeChildren)
{
setGray(item, false);
TreeItem[] sibilings = item.getParentItem() != null ?
item.getParentItem().getItems() :
item.getParent().getItems();
boolean checked = item.getChecked();
if (changeChildren) checkChildren(item, checked);
boolean grayParent = false;
for (int i = 0; i < sibilings.length; i++)
{
TreeItem sibiling = sibilings[i];
if (checked ? !sibiling.getChecked() : sibiling.getChecked())
{
grayParent = true;
break;
}
}
if (grayParent)
{
grayParents(item);
}
else
{
TreeItem parent = item.getParentItem();
if (parent != null)
{
setCheck(parent, checked);
setGray(parent, false);
checkStateChanged(parent, false);
}
}
}
protected void treeDisposed()
{
if (!tree.isDisposed())
{
tree.removeListener(SWT.Selection, this);
tree.removeListener(SWT.Dispose, this);
}
tree = null;
}
protected void grayParents(TreeItem item)
{
item = item.getParentItem();
while (item != null)
{
setCheck(item, true);
setGray(item, true);
item = item.getParentItem();
}
}
protected void checkChildren(TreeItem item, boolean check)
{
TreeItem[] items = item.getItems();
for (int i = 0; i < items.length; i++)
{
TreeItem child = items[i];
setCheck(child, check);
setGray(child, false);
checkChildren(child, check);
}
}
protected void setCheck(TreeItem item, boolean check)
{
if (item.getChecked() != check)
{
item.setChecked(check);
tree.notifyListeners(SWT.Selection, createCheckEvent(item));
}
}
protected Event createCheckEvent(TreeItem item)
{
Event event = new Event();
event.type = SWT.Selection;
event.widget = item.getParent();
event.item = item;
event.detail = SWT.CHECK;
event.display = item.getDisplay();
return event;
}
protected void setGray(TreeItem item, boolean gray)
{
if (item.getGrayed() != gray) item.setGrayed(gray);
}
}
public static class DiagnosticHandler
{
public void handleDiagnostic(Diagnostic diagnostic)
{
handleDiagnostic(diagnostic, null, null, null);
}
public void handleDiagnostic(Diagnostic diagnostic, String message, String dialogTitle, String dialogMessage)
{
if (diagnostic.getSeverity() == Diagnostic.OK)
{
handleOKDiagnostic(diagnostic, message, dialogTitle, dialogMessage);
}
else
{
handleNotOKDiagnostic(diagnostic, decodeAction(diagnostic), message, dialogTitle, dialogMessage);
}
}
protected boolean doMessages()
{
return false;
}
protected void setMessage(String message)
{
// Subclasses may override
}
protected void setMessage(String message, int messageType)
{
// Subclasses may override
}
protected void setErrorMessage(String message)
{
// Subclasses may override
}
protected boolean doDialog()
{
return true;
}
protected Shell getShell()
{
return (Shell)ShellFinder.getActiveShell();
}
protected ConverterUtil.DecodedAction decodeAction(Diagnostic diagnostic)
{
int actionCode = ConverterUtil.computeActionCode(diagnostic);
return ConverterUtil.decodeAction(actionCode);
}
protected void handleOKDiagnostic(Diagnostic diagnostic, String message, String dialogTitle, String dialogMessage)
{
setMessage(null);
setErrorMessage(null);
}
protected void handleNotOKDiagnostic(Diagnostic diagnostic, ConverterUtil.DecodedAction decodedAction, String message, String dialogTitle, String dialogMessage)
{
int messageType = 0;
switch(diagnostic.getSeverity())
{
case Diagnostic.INFO:
{
messageType = IMessageProvider.INFORMATION;
if (dialogTitle == null) dialogTitle = ConverterPlugin.INSTANCE.getString("_UI_DialogInformation_title");
break;
}
case Diagnostic.WARNING:
messageType = IMessageProvider.WARNING;
if (dialogTitle == null) dialogTitle = ConverterPlugin.INSTANCE.getString("_UI_DialogWarning_title");
break;
case Diagnostic.ERROR:
messageType = IMessageProvider.ERROR;
if (dialogTitle == null) dialogTitle = ConverterPlugin.INSTANCE.getString("_UI_DialogError_title");
break;
}
if (doMessages())
{
if (message == null) message = diagnostic.getMessage();
setErrorMessage(null);
setMessage(null);
switch(decodedAction.message)
{
case ConverterUtil.ACTION_MESSAGE_SET:
{
setMessage(message);
break;
}
case ConverterUtil.ACTION_DEFAULT:
case ConverterUtil.ACTION_MESSAGE_SET_TYPED:
{
if (messageType == IMessageProvider.ERROR)
{
setErrorMessage(message);
}
else
{
setMessage(message, messageType);
}
break;
}
case ConverterUtil.ACTION_MESSAGE_SET_ERROR:
{
setErrorMessage(message);
break;
}
}
}
if (doDialog())
{
switch(decodedAction.dialog)
{
case ConverterUtil.ACTION_DEFAULT:
case ConverterUtil.ACTION_DIALOG_SHOW_IF_HAS_CHILD:
{
if (!diagnostic.getChildren().isEmpty())
{
DiagnosticDialog.openProblem(getShell(), dialogTitle, dialogMessage, diagnostic);
}
break;
}
case ConverterUtil.ACTION_DIALOG_SHOW:
{
DiagnosticDialog.openProblem(getShell(), dialogTitle, dialogMessage, diagnostic);
break;
}
case ConverterUtil.ACTION_DIALOG_SHOW_ERROR:
{
new DiagnosticDialog(getShell(),
dialogTitle,
dialogMessage,
diagnostic,
DiagnosticComposite.ERROR_WARNING_MASK)
{
@Override
protected Image getImage()
{
return getErrorImage();
}
}.open();
break;
}
}
}
}
}
}