Files
i2p.i2p/installer/java/src/GUIInstall.java
2004-04-08 04:41:54 +00:00

339 lines
8.8 KiB
Java

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.StringTokenizer;
public class GUIInstall extends Install {
static final GridBagConstraints gbcLeft=new GridBagConstraints();
static final GridBagConstraints gbcRight=new GridBagConstraints();
static final GridBagConstraints gbcBottom=new GridBagConstraints();
static {
gbcLeft.anchor=GridBagConstraints.EAST;
gbcRight.fill=GridBagConstraints.HORIZONTAL;
gbcRight.gridwidth=GridBagConstraints.REMAINDER;
gbcRight.weightx=1.0;
gbcBottom.weighty=1.0;
gbcBottom.gridwidth=GridBagConstraints.REMAINDER;
gbcBottom.fill=GridBagConstraints.BOTH;
gbcBottom.insets=new Insets(4,4,4,4);
}
public static void main(String[] args) {
new GUIInstall().runInstall();
}
private InstallFrame frame;
boolean installing=false;
ArrayList categories = new ArrayList();
InstallCategory currentCategory = null;
public String handleSpliceParams(String s) {
// any better ideas?
return s;
}
public GUIInstall() {
frame = new InstallFrame();
}
public void showStatus(String s) {
if (!installing)
throw new RuntimeException("Not installing yet!");
frame.showStatus(s);
}
public void showOptError(String s) {
frame.showOptError(s);
}
public void handleOptInfo(String s) {
currentCategory.addInfo(s);
}
public void startOptCategory(String s) {
currentCategory = new InstallCategory();
categories.add(currentCategory);
}
public void finishOptions() {
frame.startInstall(categories);
System.out.println("Starting install...");
}
public void handleOption(int number, String question,
String def, String type) {
currentCategory.addOption(number, question, def, type);
}
public boolean confirmOption(String question, boolean defaultYes) {
ConfirmFrame cf = new ConfirmFrame(frame, question, defaultYes);
return cf.getResult();
}
private class ConfirmFrame extends Dialog {
private boolean result;
private ConfirmFrame(Frame parent, String msg,
boolean defaultYes) {
super(parent,"Installer question",true);
setBackground(Color.lightGray);
setLayout(new BorderLayout());
TextArea ta;
Panel p;
Button b1, b2;
add("Center", ta = new TextArea(msg, 3, 80));
ta.setEditable(false);
add("South", p = new Panel(new FlowLayout()));
p.add(b1 = new Button("Yes"));
p.add(b2 = new Button("No"));
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
result = evt.getActionCommand().equals("Yes");
ConfirmFrame.this.dispose();
}
};
b1.addActionListener(al);
b2.addActionListener(al);
pack();
// java 1.4
//setLocationRelativeTo(parent);
show();
(defaultYes?b1:b2).requestFocus();
}
private boolean getResult() {
return result;
}
}
private class InstallCategory extends ArrayList {
public void addInfo(String s) {
add(new InfoOption(s));
}
public void addOption(int number, String question,
String def, String type) {
add(new RealOption(number, question, def, type));
}
}
private interface InstallOption {
public Component getComponent1();
public Component getComponent2();
public boolean setValue();
public String getQuestion();
}
private class InfoOption extends Panel implements InstallOption {
public InfoOption(String s) {
super(new GridLayout(0,1,0,0));
for(StringTokenizer st = new StringTokenizer(s,"\n");
st.hasMoreTokens();) {
add(new Label(st.nextToken()));
}
}
public Component getComponent1() { return null;}
public Component getComponent2() { return this;}
public boolean setValue() {return true;}
public String getQuestion() { return "<no question>";}
}
private class RealOption implements InstallOption {
private int number;
private String def, question;
private Label l;
private TextField t;
public RealOption(int number, String question,
String def, String type) {
this.number = number;
l = new Label(question);
t = new TextField(def);
this.def=def;
this.question=question;
// type is not needed yet
}
public void reset() {t.setText(def);}
public String getQuestion() { return question; }
public boolean setValue() {
return GUIInstall.this.setOption(number, t.getText());
}
public Component getComponent1() { return l;}
public Component getComponent2() { return t;}
}
private class InstallFrame extends Frame {
private int current = -1;
private Panel cats;
private CardLayout cl;
private boolean windowOpen = true;
private TextArea log;
public InstallFrame() {
super("I2P Installer");
setBackground(Color.lightGray);
Panel p;
Button b;
setLayout(new BorderLayout());
add("Center", cats = new Panel(cl = new CardLayout()));
cats.add("Start", p= new Panel(new BorderLayout()));
p.add("Center", new Label("Loading installer..."));
cats.add("Install", p= new Panel(new BorderLayout()));
p.add("Center", log=new TextArea("Installing...\n\n"));
log.setEditable(false);
add("South", p = new Panel(new FlowLayout()));
p.add(b = new Button("<< Back"));
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if (current > 0) {
current --;
cl.show(cats,""+current);
}
}
});
p.add(b = new Button("Next >>"));
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if (current != -1) {
if (!saveCurrent()) return;
current ++;
if (current == categoryPanels.length) {
cl.show(cats,"Install");
current = -1;
synchronized(InstallFrame.this) {
installing=true;
windowOpen=false;
InstallFrame.this.notify();
}
} else {
cl.show(cats,""+current);
}
}
}
});
p.add(b = new Button("Quit"));
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
System.exit(0);
}
});
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
System.exit(0);
}
});
setSize(600,450);
// java 1.4
//setLocationRelativeTo(null);
show();
}
public void showStatus(String s) {
log.append(s+"\n");
}
public void showOptError(String s) {
if (current == -1) throw new RuntimeException("No options here!");
categoryPanels[current].showError(s);
}
private CategoryPanel[] categoryPanels;
public void startInstall(ArrayList categories) {
Panel p;
categoryPanels = new CategoryPanel[categories.size()];
//build a panel for each category
Iterator it = categories.iterator();
for (int i=0; it.hasNext(); i++) {
cats.add(""+i, categoryPanels[i] =
new CategoryPanel((InstallCategory)it.next()));
}
current = 0;
cl.show(cats,"0");
// wait till config is complete
synchronized(this) {
while(windowOpen) {
try {
wait();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
}
private boolean saveCurrent() {
return categoryPanels[current].saveOptions();
}
}
private class CategoryPanel extends Panel {
private TextArea errorBox;
private InstallCategory ic;
public CategoryPanel(InstallCategory ic) {
super(new GridBagLayout());
this.ic=ic;
for (Iterator it = ic.iterator(); it.hasNext();) {
InstallOption io = (InstallOption) it.next();
Component c1 = io.getComponent1(),
c2 = io.getComponent2();
if (c1 != null) add(c1, gbcLeft);
add(c2, gbcRight);
}
add (errorBox = new TextArea(), gbcBottom);
errorBox.setEditable(false);
}
private InstallOption currentOption;
public boolean saveOptions() {
errorBox.setText("Saving options...\n\n");
for (Iterator it = ic.iterator(); it.hasNext();) {
InstallOption io = (InstallOption) it.next();
currentOption=io;
if (!io.setValue()) return false;
currentOption= null;
}
return true;
}
public void showError(String s) {
if (currentOption==null) {
throw new RuntimeException("No option to test");
}
errorBox.append("While setting \""+currentOption.getQuestion()+
"\":\n"+s+"\n\n");
}
}
}