/*
** This file is part of Filius, a network construction and simulation software.
**
** Originally created at the University of Siegen, Institute "Didactics of
** Informatics and E-Learning" by a students' project group:
** members (2006-2007):
** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding,
** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer
** supervisors:
** Stefan Freischlad (maintainer until 2009), Peer Stechert
** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de>
** and Stefan Freischlad
** Filius 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 2 of the License, or
** (at your option) version 3.
**
** Filius 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 Filius. If not, see <http://www.gnu.org/licenses/>.
*/
package filius.gui.anwendungssicht;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Vector;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import filius.Main;
import filius.rahmenprogramm.I18n;
import filius.rahmenprogramm.Information;
import filius.software.Anwendung;
import filius.software.system.InternetKnotenBetriebssystem;
public class GUIInstallationsDialog extends JInternalFrame implements I18n {
private static final long serialVersionUID = 1L;
private Container c;
private JList softwareInstalliert, softwareVerfuegbar;
private JButton removeButton, addButton, confirmButton;
private JLabel titleInstalled, titleAvailable;
private DefaultListModel lmVerfuegbar, lmInstalliert;
private GUIDesktopPanel dp;
private LinkedList programme = null;
public GUIInstallationsDialog(GUIDesktopPanel dp) {
super();
c = this.getContentPane();
this.dp = dp;
try {
programme = Information.getInformation().ladeProgrammListe();
} catch (IOException e) {
e.printStackTrace(Main.debug);
}
initListen();
initButtons();
/* Title above lists */
titleInstalled = new JLabel(messages.getString("installationsdialog_msg3"));
titleAvailable = new JLabel(messages.getString("installationsdialog_msg4"));
/* Komponenten dem Panel hinzufügen */
Box gesamtBox = Box.createVerticalBox();
Box wrapperInstBox = Box.createVerticalBox();
Box wrapperAvailBox = Box.createVerticalBox();
wrapperInstBox.add(titleInstalled);
wrapperInstBox.add(Box.createVerticalStrut(10));
Box listenBox = Box.createHorizontalBox();
listenBox.add(Box.createHorizontalStrut(10));
JScrollPane ScrollAnwendungInstallieren = new JScrollPane(
softwareInstalliert);
ScrollAnwendungInstallieren.setPreferredSize(new Dimension(150, 200));
wrapperInstBox.add(ScrollAnwendungInstallieren);
listenBox.add(wrapperInstBox);
listenBox.add(Box.createHorizontalGlue());
wrapperAvailBox.add(titleAvailable);
wrapperAvailBox.add(Box.createVerticalStrut(10));
JScrollPane scrollAnwendungVerfuegbar = new JScrollPane(
softwareVerfuegbar);
ScrollAnwendungInstallieren.setPreferredSize(new Dimension(150, 200));
wrapperAvailBox.add(scrollAnwendungVerfuegbar);
listenBox.add(wrapperAvailBox);
listenBox.add(Box.createHorizontalStrut(10));
gesamtBox.add(Box.createVerticalStrut(10));
gesamtBox.add(listenBox);
gesamtBox.add(Box.createVerticalStrut(10));
Box topButtonBox = Box.createHorizontalBox();
topButtonBox.add(addButton);
topButtonBox.add(Box.createHorizontalStrut(32));
topButtonBox.add(removeButton);
gesamtBox.add(topButtonBox);
gesamtBox.add(Box.createVerticalStrut(10));
Box bottomButtonBox = Box.createVerticalBox();
bottomButtonBox.add(confirmButton);
confirmButton.setAlignmentX(JComponent.CENTER_ALIGNMENT);
gesamtBox.add(bottomButtonBox);
gesamtBox.add(Box.createVerticalStrut(10));
c.add(gesamtBox, BorderLayout.CENTER);
this.setClosable(true);
this.setMaximizable(true);
this.setResizable(true);
this.setBounds(0, 80, 400, 360);
this.setTitle(messages.getString("installationsdialog_msg1"));
this.setVisible(true);
this.setAnwendungsIcon("gfx/desktop/icon_softwareinstallation.png");
}
private GUIDesktopPanel getDesktopPanel() {
return dp;
}
private void hinzufuegen() {
Vector vLoeschen = new Vector();
int[] selektiertIndices = softwareVerfuegbar.getSelectedIndices();
for (int i : selektiertIndices) {
lmInstalliert.addElement(lmVerfuegbar.get(i));
vLoeschen.add(lmVerfuegbar.get(i));
}
// umständlich, aber wegen der Möglichkeit von Mehrfachselektion lassen sich nicht einzelne Anwendungen sofort entfernen
for (Enumeration e = vLoeschen.elements(); e.hasMoreElements();) {
Object oZuLoeschen = e.nextElement();
lmVerfuegbar.removeElement(oZuLoeschen);
}
}
private void entfernen() {
int[] selektiertIndices = softwareInstalliert.getSelectedIndices();
Vector hinzu = new Vector();
for (int i : selektiertIndices) {
lmVerfuegbar.addElement(lmInstalliert.getElementAt(i));
hinzu.add(lmInstalliert.getElementAt(i));
}
// umständlich, aber wegen der Möglichkeit von Mehrfachselektion lassen sich nicht einzelne Anwendungen sofort entfernen
for (Enumeration e = hinzu.elements(); e.hasMoreElements();) {
Object hinzuObjekt = e.nextElement();
lmInstalliert.removeElement(hinzuObjekt);
}
}
private void aenderungenSpeichern() {
InternetKnotenBetriebssystem bs = getDesktopPanel().getBetriebssystem();
Anwendung anwendung;
HashMap map;
ListIterator it;
it = programme.listIterator();
while (it.hasNext()) {
map = (HashMap) it.next();
for (int i = 0; i < lmInstalliert.getSize(); i++) {
if (lmInstalliert.getElementAt(i).equals(map.get("Anwendung"))
&& bs.holeSoftware(map.get("Klasse").toString()) == null) {
bs.installiereSoftware(map.get("Klasse").toString());
anwendung = bs.holeSoftware(map.get("Klasse").toString());
anwendung.starten();
}
}
for (int i = 0; i < lmVerfuegbar.getSize(); i++) {
if (lmVerfuegbar.getElementAt(i).equals(map.get("Anwendung"))) {
anwendung = bs.holeSoftware(map.get("Klasse").toString());
if (anwendung != null) {
anwendung.beenden();
bs.entferneSoftware(map.get("Klasse").toString());
}
}
}
}
dp.updateAnwendungen();
}
private void initButtons() {
/* ActionListener */
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (arg0.getActionCommand()
.equals(addButton.getActionCommand())) {
hinzufuegen();
} else if (arg0.getActionCommand().equals(
removeButton.getActionCommand())) {
entfernen();
} else if (arg0.getActionCommand() == confirmButton.getText()) {
aenderungenSpeichern();
setVisible(false);
}
}
};
/* Buttons */
removeButton = new JButton(new ImageIcon(getClass().getResource("/gfx/allgemein/pfeil_rechts.png")));
removeButton.setActionCommand("remove");
removeButton.addActionListener(al);
addButton = new JButton(new ImageIcon(getClass().getResource("/gfx/allgemein/pfeil_links.png")));
addButton.setActionCommand("add");
addButton.addActionListener(al);
confirmButton = new JButton(messages
.getString("installationsdialog_msg2"));
confirmButton.addActionListener(al);
}
private void initListen() {
Anwendung[] anwendungen;
HashMap tmpMap;
String awKlasse;
InternetKnotenBetriebssystem bs;
lmInstalliert = new DefaultListModel();
lmVerfuegbar = new DefaultListModel();
bs = dp.getBetriebssystem();
/* Installierte Anwendung auslesen */
anwendungen = bs.holeArrayInstallierteSoftware();
for (int i = 0; i < anwendungen.length; i++) {
if (anwendungen[i] != null)
lmInstalliert.addElement(anwendungen[i].holeAnwendungsName());
}
if (programme != null) {
ListIterator it = programme.listIterator();
while (it.hasNext()) {
tmpMap = (HashMap) it.next();
awKlasse = (String) tmpMap.get("Klasse");
if (dp.getBetriebssystem().holeSoftware(awKlasse) == null) {
lmVerfuegbar.addElement(tmpMap.get("Anwendung"));
}
}
}
/* Listen */
softwareInstalliert = new JList(lmInstalliert);
softwareVerfuegbar = new JList(lmVerfuegbar);
}
public void setAnwendungsIcon(String datei) {
ImageIcon image = new ImageIcon(getClass().getResource("/"+datei));
image.setImage(image.getImage().getScaledInstance(16, 16,
Image.SCALE_AREA_AVERAGING));
this.setFrameIcon(image);
}
}