/**
* @version $Id: StatusDialog.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2012/01/25 10:32:55
* @author kousuke-morishima
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona.internal.ui.component;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
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.Table;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
/**
* @author kousuke-morishima
*/
public class StatusDialog extends Dialog {
public StatusDialog(Shell shell) {
super(shell);
}
Label message;
TableViewer viewer;
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
message = new Label(composite, SWT.NONE);
message.setText("エラーが発生しました。");
Table t = new Table(composite, SWT.BORDER | SWT.FULL_SELECTION | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
t.setLinesVisible(true);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.widthHint = 480;
gd.heightHint = 200;
t.setLayoutData(gd);
Button clearButton = new Button(composite, SWT.PUSH);
clearButton.setText("クリア");
clearButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
clearInput();
}
});
clearButton.setVisible(showClearButton);
viewer = new TableViewer(t);
viewer.setContentProvider(new ArrayContentProvider());
viewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof IStatus) {
Throwable t = ((IStatus) element).getException();
if (t == null) {
return ((IStatus) element).getMessage();
} else {
return t.toString() + " : " + ((IStatus) element).getMessage();
}
}
return element.toString();
}
@Override
public Image getImage(Object element) {
if (element instanceof IStatus) {
if (((IStatus) element).getSeverity() == IStatus.ERROR) {
return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
} else if (((IStatus) element).getSeverity() == IStatus.WARNING) {
return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_WARN_TSK);
}
}
return null;
}
});
viewer.setInput(input);
return composite;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
}
@Override
protected void okPressed() {
input.clear();
super.okPressed();
}
void clearInput() {
input.clear();
if (viewer != null) {
viewer.refresh();
}
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText("エラー");
}
@Override
protected boolean isResizable() {
return true;
}
private boolean showClearButton;
/**
* クリアボタンを表示するかどうかを指定する。このメソッドは、 {@link #open()}の呼び出し前にのみ効果を発揮する
*
* @param show
* クリアボタンを表示するならtrue
*/
public void setShowClearButton(boolean show) {
if (showClearButton != show) {
showClearButton = show;
}
}
private Set<IStatus> input = new TreeSet<IStatus>(new Comparator<IStatus>() {
@Override
public int compare(IStatus o1, IStatus o2) {
String m2 = o2.getMessage();
if (m2 == null) {
return -1;
}
String m1 = o1.getMessage();
if (m1 == null) {
return 1;
}
return m1.compareTo(m2);
}
});
public boolean add(IStatus status) {
if (input.add(status)) {
if (viewer != null) {
viewer.refresh();
}
return true;
}
return false;
}
@Override
protected void setShellStyle(int newShellStyle) {
newShellStyle = newShellStyle & (~SWT.APPLICATION_MODAL | SWT.MODELESS);
super.setShellStyle(newShellStyle);
}
/* ****************************************
* 開いているか
*/
@Override
public int open() {
opened = true;
return super.open();
}
@Override
public boolean close() {
opened = false;
return super.close();
}
private boolean opened = false;
public boolean isOpened() {
return opened;
}
}