package com.aelitis.azureus.ui.swt.views.skin;
import java.util.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.AESemaphore2;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.ui.swt.Utils;
import com.aelitis.azureus.ui.UIFunctionsUserPrompter;
import com.aelitis.azureus.ui.UserPrompterResultListener;
import com.aelitis.azureus.ui.swt.skin.*;
import com.aelitis.azureus.ui.swt.views.skin.SkinnedDialog.SkinnedDialogClosedListener;
public class VuzeMessageBox
implements UIFunctionsUserPrompter, SkinnedDialogClosedListener
{
private String title;
private String text;
private int result = -1;
private ArrayList<UserPrompterResultListener> resultListeners = new ArrayList<UserPrompterResultListener>(1);
private VuzeMessageBoxListener vuzeMessageBoxListener;
private SWTSkinObjectContainer soExtra;
private SkinnedDialog dlg;
private String iconResource;
private String subtitle;
private java.util.List<rbInfo> listRBs = new ArrayList<rbInfo>();
private SWTSkin skin;
private String textIconResource;
private boolean closed;
private boolean opened;
private StandardButtonsArea buttonsArea;
public VuzeMessageBox(final String title, final String text,
final String[] buttons, final int defaultOption) {
this.title = title;
this.text = text;
buttonsArea = new StandardButtonsArea() {
// @see com.aelitis.azureus.ui.swt.views.skin.StandardButtonsArea#clicked(int)
protected void clicked(int buttonValue) {
closeWithButtonVal(buttonValue);
}
};
buttonsArea.setButtonIDs(buttons);
buttonsArea.setDefaultButtonPos(defaultOption);
}
public void setButtonEnabled(final int buttonVal, final boolean enable) {
buttonsArea.setButtonEnabled(buttonVal, enable);
}
public void setButtonVals(Integer[] buttonVals) {
buttonsArea.setButtonVals(buttonVals);
}
public void setSubTitle(String s) {
subtitle = s;
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#getAutoCloseInMS()
*/
public int getAutoCloseInMS() {
return 0;
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#getHtml()
*/
public String getHtml() {
return null;
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#getRememberID()
*/
public String getRememberID() {
return null;
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#getRememberText()
*/
public String getRememberText() {
return null;
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#isAutoClosed()
*/
public boolean isAutoClosed() {
return false;
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#open(com.aelitis.azureus.ui.UserPrompterResultListener)
*/
public void open(final UserPrompterResultListener l) {
opened = true;
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
// catch someone calling close() while we are opening
if (closed) {
return;
}
synchronized (VuzeMessageBox.this) {
_open(l);
}
}
});
}
protected void _open(UserPrompterResultListener l) {
if (l != null) {
synchronized (resultListeners) {
resultListeners.add(l);
}
}
dlg = new SkinnedDialog("skin3_dlg_generic", "shell", SWT.DIALOG_TRIM) {
protected void setSkin(SWTSkin skin) {
super.setSkin(skin);
//skin.DEBUGLAYOUT = true;
VuzeMessageBox.this.skin = skin;
synchronized (listRBs) {
for (rbInfo rb : listRBs) {
addResourceBundle(rb.cla, rb.path, rb.name);
}
listRBs.clear();
}
}
};
dlg.setTitle(title);
dlg.addCloseListener(this);
SWTSkinObjectText soTopTitle = (SWTSkinObjectText) skin.getSkinObject("top-title");
if (soTopTitle != null) {
soTopTitle.setText(subtitle == null ? title : subtitle);
}
SWTSkinObjectText soText = (SWTSkinObjectText) skin.getSkinObject("middle-title");
if (soText != null) {
soText.setText(text);
}
if (iconResource != null) {
SWTSkinObjectImage soTopLogo = (SWTSkinObjectImage) dlg.getSkin().getSkinObject("top-logo");
if (soTopLogo != null) {
soTopLogo.setImageByID(iconResource, null);
}
}
if (textIconResource != null) {
SWTSkinObjectImage soIcon = (SWTSkinObjectImage) dlg.getSkin().getSkinObject("text-icon");
if (soIcon != null) {
soIcon.setImageByID(textIconResource, null);
}
}
if (iconResource == null && textIconResource == null && soTopTitle != null && soText != null) {
soTopTitle.setStyle(soText.getStyle() & ~(SWT.RIGHT | SWT.CENTER));
}
SWTSkinObjectContainer soBottomArea = (SWTSkinObjectContainer) skin.getSkinObject("bottom-area");
if (soBottomArea != null) {
if (buttonsArea.getButtonCount() == 0) {
soBottomArea.setVisible(false);
} else {
buttonsArea.swt_createButtons(soBottomArea.getComposite());
}
}
if (vuzeMessageBoxListener != null) {
soExtra = (SWTSkinObjectContainer) skin.getSkinObject("middle-extra");
try {
vuzeMessageBoxListener.shellReady(dlg.getShell(), soExtra);
} catch (Exception e) {
Debug.out(e);
}
}
if (closed) {
return;
}
dlg.open();
}
public Button[] getButtons() {
return buttonsArea.getButtons();
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#setAutoCloseInMS(int)
*/
public void setAutoCloseInMS(int autoCloseInMS) {
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#setHtml(java.lang.String)
*/
public void setHtml(String html) {
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#setIconResource(java.lang.String)
*/
public void setIconResource(String resource) {
this.iconResource = resource;
if (dlg != null) {
SWTSkinObjectImage soTopLogo = (SWTSkinObjectImage) dlg.getSkin().getSkinObject("top-logo");
if (soTopLogo != null) {
soTopLogo.setImageByID(iconResource, null);
}
}
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#setRelatedObject(java.lang.Object)
*/
public void setRelatedObject(Object relatedObject) {
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#setRelatedObjects(java.lang.Object[])
*/
public void setRelatedObjects(Object[] relatedObjects) {
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#setRemember(java.lang.String, boolean, java.lang.String)
*/
public void setRemember(String rememberID, boolean rememberByDefault,
String rememberText) {
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#setRememberText(java.lang.String)
*/
public void setRememberText(String rememberText) {
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#setUrl(java.lang.String)
*/
public void setUrl(String url) {
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#waitUntilClosed()
*/
public int waitUntilClosed() {
if (opened) {
final AESemaphore2 sem = new AESemaphore2("waitUntilClosed");
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (dlg == null) {
sem.release();
return;
}
if (!opened) {
dlg.open();
}
Shell shell = dlg.getShell();
if (shell == null || shell.isDisposed()) {
sem.release();
return;
}
shell.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
sem.release();
}
});
}
});
if (Utils.isThisThreadSWT()) {
// on swt thread, so execSWTThread just ran and we should have a shell
if (dlg != null) {
Shell shell = dlg.getShell();
if (shell != null) {
Display d = shell.getDisplay();
while (!shell.isDisposed()) {
if (!d.readAndDispatch()) {
d.sleep();
}
}
}
return buttonsArea.getButtonVal(result);
}
}
sem.reserve();
}
return buttonsArea.getButtonVal(result);
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.swt.views.skin.SkinnedDialog.SkinnedDialogClosedListener#skinDialogClosed(com.aelitis.azureus.ui.swt.views.skin.SkinnedDialog)
*/
public void skinDialogClosed(SkinnedDialog dialog) {
synchronized (resultListeners) {
int realResult = buttonsArea.getButtonVal(result);
for (UserPrompterResultListener l : resultListeners) {
try {
l.prompterClosed(realResult);
} catch (Exception e) {
Debug.out(e);
}
}
}
}
public void setListener(VuzeMessageBoxListener l) {
this.vuzeMessageBoxListener = l;
}
/**
* @deprecated Since buttons can swap around, you should use {@link #closeWithButtonVal(int)}
*/
public void close(int buttonNo) {
synchronized (VuzeMessageBox.this) {
this.closed = true;
this.result = buttonNo;
if (dlg != null) {
dlg.close();
}
}
}
public void closeWithButtonVal(int buttonVal) {
synchronized (VuzeMessageBox.this) {
this.closed = true;
this.result = buttonsArea.getButtonPosFromVal(buttonVal);
if (dlg != null) {
dlg.close();
}
}
}
public void addResourceBundle(Class<?> cla, String path, String name) {
synchronized (listRBs) {
if (skin == null) {
listRBs.add(new rbInfo(cla, path, name));
return;
}
}
String sFile = path + name;
ClassLoader loader = cla.getClassLoader();
ResourceBundle subBundle = ResourceBundle.getBundle(sFile,
Locale.getDefault(), loader);
SWTSkinProperties skinProperties = skin.getSkinProperties();
skinProperties.addResourceBundle(subBundle, path, loader);
}
public void setTextIconResource(String resource) {
this.textIconResource = resource;
if (dlg != null) {
SWTSkinObjectImage soIcon = (SWTSkinObjectImage) dlg.getSkin().getSkinObject("text-icon");
if (soIcon != null) {
soIcon.setImageByID(textIconResource, null);
}
}
}
public void addListener(UserPrompterResultListener l) {
if (l == null) {
return;
}
synchronized (resultListeners) {
resultListeners.add(l);
}
}
public void setDefaultButtonByPos(int pos) {
if (dlg == null) {
buttonsArea.setDefaultButtonPos(pos);
}
}
private static class rbInfo {
public rbInfo(Class<?> cla, String path, String name) {
super();
this.cla = cla;
this.path = path;
this.name = name;
}
Class<?> cla;
String path;
String name;
}
// @see com.aelitis.azureus.ui.UIFunctionsUserPrompter#setOneInstanceOf(java.lang.String)
public void setOneInstanceOf(String instanceID) {
// TODO Auto-generated method stub
}
}