package com.googlecode.lanterna.gui2;
import com.googlecode.lanterna.graphics.BasicTextImage;
import com.googlecode.lanterna.graphics.TextImage;
import com.googlecode.lanterna.input.*;
import com.googlecode.lanterna.screen.Screen;
import com.googlecode.lanterna.*;
import com.googlecode.lanterna.screen.VirtualScreen;
import com.googlecode.lanterna.gui2.Window.Hint;
import java.io.EOFException;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean
;
public class WindowList {
private final List<Window> windows = new LinkedList<>();
private final List<Window> stableOrderingOfWindows = new ArrayList<>();
private Window activeWindow = null;
private boolean hadWindowAtSomePoint = false;
public List<Window> getWindowsInZOrder() {
return Collections.unmodifiableList(windows);
}
public List<Window> getWindowsInStableOrder() {
return Collections.unmodifiableList(stableOrderingOfWindows);
}
public void setActiveWindow(Window activeWindow) {
this.activeWindow = activeWindow;
if (activeWindow != null) {
moveToTop(activeWindow);
}
}
public Window getActiveWindow() {
return activeWindow;
}
public void addWindow(Window window) {
if (!stableOrderingOfWindows.contains(window)) {
stableOrderingOfWindows.add(window);
}
if(!windows.contains(window)) {
windows.add(window);
}
if(!window.getHints().contains(Window.Hint.NO_FOCUS)) {
setActiveWindow(window);
}
hadWindowAtSomePoint = true;
}
public boolean removeWindow(Window window) {
boolean contained = windows.remove(window);
stableOrderingOfWindows.remove(window);
if(activeWindow == window) {
setActiveWindow(null);
for(int index = windows.size() - 1; index >= 0; index--) {
Window candidate = windows.get(index);
if(!candidate.getHints().contains(Window.Hint.NO_FOCUS)) {
setActiveWindow(candidate);
break;
}
}
}
return contained;
}
public boolean isHadWindowAtSomePoint() {
return hadWindowAtSomePoint;
}
public void moveToTop(Window window) {
if(!windows.contains(window)) {
throw new IllegalArgumentException("Window " + window + " isn't in MultiWindowTextGUI " + this);
}
windows.remove(window);
windows.add(window);
}
public void moveToBottom(Window window) {
if(!windows.contains(window)) {
throw new IllegalArgumentException("Window " + window + " isn't in MultiWindowTextGUI " + this);
}
windows.remove(window);
windows.add(0, window);
}
public void cycleActiveWindow(boolean reverse) {
if(windows.isEmpty() || windows.size() == 1 || (activeWindow != null && activeWindow.getHints().contains(Window.Hint.MODAL))) {
return;
}
Window originalActiveWindow = activeWindow;
Window nextWindow;
if(activeWindow == null) {
nextWindow = reverse ? windows.get(windows.size() - 1) : windows.get(0);
} else {
nextWindow = getNextWindow(reverse, activeWindow);
}
int noFocusWindows = 0;
while(nextWindow.getHints().contains(Window.Hint.NO_FOCUS)) {
++noFocusWindows;
if(noFocusWindows == windows.size()) {
return;
}
nextWindow = getNextWindow(reverse, nextWindow);
if(nextWindow == originalActiveWindow) {
return;
}
}
if(reverse) {
moveToTop(nextWindow);
} else if (originalActiveWindow != null) {
moveToBottom(originalActiveWindow);
}
setActiveWindow(nextWindow);
}
private Window getNextWindow(boolean reverse, Window window) {
int index = windows.indexOf(window);
if(reverse) {
if(++index >= windows.size()) {
index = 0;
}
} else {
if(--index < 0) {
index = windows.size() - 1;
}
}
return windows.get(index);
}
}