/*******************************************************************************
* Copyright (c) 2012-present Jakub Kováč, Jozef Brandýs, Katarína Kotrlová,
* Pavol Lukča, Ladislav Pápay, Viktor Tomkovič, Tatiana Tóthová
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package algvis.ui;
import algvis.core.ADTs;
import algvis.core.DataStructures;
import algvis.core.Settings;
import algvis.internationalization.IMenu;
import algvis.internationalization.IMenuItem;
import algvis.internationalization.Languages;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
public class AlgVis extends JPanel implements ActionListener {
/*
* set the default panel 0 - BST ("bst") 1 - Rotations ("rotations") 2 - AVL
* ("avltree") 3 - 23 tree ("23tree") 4 - 234 tree ("234tree") 5 - B-tree
* ("btree") 6 - Red-black tree ("redblack") 7 - AA-tree ("aatree") 8 -
* Treap ("treap") 9 - SkipList ("skiplist") 10 - Scapegoat tree
* ("scapegoat") 11 - Splay tree ("splaytree") 12 - Heap ("heap") 13 - d-ary
* heap ("daryheap") 14 - Leftist heap ("leftheap") 15 - Skew heap
* ("skewheap") 16 - Pairing heap ("pairheap") 17 - Binomial heap
* ("binheap") 18 - Lazy Binomial heap ("lazybinheap") 19 - Fibonacci heap
* ("fibheap") 20 - Union-find ("ufi") 21 - Interval tree ("intervaltree")
* 22 - Trie ("trie") 23 - Suffix Tree ("suffixtree")
*/
private final static int DEFAULT_DS = 0;
private static final long serialVersionUID = -5202486006824196688L;
/** Cards with data structures */
public final JPanel cards;
private final CardLayout cardlayout;
public final VisPanel[] panels; //TODO: private
private int activePanel = -1;
private final Container container;
private final Settings S;
private final Map<String, IMenu> adtItems = new HashMap<String, IMenu>();
private IMenuItem[] dsItems;
public AlgVis(Container c) {
this(c, "en");
}
public AlgVis(Container c, String s) {
this.container = c;
Languages.selectLanguage(s);
S = new Settings();
cards = new JPanel(cardlayout = new CardLayout());
panels = new VisPanel[DataStructures.N];
}
public void init() {
Fonts.init(getGraphics());
// Menu
JMenuBar menuBar;
menuBar = new JMenuBar();
final IMenu dsMenu = new IMenu("datastructures");
dsMenu.setMnemonic(KeyEvent.VK_D);
final IMenu langMenu = new IMenu("language");
langMenu.setMnemonic(KeyEvent.VK_L);
final IMenu layoutMenu = new IMenu("layout");
layoutMenu.setMnemonic(KeyEvent.VK_Y);
// Data structures menu
// Dictionaries
/**
* Create a submenu (IMenu) for each abstract data type listed in the
* class ADTs.
*/
for (int i = 0; i < ADTs.N; ++i) {
final String adtName = ADTs.getName(i);
adtItems.put(adtName, new IMenu(adtName));
}
/**
* Create menu items for each data structure listed in the class
* DataStructures.
*/
dsItems = new IMenuItem[DataStructures.N];
for (int i = 0; i < DataStructures.N; ++i) {
dsItems[i] = new IMenuItem(DataStructures.getName(i));
adtItems.get(DataStructures.getADT(i)).add(dsItems[i]);
dsItems[i].setActionCommand("ds-" + DataStructures.getName(i));
dsItems[i].addActionListener(this);
}
/**
* Put all the ADT submenus under the all data structures menu.
*/
for (int i = 0; i < ADTs.N; ++i) {
dsMenu.add(adtItems.get(ADTs.getName(i)));
}
menuBar.add(dsMenu);
// Language menu
final JMenuItem enItem = new JMenuItem("English", KeyEvent.VK_B);
final JMenuItem skItem = new JMenuItem("Slovensky", KeyEvent.VK_B);
enItem.setActionCommand("lang-en");
skItem.setActionCommand("lang-sk");
enItem.addActionListener(this);
skItem.addActionListener(this);
langMenu.add(enItem);
langMenu.add(skItem);
menuBar.add(langMenu);
/*
* // Layout menu IMenuItem sItem = new IMenuItem(L, "layout-simple",
* KeyEvent.VK_S); IMenuItem cItem = new IMenuItem(L, "layout-compact",
* KeyEvent.VK_C); sItem.setActionCommand("layout-simple");
* cItem.setActionCommand("layout-compact");
* sItem.addActionListener(this); cItem.addActionListener(this);
*
* layoutMenu.add(sItem); layoutMenu.add(cItem);
* menuBar.add(layoutMenu);
*/
for (int i = 0; i < DataStructures.N; ++i) {
panels[i] = DataStructures.createPanel(i, S);
if (panels[i] != null) {
cards.add(panels[i], DataStructures.getName(i));
}
}
getRootPane().setJMenuBar(menuBar);
container.add(cards);
showCard(DEFAULT_DS);
}
@Override
public void actionPerformed(ActionEvent e) {
final String[] cmd = e.getActionCommand().split("-", 2);
// set language
if ("lang".equals(cmd[0])) {
Languages.selectLanguage(cmd[1]);
}
// set layout
if ("layout".equals(cmd[0])) {
S.setLayout(cmd[1]);
}
// set different data structure
if ("ds".equals(cmd[0])) {
for (int i = 0; i < DataStructures.N; ++i) {
if (DataStructures.getName(i).equals(cmd[1])) {
showCard(i);
break;
}
}
}
}
private void showCard(int i) {
if (activePanel != -1) {
panels[activePanel].setOnAir(false);
}
activePanel = i;
panels[i].setOnAir(true);
cardlayout.show(cards, DataStructures.getName(i));
}
}