/**
* Created on Dec 23, 2008
*
* Copyright 2008 Vuze, Inc. All rights reserved.
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License only.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.aelitis.azureus.ui.swt.views.skin;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.widgets.Shell;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.components.shell.ShellFactory;
import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT;
import com.aelitis.azureus.ui.swt.skin.SWTSkin;
import com.aelitis.azureus.ui.swt.skin.SWTSkinFactory;
/**
* @author TuxPaper
* @created Dec 23, 2008
*
*/
public class SkinnedDialog
{
private final String shellSkinObjectID;
private Shell shell;
private SWTSkin skin;
private List<SkinnedDialogClosedListener> closeListeners = new CopyOnWriteArrayList<SkinnedDialogClosedListener>();
private Shell mainShell;
protected boolean disposed;
public SkinnedDialog(String skinFile, String shellSkinObjectID) {
this(skinFile, shellSkinObjectID, SWT.DIALOG_TRIM | SWT.RESIZE);
}
public SkinnedDialog(String skinFile, String shellSkinObjectID, int style) {
this.shellSkinObjectID = shellSkinObjectID;
mainShell = UIFunctionsManagerSWT.getUIFunctionsSWT().getMainShell();
shell = ShellFactory.createShell(mainShell, style);
Utils.setShellIcon(shell);
SWTSkin skin = SWTSkinFactory.getNonPersistentInstance(
SkinnedDialog.class.getClassLoader(), "com/aelitis/azureus/ui/skin/",
skinFile + ".properties");
setSkin(skin);
skin.initialize(shell, shellSkinObjectID);
shell.addTraverseListener(new TraverseListener() {
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_ESCAPE) {
shell.close();
}
}
});
shell.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
//skin.destroy;
disposed = true;
Utils.execSWTThreadLater(0, new AERunnable() {
public void runSupport() {
for (SkinnedDialogClosedListener l : closeListeners) {
try {
l.skinDialogClosed(SkinnedDialog.this);
} catch (Exception e2) {
Debug.out(e2);
}
}
}
});
}
});
disposed = false;
}
protected void setSkin(SWTSkin _skin) {
skin = _skin;
}
public void open() {
if (disposed) {
Debug.out("can't opened disposed skinnedialog");
return;
}
skin.layout();
Utils.verifyShellRect(shell, true);
Utils.centerWindowRelativeTo(shell, mainShell);
shell.open();
}
public SWTSkin getSkin() {
return skin;
}
/**
*
*
* @since 4.0.0.5
*/
public void close() {
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (disposed) {
return;
}
if (shell != null && !shell.isDisposed()) {
shell.close();
}
}
});
}
public void addCloseListener(SkinnedDialogClosedListener l) {
closeListeners.add(l);
}
public interface SkinnedDialogClosedListener
{
public void skinDialogClosed(SkinnedDialog dialog);
}
/**
* @param string
*
* @since 4.0.0.5
*/
public void setTitle(String string) {
if (!disposed && shell != null && !shell.isDisposed()) {
shell.setText(string);
}
}
/**
* @return the shell
*/
public Shell getShell() {
return shell;
}
public boolean isDisposed() {
return disposed || shell == null || shell.isDisposed();
}
}