PageRenderTime 44ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/jEdit/tags/jedit-4-1-pre5/installer/SwingInstall.java

#
Java | 599 lines | 474 code | 99 blank | 26 comment | 31 complexity | b7f3dc57f7de2467fcbe1da9c769370c MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-1.0, Apache-2.0, LGPL-2.0, LGPL-3.0, GPL-2.0, CC-BY-SA-3.0, LGPL-2.1, GPL-3.0, MPL-2.0-no-copyleft-exception, IPL-1.0
  1. /*
  2. * SwingInstall.java
  3. * Copyright (C) 1999, 2000, 2001, 2002 Slava Pestov
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License
  7. * as published by the Free Software Foundation; either version 2
  8. * of the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. */
  19. package installer;
  20. import javax.swing.border.*;
  21. import javax.swing.event.*;
  22. import javax.swing.*;
  23. import java.awt.event.*;
  24. import java.awt.*;
  25. import java.io.File;
  26. import java.io.IOException;
  27. import java.util.Vector;
  28. /*
  29. * Graphical front-end to installer.
  30. */
  31. public class SwingInstall extends JFrame
  32. {
  33. public SwingInstall()
  34. {
  35. installer = new Install();
  36. appName = installer.getProperty("app.name");
  37. appVersion = installer.getProperty("app.version");
  38. setTitle(appName + " " + appVersion + " installer");
  39. JPanel content = new JPanel(new WizardLayout());
  40. setContentPane(content);
  41. caption = new JLabel();
  42. caption.setFont(new Font("SansSerif",Font.BOLD,18));
  43. ActionHandler actionHandler = new ActionHandler();
  44. cancelButton = new JButton("Cancel");
  45. cancelButton.setRequestFocusEnabled(false);
  46. cancelButton.addActionListener(actionHandler);
  47. prevButton = new JButton("Previous");
  48. prevButton.setRequestFocusEnabled(false);
  49. prevButton.addActionListener(actionHandler);
  50. nextButton = new JButton();
  51. nextButton.setRequestFocusEnabled(false);
  52. nextButton.addActionListener(actionHandler);
  53. content.add(caption);
  54. content.add(cancelButton);
  55. content.add(prevButton);
  56. content.add(nextButton);
  57. String clazz = OperatingSystem.getOperatingSystem()
  58. .getClass().getName();
  59. String completedInfo = "done-" + clazz.substring(
  60. clazz.indexOf('$') + 1) + ".html";
  61. pages = new Component[] {
  62. new TextPanel(installer.getProperty("app.readme")),
  63. new TextPanel(installer.getProperty("app.license")),
  64. chooseDirectory = new ChooseDirectory(),
  65. selectComponents = new SelectComponents(),
  66. progress = new SwingProgress(),
  67. new TextPanel(completedInfo)
  68. };
  69. for(int i = 0; i < pages.length; i++)
  70. content.add(pages[i]);
  71. pageChanged();
  72. setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
  73. addWindowListener(new WindowHandler());
  74. Dimension screen = getToolkit().getScreenSize();
  75. pack();
  76. setLocation((screen.width - getSize().width) / 2,
  77. (screen.height - getSize().height) / 2);
  78. show();
  79. }
  80. // package-private members
  81. Install installer;
  82. String appName;
  83. String appVersion;
  84. JLabel caption;
  85. ChooseDirectory chooseDirectory;
  86. SelectComponents selectComponents;
  87. SwingProgress progress;
  88. JButton cancelButton;
  89. JButton prevButton;
  90. JButton nextButton;
  91. Component[] pages;
  92. int currentPage;
  93. private static final int PADDING = 12;
  94. void install()
  95. {
  96. Vector components = new Vector();
  97. int size = 0;
  98. JPanel comp = selectComponents.comp;
  99. Vector ids = selectComponents.filesets;
  100. for(int i = 0; i < comp.getComponentCount(); i++)
  101. {
  102. if(((JCheckBox)comp.getComponent(i))
  103. .getModel().isSelected())
  104. {
  105. size += installer.getIntProperty(
  106. "comp." + ids.elementAt(i) + ".real-size");
  107. components.addElement(installer.getProperty(
  108. "comp." + ids.elementAt(i) + ".fileset"));
  109. }
  110. }
  111. JTextField binDir = chooseDirectory.binDir;
  112. String installDir = chooseDirectory.installDir.getText();
  113. InstallThread thread = new InstallThread(
  114. installer,progress,
  115. (installDir == null ? null : installDir),
  116. (binDir == null ? null : binDir.getText()),
  117. size,components);
  118. progress.setThread(thread);
  119. thread.start();
  120. }
  121. private void pageChanged()
  122. {
  123. switch(currentPage)
  124. {
  125. case 0:
  126. caption.setText("Installing " + appName);
  127. nextButton.setText("Next");
  128. prevButton.setEnabled(false);
  129. break;
  130. case 1:
  131. caption.setText(installer.getProperty("app.license.title"));
  132. nextButton.setText("Next");
  133. prevButton.setEnabled(true);
  134. break;
  135. case 2:
  136. caption.setText("Specify where " + appName
  137. + " is to be installed");
  138. nextButton.setText("Next");
  139. prevButton.setEnabled(true);
  140. break;
  141. case 3:
  142. caption.setText("Choose components to install");
  143. nextButton.setText("Install");
  144. prevButton.setEnabled(true);
  145. break;
  146. case 4:
  147. caption.setText("Installing " + appName);
  148. nextButton.setText("Finish");
  149. prevButton.setEnabled(false);
  150. nextButton.setEnabled(false);
  151. install();
  152. break;
  153. case 5:
  154. caption.setText("Installation complete");
  155. nextButton.setText("Finish");
  156. prevButton.setEnabled(false);
  157. nextButton.setEnabled(true);
  158. break;
  159. }
  160. getRootPane().invalidate();
  161. getRootPane().validate();
  162. }
  163. class ActionHandler implements ActionListener
  164. {
  165. public void actionPerformed(ActionEvent evt)
  166. {
  167. Object source = evt.getSource();
  168. if(evt.getSource() == cancelButton)
  169. System.exit(0);
  170. else if(evt.getSource() == prevButton)
  171. {
  172. currentPage--;
  173. pageChanged();
  174. }
  175. else if(evt.getSource() == nextButton)
  176. {
  177. if(currentPage == pages.length - 1)
  178. System.exit(0);
  179. else
  180. {
  181. currentPage++;
  182. pageChanged();
  183. }
  184. }
  185. }
  186. }
  187. class WindowHandler extends WindowAdapter
  188. {
  189. public void windowClosing(WindowEvent evt)
  190. {
  191. System.exit(0);
  192. }
  193. }
  194. class WizardLayout implements LayoutManager
  195. {
  196. public void addLayoutComponent(String name, Component comp)
  197. {
  198. }
  199. public void removeLayoutComponent(Component comp)
  200. {
  201. }
  202. public Dimension preferredLayoutSize(Container parent)
  203. {
  204. Dimension dim = new Dimension();
  205. Dimension captionSize = caption.getPreferredSize();
  206. dim.width = captionSize.width;
  207. for(int i = 0; i < pages.length; i++)
  208. {
  209. Dimension _dim = pages[i].getPreferredSize();
  210. dim.width = Math.max(_dim.width,dim.width);
  211. dim.height = Math.max(_dim.height,dim.height);
  212. }
  213. dim.width += PADDING * 2;
  214. dim.height += PADDING * 2;
  215. dim.height += nextButton.getPreferredSize().height;
  216. dim.height += captionSize.height;
  217. return dim;
  218. }
  219. public Dimension minimumLayoutSize(Container parent)
  220. {
  221. return preferredLayoutSize(parent);
  222. }
  223. public void layoutContainer(Container parent)
  224. {
  225. Dimension size = parent.getSize();
  226. Dimension captionSize = caption.getPreferredSize();
  227. caption.setBounds(PADDING,PADDING,captionSize.width,
  228. captionSize.height);
  229. // make all buttons the same size
  230. Dimension buttonSize = cancelButton.getPreferredSize();
  231. buttonSize.width = Math.max(buttonSize.width,prevButton.getPreferredSize().width);
  232. buttonSize.width = Math.max(buttonSize.width,nextButton.getPreferredSize().width);
  233. int bottomBorder = buttonSize.height + PADDING;
  234. // cancel button goes on far left
  235. cancelButton.setBounds(
  236. PADDING,
  237. size.height - buttonSize.height - PADDING,
  238. buttonSize.width,
  239. buttonSize.height);
  240. // prev and next buttons are on the right
  241. prevButton.setBounds(
  242. size.width - buttonSize.width * 2 - 6 - PADDING,
  243. size.height - buttonSize.height - PADDING,
  244. buttonSize.width,
  245. buttonSize.height);
  246. nextButton.setBounds(
  247. size.width - buttonSize.width - PADDING,
  248. size.height - buttonSize.height - PADDING,
  249. buttonSize.width,
  250. buttonSize.height);
  251. // calculate size for current page
  252. Rectangle currentPageBounds = new Rectangle();
  253. currentPageBounds.x = PADDING;
  254. currentPageBounds.y = PADDING * 2 + captionSize.height;
  255. currentPageBounds.width = size.width - currentPageBounds.x
  256. - PADDING;
  257. currentPageBounds.height = size.height - buttonSize.height
  258. - currentPageBounds.y - PADDING * 2;
  259. for(int i = 0; i < pages.length; i++)
  260. {
  261. Component page = pages[i];
  262. page.setBounds(currentPageBounds);
  263. page.setVisible(i == currentPage);
  264. }
  265. }
  266. }
  267. class TextPanel extends JPanel
  268. {
  269. TextPanel(String file)
  270. {
  271. super(new BorderLayout());
  272. JEditorPane text = new JEditorPane();
  273. try
  274. {
  275. text.setPage(TextPanel.this.getClass().getResource(file));
  276. }
  277. catch(Exception e)
  278. {
  279. text.setText("Error loading '" + file + "'");
  280. e.printStackTrace();
  281. }
  282. text.setEditable(false);
  283. JScrollPane scrollPane = new JScrollPane(text);
  284. Dimension dim = new Dimension();
  285. dim.width = 450;
  286. dim.height = 200;
  287. scrollPane.setPreferredSize(dim);
  288. TextPanel.this.add(BorderLayout.CENTER,scrollPane);
  289. }
  290. }
  291. class ChooseDirectory extends JPanel
  292. implements ActionListener
  293. {
  294. JTextField installDir;
  295. JButton chooseInstall;
  296. JTextField binDir;
  297. JButton chooseBin;
  298. ChooseDirectory()
  299. {
  300. super(new BorderLayout());
  301. String _binDir = OperatingSystem.getOperatingSystem()
  302. .getShortcutDirectory(appName,appVersion);
  303. JPanel directoryPanel = new JPanel();
  304. GridBagLayout layout = new GridBagLayout();
  305. directoryPanel.setLayout(layout);
  306. GridBagConstraints cons = new GridBagConstraints();
  307. cons.anchor = GridBagConstraints.WEST;
  308. cons.fill = GridBagConstraints.HORIZONTAL;
  309. cons.gridy = 1;
  310. cons.insets = new Insets(0,0,6,0);
  311. JLabel label = new JLabel("Install program in: ",SwingConstants.RIGHT);
  312. label.setBorder(new EmptyBorder(0,0,0,12));
  313. layout.setConstraints(label,cons);
  314. directoryPanel.add(label);
  315. cons.weightx = 1.0f;
  316. installDir = new JTextField();
  317. installDir.setText(OperatingSystem.getOperatingSystem()
  318. .getInstallDirectory(appName,appVersion));
  319. layout.setConstraints(installDir,cons);
  320. directoryPanel.add(installDir);
  321. if(_binDir != null)
  322. {
  323. cons.gridy = 2;
  324. cons.weightx = 0.0f;
  325. cons.insets = new Insets(0,0,0,0);
  326. label = new JLabel("Install shortcut in: ",SwingConstants.RIGHT);
  327. label.setBorder(new EmptyBorder(0,0,0,12));
  328. layout.setConstraints(label,cons);
  329. directoryPanel.add(label);
  330. cons.weightx = 1.0f;
  331. binDir = new JTextField(_binDir);
  332. layout.setConstraints(binDir,cons);
  333. directoryPanel.add(binDir);
  334. }
  335. ChooseDirectory.this.add(BorderLayout.NORTH,directoryPanel);
  336. Box buttons = new Box(BoxLayout.X_AXIS);
  337. buttons.add(Box.createGlue());
  338. chooseInstall = new JButton("Choose Install Directory...");
  339. chooseInstall.setRequestFocusEnabled(false);
  340. chooseInstall.addActionListener(this);
  341. buttons.add(chooseInstall);
  342. if(_binDir != null)
  343. {
  344. buttons.add(Box.createHorizontalStrut(6));
  345. chooseBin = new JButton("Choose Shortcut Directory...");
  346. chooseBin.setRequestFocusEnabled(false);
  347. chooseBin.addActionListener(this);
  348. buttons.add(chooseBin);
  349. }
  350. buttons.add(Box.createGlue());
  351. ChooseDirectory.this.add(BorderLayout.SOUTH,buttons);
  352. }
  353. public void actionPerformed(ActionEvent evt)
  354. {
  355. JTextField field = (evt.getSource() == chooseInstall
  356. ? installDir : binDir);
  357. File directory = new File(field.getText());
  358. JFileChooser chooser = new JFileChooser(directory.getParent());
  359. chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
  360. chooser.setSelectedFile(directory);
  361. if(chooser.showOpenDialog(SwingInstall.this)
  362. == JFileChooser.APPROVE_OPTION)
  363. field.setText(chooser.getSelectedFile().getPath());
  364. }
  365. }
  366. class SelectComponents extends JPanel
  367. implements ActionListener
  368. {
  369. JPanel comp;
  370. JLabel sizeLabel;
  371. Vector filesets;
  372. SelectComponents()
  373. {
  374. super(new BorderLayout());
  375. comp = createCompPanel();
  376. SelectComponents.this.add(BorderLayout.NORTH,comp);
  377. sizeLabel = new JLabel("",SwingConstants.LEFT);
  378. SelectComponents.this.add(BorderLayout.SOUTH,sizeLabel);
  379. updateSize();
  380. }
  381. public void actionPerformed(ActionEvent evt)
  382. {
  383. updateSize();
  384. }
  385. private JPanel createCompPanel()
  386. {
  387. filesets = new Vector();
  388. int count = installer.getIntProperty("comp.count");
  389. JPanel panel = new JPanel(new GridLayout(count,1));
  390. String osClass = OperatingSystem.getOperatingSystem()
  391. .getClass().getName();
  392. osClass = osClass.substring(osClass.indexOf('$') + 1);
  393. for(int i = 0; i < count; i++)
  394. {
  395. String os = installer.getProperty("comp." + i + ".os");
  396. if(os != null && !osClass.equals(os))
  397. continue;
  398. JCheckBox checkBox = new JCheckBox(
  399. installer.getProperty("comp." + i + ".name")
  400. + " (" + installer.getProperty("comp." + i
  401. + ".disk-size") + "Kb)");
  402. checkBox.getModel().setSelected(true);
  403. checkBox.addActionListener(this);
  404. checkBox.setRequestFocusEnabled(false);
  405. filesets.addElement(new Integer(i));
  406. panel.add(checkBox);
  407. }
  408. Dimension dim = panel.getPreferredSize();
  409. dim.width = Integer.MAX_VALUE;
  410. panel.setMaximumSize(dim);
  411. return panel;
  412. }
  413. private void updateSize()
  414. {
  415. int size = 0;
  416. for(int i = 0; i < filesets.size(); i++)
  417. {
  418. if(((JCheckBox)comp.getComponent(i))
  419. .getModel().isSelected())
  420. {
  421. size += installer.getIntProperty("comp."
  422. + filesets.elementAt(i)
  423. + ".disk-size");
  424. }
  425. }
  426. sizeLabel.setText("Estimated disk usage of selected"
  427. + " components: " + size + "Kb");
  428. }
  429. }
  430. class SwingProgress extends JPanel implements Progress
  431. {
  432. JProgressBar progress;
  433. InstallThread thread;
  434. SwingProgress()
  435. {
  436. super(new BorderLayout());
  437. progress = new JProgressBar();
  438. progress.setStringPainted(true);
  439. SwingProgress.this.add(BorderLayout.NORTH,progress);
  440. }
  441. public void setMaximum(final int max)
  442. {
  443. SwingUtilities.invokeLater(new Runnable()
  444. {
  445. public void run()
  446. {
  447. progress.setMaximum(max);
  448. }
  449. });
  450. }
  451. public void advance(final int value)
  452. {
  453. try
  454. {
  455. SwingUtilities.invokeAndWait(new Runnable()
  456. {
  457. public void run()
  458. {
  459. progress.setValue(progress
  460. .getValue() + value);
  461. }
  462. });
  463. Thread.yield();
  464. }
  465. catch(Exception e)
  466. {
  467. }
  468. }
  469. public void done()
  470. {
  471. SwingUtilities.invokeLater(new Runnable()
  472. {
  473. public void run()
  474. {
  475. currentPage++;
  476. pageChanged();
  477. }
  478. });
  479. }
  480. public void error(final String message)
  481. {
  482. SwingUtilities.invokeLater(new Runnable()
  483. {
  484. public void run()
  485. {
  486. dispose();
  487. JOptionPane.showMessageDialog(null,
  488. message,
  489. "Installation aborted",
  490. JOptionPane.ERROR_MESSAGE);
  491. System.exit(1);
  492. }
  493. });
  494. }
  495. public void setThread(InstallThread thread)
  496. {
  497. this.thread = thread;
  498. }
  499. }
  500. }