/*
 * Copyright © 2000-2005 Canoo Engineering AG, Switzerland.
 */
package eventextension;

import com.ulcjava.base.application.AbstractApplication;
import com.ulcjava.base.application.ApplicationContext;
import com.ulcjava.base.application.ULCBoxPane;
import com.ulcjava.base.application.ULCButton;
import com.ulcjava.base.application.ULCFrame;
import com.ulcjava.base.application.event.IWindowListener;
import com.ulcjava.base.application.event.WindowEvent;
import com.ulcjava.base.application.event.serializable.IActionListener;
import com.ulcjava.base.client.UIFrame;
import com.ulcjava.base.development.DevelopmentRunner;
import com.ulcjava.base.shared.UlcEventCategories;

public class WindowClosedEventSnippet2 extends AbstractApplication {
	public void start() {
		ULCBoxPane box = new ULCBoxPane(true);
		ULCButton but = new ULCButton("Dispose");

		box.add(but);

		final ULCMyFrame frame = new ULCMyFrame("WindowClosedEventSnippet2");

		but.addActionListener(new IActionListener() {
			public void actionPerformed(
					com.ulcjava.base.application.event.ActionEvent event) {
				frame.dispose();
			}

		});
		frame.add(box);
		frame.setDefaultCloseOperation(ULCFrame.DISPOSE_ON_CLOSE);
		frame.addWindowListener(new WindowClosedListener());

		frame.setSize(300, 300);
		frame.setVisible(true);
	}

	public static void main(String[] args) {
		DevelopmentRunner.setApplicationClass(WindowClosedEventSnippet2.class);
		DevelopmentRunner.run();
	}

	// Server side
	public static class ULCMyFrame extends ULCFrame {
		protected Class getWindowListenerClass() {
			return IWindowClosedListener.class;
		}

		public ULCMyFrame(String string) {
			super(string);
			// workaround for bug so that DISPOSE can be set on client
			setDefaultCloseOperation(ULCFrame.HIDE_ON_CLOSE);
		}

		protected String typeString() {
			return UIMyFrame.class.getName();
		}

		public void dispose() {
			super.dispose();
			dispatchEvent(UlcEventCategories.WINDOW_EVENT_CATEGORY,
					"windowClosed", new WindowEvent(this));
		}

	}

	public static interface IWindowClosedListener extends IWindowListener {
		public void windowClosed(WindowEvent event);
	}

	public static class WindowClosedListener implements IWindowClosedListener {

		public void windowClosed(WindowEvent event) {
			System.out.println("My Window closed");
			ApplicationContext.terminate();
		}

		public void windowClosing(WindowEvent event) {
			System.out.println("My Window Closing");
		}

	}

	// Client Side
	public static class UIMyFrame extends UIFrame {
		private boolean disposeWindowCalled = false;

		public void disposeWindow() {
			super.disposeWindow();
			disposeWindowCalled = true;
		}

		public void windowClosed(java.awt.event.WindowEvent e) {
			super.windowClosed(e);
			 if (!disposeWindowCalled) {
			fireEventULC(UlcEventCategories.WINDOW_EVENT_CATEGORY, "windowClosed", EMPTY_ARGUMENTS);
			} else {
			 disposeWindowCalled = false;
			}
		}
	}

}
