package org.esa.snap.netbeans.docwin;
import org.esa.snap.netbeans.docwin.DocumentWindowManager.Predicate;
import org.junit.Test;
import org.junit.runner.RunWith;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.io.File;
import static org.junit.Assert.*;
/**
* Manages global opening, closing, and selection of {@link DocumentWindow}s.
*
* @author Norman Fomferra
* @since 2.0
*/
@RunWith(HeadlessTestRunner.class)
public class DocumentWindowManagerTest {
@Test
public void testListeners() throws Exception {
Listener1 listener1 = new Listener1();
Listener2 listener2 = new Listener2();
Listener3 listener3 = new Listener3();
Listener4 listener4 = new Listener4();
Listener5 listener5 = new Listener5();
DocumentWindowManager.getDefault().addListener(listener1);
DocumentWindowManager.getDefault().addListener(Predicate.doc(String.class), listener2);
DocumentWindowManager.getDefault().addListener(Predicate.doc(File.class), listener3);
DocumentWindowManager.getDefault().addListener(Predicate.doc(File2.class), listener4);
DocumentWindowManager.getDefault().addListener(Predicate.docView(File2.class, MyPanel.class), listener5);
MyDocumentTopComponent<String, JLabel> window1 = MyDocumentTopComponent.create("string");
MyDocumentTopComponent<File, JLabel> window2 = MyDocumentTopComponent.create(new File("file"));
MyDocumentTopComponent<File2, MyPanel> window3 = new MyDocumentTopComponent<>(new File2("file2"), new MyPanel());
DocumentWindowManager.getDefault().openWindow(window1);
DocumentWindowManager.getDefault().openWindow(window2);
DocumentWindowManager.getDefault().openWindow(window3);
DocumentWindowManager.getDefault().closeWindow(window1);
DocumentWindowManager.getDefault().closeWindow(window2);
DocumentWindowManager.getDefault().closeWindow(window3);
assertEquals("windowOpened(string);windowOpened(file);windowOpened(file2);" +
"windowClosed(string);windowClosed(file);windowClosed(file2);", listener1.trace);
assertEquals("windowOpened(string);" +
"windowClosed(string);", listener2.trace);
assertEquals("windowOpened(file);windowOpened(file2);" +
"windowClosed(file);windowClosed(file2);", listener3.trace);
assertEquals("windowOpened(file2);" +
"windowClosed(file2);", listener4.trace);
assertEquals("windowOpened(file2, MyPanel);" +
"windowClosed(file2, MyPanel);", listener5.trace);
assertEquals(5, DocumentWindowManager.getDefault().getListeners().length);
assertEquals(2, DocumentWindowManager.getDefault().getListeners(window1).length);
assertEquals(2, DocumentWindowManager.getDefault().getListeners(window2).length);
assertEquals(4, DocumentWindowManager.getDefault().getListeners(window3).length);
DocumentWindowManager.getDefault().removeListener(listener1);
assertEquals(4, DocumentWindowManager.getDefault().getListeners().length);
assertEquals(1, DocumentWindowManager.getDefault().getListeners(window1).length);
assertEquals(1, DocumentWindowManager.getDefault().getListeners(window2).length);
assertEquals(3, DocumentWindowManager.getDefault().getListeners(window3).length);
DocumentWindowManager.getDefault().removeListener(Predicate.doc(String.class), listener2);
assertEquals(3, DocumentWindowManager.getDefault().getListeners().length);
assertEquals(0, DocumentWindowManager.getDefault().getListeners(window1).length);
assertEquals(1, DocumentWindowManager.getDefault().getListeners(window2).length);
assertEquals(3, DocumentWindowManager.getDefault().getListeners(window3).length);
DocumentWindowManager.getDefault().removeListener(Predicate.doc(File2.class), listener4);
assertEquals(2, DocumentWindowManager.getDefault().getListeners().length);
assertEquals(0, DocumentWindowManager.getDefault().getListeners(window1).length);
assertEquals(1, DocumentWindowManager.getDefault().getListeners(window2).length);
assertEquals(2, DocumentWindowManager.getDefault().getListeners(window3).length);
DocumentWindowManager.getDefault().removeListener(Predicate.doc(File.class), listener3);
assertEquals(1, DocumentWindowManager.getDefault().getListeners().length);
assertEquals(0, DocumentWindowManager.getDefault().getListeners(window1).length);
assertEquals(0, DocumentWindowManager.getDefault().getListeners(window2).length);
assertEquals(1, DocumentWindowManager.getDefault().getListeners(window3).length);
DocumentWindowManager.getDefault().removeListener(Predicate.docView(File2.class, MyPanel.class), listener5);
assertEquals(0, DocumentWindowManager.getDefault().getListeners().length);
assertEquals(0, DocumentWindowManager.getDefault().getListeners(window1).length);
assertEquals(0, DocumentWindowManager.getDefault().getListeners(window2).length);
assertEquals(0, DocumentWindowManager.getDefault().getListeners(window3).length);
}
private static class Listener1 implements DocumentWindowManager.Listener {
String trace = "";
@Override
public void windowOpened(DocumentWindowManager.Event e) {
trace += String.format("windowOpened(%s);", e.getWindow().getDocument());
}
@Override
public void windowClosed(DocumentWindowManager.Event e) {
trace += String.format("windowClosed(%s);", e.getWindow().getDocument());
}
@Override
public void windowSelected(DocumentWindowManager.Event e) {
}
@Override
public void windowDeselected(DocumentWindowManager.Event e) {
}
}
private static class Listener2 implements DocumentWindowManager.Listener<String, Object> {
String trace = "";
@Override
public void windowOpened(DocumentWindowManager.Event<String, Object> e) {
trace += String.format("windowOpened(%s);", e.getWindow().getDocument());
}
@Override
public void windowClosed(DocumentWindowManager.Event<String, Object> e) {
trace += String.format("windowClosed(%s);", e.getWindow().getDocument());
}
@Override
public void windowSelected(DocumentWindowManager.Event<String, Object> e) {
}
@Override
public void windowDeselected(DocumentWindowManager.Event<String, Object> e) {
}
}
private static class Listener3 implements DocumentWindowManager.Listener<File, Object> {
String trace = "";
@Override
public void windowOpened(DocumentWindowManager.Event<File, Object> e) {
trace += String.format("windowOpened(%s);", e.getWindow().getDocument());
}
@Override
public void windowClosed(DocumentWindowManager.Event<File, Object> e) {
trace += String.format("windowClosed(%s);", e.getWindow().getDocument());
}
@Override
public void windowSelected(DocumentWindowManager.Event<File, Object> e) {
}
@Override
public void windowDeselected(DocumentWindowManager.Event<File, Object> e) {
}
}
private static class Listener4 implements DocumentWindowManager.Listener<File2, Object> {
String trace = "";
@Override
public void windowOpened(DocumentWindowManager.Event<File2, Object> e) {
trace += String.format("windowOpened(%s);", e.getWindow().getDocument());
}
@Override
public void windowClosed(DocumentWindowManager.Event<File2, Object> e) {
trace += String.format("windowClosed(%s);", e.getWindow().getDocument());
}
@Override
public void windowSelected(DocumentWindowManager.Event<File2, Object> e) {
}
@Override
public void windowDeselected(DocumentWindowManager.Event<File2, Object> e) {
}
}
private static class Listener5 implements DocumentWindowManager.Listener<File2, MyPanel> {
String trace = "";
@Override
public void windowOpened(DocumentWindowManager.Event<File2, MyPanel> e) {
trace += String.format("windowOpened(%s, %s);", e.getWindow().getDocument(), e.getWindow().getView());
}
@Override
public void windowClosed(DocumentWindowManager.Event<File2, MyPanel> e) {
trace += String.format("windowClosed(%s, %s);", e.getWindow().getDocument(), e.getWindow().getView());
}
@Override
public void windowSelected(DocumentWindowManager.Event<File2, MyPanel> e) {
}
@Override
public void windowDeselected(DocumentWindowManager.Event<File2, MyPanel> e) {
}
}
public static class File2 extends File {
public File2(String pathname) {
super(pathname);
}
}
public static class MyPanel extends JPanel {
@Override
public String toString() {
return "MyPanel";
}
}
private static class MyDocumentTopComponent<D, V> extends DocumentTopComponent<D, V> {
V view;
static <D> MyDocumentTopComponent<D, JLabel> create(D doc) {
return new MyDocumentTopComponent<>(doc, new JLabel(doc + ""));
}
public MyDocumentTopComponent(D doc, V view) {
super(doc);
this.view = view;
}
@Override
public V getView() {
return view;
}
}
}