package org.trianacode.gui.desktop.tabs;
import org.trianacode.gui.desktop.DesktopView;
import org.trianacode.gui.desktop.DesktopViewListener;
import org.trianacode.gui.desktop.DesktopViewManager;
import org.trianacode.gui.hci.GUIEnv;
import org.trianacode.gui.main.TaskGraphPanel;
import org.trianacode.taskgraph.Task;
import org.trianacode.taskgraph.TaskGraph;
import org.trianacode.taskgraph.TaskGraphUtils;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.HashMap;
/**
* Created by IntelliJ IDEA.
* User: Ian Harvey
* Date: Nov 10, 2010
* Time: 5:27:58 PM
* To change this template use File | Settings | File Templates.
*/
public class TabManager implements DesktopViewManager, ChangeListener {
private JTabbedPane tabbedPane;
private TabView selected;
private java.util.List<TabView> tabs = new ArrayList<TabView>();
private java.util.List<DesktopViewListener> listeners = new ArrayList<DesktopViewListener>();
private HashMap<TabView, JLabel> headerLabelMap = new HashMap<TabView, JLabel>();
private static TabManager manager = new TabManager();
public static TabManager getManager() {
return manager;
}
public TabManager() {
this.tabbedPane = new JTabbedPane();
tabbedPane.addChangeListener(this);
}
@Override
public Container getWorkspace() {
return tabbedPane;
}
@Override
public DesktopView newDesktopView(final TaskGraphPanel panel) {
final TabView tab = new TabView(panel);
tabs.add(tab);
String name = panel.getTaskGraph().getToolName();
if (name.equals("")) {
name = "Untitled";
}
JPanel tabHeader = new JPanel(new BorderLayout());
JLabel nameLab = new JLabel(name);
headerLabelMap.put(tab, nameLab);
nameLab.setBorder(new EmptyBorder(0, 0, 0, 0));
tabHeader.setOpaque(false);
tabHeader.add(nameLab, BorderLayout.CENTER);
JButton close = new JButton(GUIEnv.getIcon("close.png"));
close.setRolloverEnabled(true);
close.setRolloverIcon(GUIEnv.getIcon("closehover.png"));
close.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
remove(tab);
for (DesktopViewListener listener : listeners) {
listener.ViewClosed(tab);
}
}
});
close.setOpaque(false);
close.setToolTipText("close this tab");
close.setFocusable(false);
close.setBorder(new EmptyBorder(0, 10, 0, 0));
tabHeader.add(close, BorderLayout.EAST);
tabbedPane.addTab(null, tab);
tabbedPane.setTabComponentAt(tabbedPane.getTabCount() - 1, tabHeader);
tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
// no need to set selected here - staeChanged gets called when the tab is added.
return tab;
}
@Override
public void remove(DesktopView tab) {
for (DesktopViewListener listener : listeners) {
listener.ViewClosed(tab);
}
TaskGraph taskGraph = tab.getTaskgraphPanel().getTaskGraph();
Task[] tasks = TaskGraphUtils.getAllTasksRecursive(taskGraph, true);
for(Task task : tasks){
if(task instanceof TaskGraph){
DesktopView view = getTaskgraphViewFor((TaskGraph) task);
if (view instanceof TabView) {
tabs.remove(view);
headerLabelMap.remove(view);
tabbedPane.remove((TabView) view);
}
}
}
if (tab instanceof TabView) {
tabs.remove(tab);
headerLabelMap.remove(tab);
tabbedPane.remove((TabView) tab);
}
}
@Override
public DesktopView getTaskgraphViewFor(TaskGraph taskgraph) {
for (TabView tab : tabs) {
TaskGraphPanel panel = tab.getTaskgraphPanel();
if (panel.getTaskGraph() == taskgraph) {
return tab;
}
}
return null;
}
@Override
public void addDesktopViewListener(DesktopViewListener listener) {
if (!listeners.contains(listener)) {
listeners.add(listener);
}
}
@Override
public void removeDesktopViewListener(DesktopViewListener listener) {
listeners.remove(listener);
}
@Override
public DesktopView[] getViews() {
return tabs.toArray(new DesktopView[tabs.size()]);
}
@Override
public void setSelected(DesktopView panel, boolean sel) {
if (sel) {
int tabs = tabbedPane.getTabCount();
for (int i = 0; i < tabs; i++) {
Component c = tabbedPane.getTabComponentAt(i);
if (c instanceof TabView) {
if (c == panel) {
tabbedPane.setSelectedIndex(i);
selected = (TabView) c;
}
}
}
}
}
@Override
public DesktopView getSelected() {
return selected;
}
@Override
public DesktopView getDesktopViewFor(TaskGraphPanel panel) {
DesktopView[] views = getViews();
for (DesktopView view : views) {
if (view.getTaskgraphPanel() == panel) {
return view;
}
}
return null;
}
@Override
public String getTitle(DesktopView view) {
if (view instanceof TabView) {
return ((TabView) view).getTitle();
}
return null;
}
@Override
public void setTitle(DesktopView view, String title) {
if (view instanceof TabView) {
TabView tabView = ((TabView) view);
tabView.setTitle(title);
JLabel label = headerLabelMap.get(tabView);
if (label != null) {
label.setText(title);
}
}
}
@Override
public void desktopRemoved() {
tabbedPane.removeAll();
tabs.clear();
listeners.clear();
headerLabelMap.clear();
selected = null;
}
@Override
public void desktopAdded() {
for (DesktopViewListener listener : listeners) {
listener.desktopChanged(this);
}
}
@Override
public DesktopView getDropTarget(int x, int y, Component source) {
for (TabView tab : tabs) {
if (tab.isVisible()) {
int landingPosX = x -
(tab.getLocationOnScreen().x - source.getLocationOnScreen().x);
int landingPosY = y -
(tab.getLocationOnScreen().y - source.getLocationOnScreen().y);
if (tab.contains(landingPosX, landingPosY)) {
return tab;
}
}
}
return null;
}
@Override
public void stateChanged(ChangeEvent evt) {
if (evt.getSource() == tabbedPane) {
Component selected = tabbedPane.getSelectedComponent();
if (selected instanceof TabView) {
this.selected = (TabView) selected;
this.selected.getTaskgraphPanel().getContainer().requestFocus();
for (DesktopViewListener listener : listeners) {
listener.ViewOpened(this.selected);
}
}
}
}
}