package de.uni_passau.fim.infosun.prophet.experimentEditor.tabbedPane;
import java.awt.Component;
import javax.swing.JComponent;
import javax.swing.JTabbedPane;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreePath;
import de.uni_passau.fim.infosun.prophet.experimentEditor.qTree.QTree;
import de.uni_passau.fim.infosun.prophet.experimentEditor.tabbedPane.editorTabs.ContentEditorPanel;
import de.uni_passau.fim.infosun.prophet.experimentEditor.tabbedPane.editorTabs.ContentViewerPanel;
import de.uni_passau.fim.infosun.prophet.experimentEditor.tabbedPane.editorTabs.NoteEditorPanel;
import de.uni_passau.fim.infosun.prophet.experimentEditor.tabbedPane.editorTabs.SettingsEditorPanel;
import de.uni_passau.fim.infosun.prophet.util.qTree.QTreeNode;
import static de.uni_passau.fim.infosun.prophet.util.language.UIElementNames.getLocalized;
/**
* The right-side tabbed pane of the <code>ExperimentEditor</code>.
*
* @author Georg Seibt
* @author Andreas Hasselberg
* @author Markus Köppen
*/
public class ExperimentEditorTabbedPane extends JTabbedPane {
private QTreeNode currentNode;
private ExperimentEditorTab currentTab;
private static class TreeModelAdapter implements TreeModelListener {
@Override
public void treeNodesChanged(TreeModelEvent e) {
}
@Override
public void treeNodesInserted(TreeModelEvent e) {
}
@Override
public void treeNodesRemoved(TreeModelEvent e) {
}
@Override
public void treeStructureChanged(TreeModelEvent e) {
}
}
/**
* Constructs a new <code>ExperimentEditorTabbedPane</code>.
*
* @param tree
* the <code>QTree</code> used in the <code>ExperimentEditor</code>
*/
public ExperimentEditorTabbedPane(QTree tree) {
tree.addTreeSelectionListener(event -> {
TreePath selectionPath = tree.getSelectionPath();
if (selectionPath != null) {
save();
currentNode = (QTreeNode) selectionPath.getLastPathComponent();
currentTab.load(currentNode);
}
});
tree.getModel().addTreeModelListener(new TreeModelAdapter() {
@Override
public void treeStructureChanged(TreeModelEvent e) {
if (e.getPath().length > 0) {
Object oldRoot = e.getPath()[0];
Object currentRoot = tree.getModel().getRoot();
if (oldRoot != currentRoot) {
for (int i = 0; i < getTabCount(); i++) {
((ExperimentEditorTab) getComponentAt(i)).reset();
}
}
}
}
});
addChangeListener(event -> {
save();
currentTab = (ExperimentEditorTab) getSelectedComponent();
currentTab.load(currentNode);
});
addTab(getLocalized("MENU_TAB_EDITOR"), new ContentEditorPanel());
addTab(getLocalized("MENU_TAB_PREVIEW"), new ContentViewerPanel());
addTab(getLocalized("MENU_TAB_SETTINGS"), new SettingsEditorPanel());
addTab(getLocalized("MENU_TAB_NOTES"), new NoteEditorPanel());
}
/**
* Saves the state of the currently selected tab.
*/
public void save() {
if (currentTab != null) {
currentTab.save();
}
}
/**
* Makes the given component and all its descendants transparent (looks better)
*
* @param component
* the component to be made transparent
*/
public static void recursiveSetOpaque(JComponent component) {
component.setOpaque(false);
for (Component child : component.getComponents()) {
if (child instanceof JComponent) {
recursiveSetOpaque((JComponent) child);
}
}
}
}