2 Java class GuiPkgInstall is GUI for package installation.
4 Copyright (c) 2006, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 package org
.tianocore
.packaging
;
16 import javax
.swing
.JPanel
;
17 import javax
.swing
.JFrame
;
18 import javax
.swing
.JButton
;
19 import javax
.swing
.JFileChooser
;
20 import javax
.swing
.JLabel
;
21 import javax
.swing
.JOptionPane
;
22 import javax
.swing
.JTextField
;
24 import java
.awt
.Dimension
;
25 import java
.awt
.GridLayout
;
26 import java
.awt
.Toolkit
;
28 import java
.awt
.FlowLayout
;
29 import java
.awt
.event
.MouseEvent
;
30 import java
.awt
.event
.MouseListener
;
31 import java
.awt
.event
.WindowAdapter
;
32 import java
.awt
.event
.WindowEvent
;
34 import java
.awt
.ComponentOrientation
;
36 import java
.util
.Hashtable
;
38 import javax
.swing
.SwingConstants
;
39 import javax
.swing
.JProgressBar
;
40 import javax
.swing
.filechooser
.FileFilter
;
42 import org
.apache
.xmlbeans
.XmlException
;
46 GUI for package installation.
48 @since PackageEditor 1.0
50 public class GuiPkgInstall
extends JFrame
implements MouseListener
{
52 final static long serialVersionUID
= 0;
57 /// backup of "this". As we cannot use "this" to refer outer class inside inner class
59 private JFrame pThis
= null;
61 private JFileChooser chooser
= null;
63 private JPanel jPanel
= null;
65 private JPanel jPanel1
= null;
67 private JTextField jTextField
= null;
69 private JButton jButton
= null;
71 private JPanel jPanel2
= null;
73 private JLabel jLabel1
= null;
75 private JPanel jPanel4
= null;
77 private JTextField jTextField1
= null;
79 private JButton jButton1
= null;
81 private JPanel jPanel5
= null;
83 private JPanel jPanel6
= null;
85 private JPanel jPanel7
= null;
87 private JLabel jLabel2
= null;
89 private JTextField jTextField2
= null;
91 private JButton jButton2
= null;
93 private JButton jButton3
= null;
95 private JPanel jPanel3
= null;
97 private JLabel jLabel
= null;
99 private JProgressBar jProgressBar
= null;
101 private JButton jButton4
= null;
104 public GuiPkgInstall() {
113 private void initialize() {
114 this.setSize(new java
.awt
.Dimension(454, 313));
115 this.setContentPane(getJPanel());
116 this.setTitle("Package Installation");
117 this.addWindowListener(new GuiPkgInstallAdapter(this));
118 this.setDefaultCloseOperation(javax
.swing
.WindowConstants
.DO_NOTHING_ON_CLOSE
);
124 make window appear center of screen
129 protected void centerWindow(int intWidth
, int intHeight
) {
130 Dimension d
= Toolkit
.getDefaultToolkit().getScreenSize();
131 this.setLocation((d
.width
- intWidth
) / 2, (d
.height
- intHeight
) / 2);
135 Start the window at the center of screen
137 protected void centerWindow() {
138 centerWindow(this.getSize().width
, this.getSize().height
);
142 This method initializes jPanel
143 @return javax.swing.JPanel
145 private JPanel
getJPanel() {
146 if (jPanel
== null) {
147 GridLayout gridLayout
= new GridLayout();
148 gridLayout
.setRows(7);
149 gridLayout
.setColumns(1);
150 jPanel
= new JPanel();
151 jPanel
.setLayout(gridLayout
);
152 jPanel
.add(getJPanel3(), null);
153 jPanel
.add(getJPanel1(), null);
154 jPanel
.add(getJPanel2(), null);
155 jPanel
.add(getJPanel4(), null);
156 jPanel
.add(getJPanel5(), null);
157 jPanel
.add(getJPanel6(), null);
158 jPanel
.add(getJPanel7(), null);
164 This method initializes jPanel1
166 @return javax.swing.JPanel
168 private JPanel
getJPanel1() {
169 if (jPanel1
== null) {
170 FlowLayout flowLayout
= new FlowLayout();
171 flowLayout
.setAlignment(java
.awt
.FlowLayout
.LEFT
);
172 jPanel1
= new JPanel();
173 jPanel1
.setLayout(flowLayout
);
174 jPanel1
.add(getJTextField(), null);
175 jPanel1
.add(getJButton(), null);
181 This method initializes jTextField
183 @return javax.swing.JTextField
185 private JTextField
getJTextField() {
186 if (jTextField
== null) {
187 jTextField
= new JTextField();
188 jTextField
.setHorizontalAlignment(javax
.swing
.JTextField
.LEFT
);
189 jTextField
.setPreferredSize(new java
.awt
.Dimension(350, 20));
195 This method initializes jButton
197 @return javax.swing.JButton
199 private JButton
getJButton() {
200 if (jButton
== null) {
201 jButton
= new JButton();
202 jButton
.setHorizontalAlignment(javax
.swing
.SwingConstants
.LEFT
);
203 jButton
.setText("Browse");
204 jButton
.setComponentOrientation(java
.awt
.ComponentOrientation
.LEFT_TO_RIGHT
);
205 jButton
.setHorizontalTextPosition(javax
.swing
.SwingConstants
.CENTER
);
206 jButton
.setToolTipText("Where is the package?");
207 jButton
.setFont(new java
.awt
.Font("Dialog", java
.awt
.Font
.BOLD
, 12));
209 jButton
.setPreferredSize(new java
.awt
.Dimension(80, 20));
210 jButton
.addMouseListener(new java
.awt
.event
.MouseAdapter() {
211 public void mouseClicked(java
.awt
.event
.MouseEvent e
) {
212 if (chooser
== null) {
213 chooser
= new JFileChooser();
216 // disable multi-selection, you can only select one item each time.
218 chooser
.setMultiSelectionEnabled(false);
219 chooser
.setFileSelectionMode(JFileChooser
.FILES_AND_DIRECTORIES
);
220 chooser
.setFileFilter(new PkgFileFilter("fdp"));
221 int retval
= chooser
.showOpenDialog(frame
);
222 if (retval
== JFileChooser
.APPROVE_OPTION
) {
224 File theFile
= chooser
.getSelectedFile();
225 jTextField
.setText(theFile
.getPath());
227 // set a default directory for installation (WORKSPACE\PackageFileName)
229 if (jTextField1
.getText().length() > 0) {
230 int indexbegin
= jTextField
.getText().lastIndexOf(System
.getProperty("file.separator"));
231 int indexend
= jTextField
.getText().lastIndexOf('.');
232 if (indexbegin
>= 0 && indexend
>= 0) {
233 jTextField2
.setText(jTextField1
.getText()
234 + jTextField
.getText().substring(indexbegin
, indexend
));
236 JOptionPane
.showMessageDialog(frame
, "Wrong Path:" + jTextField
.getText());
247 This method initializes jPanel2
249 @return javax.swing.JPanel
251 private JPanel
getJPanel2() {
252 if (jPanel2
== null) {
253 FlowLayout flowLayout1
= new FlowLayout();
254 flowLayout1
.setAlignment(java
.awt
.FlowLayout
.LEFT
);
255 flowLayout1
.setVgap(20);
256 jLabel1
= new JLabel();
257 jLabel1
.setText("Enter Workspace Location");
258 jLabel1
.setComponentOrientation(java
.awt
.ComponentOrientation
.UNKNOWN
);
259 jLabel1
.setHorizontalTextPosition(javax
.swing
.SwingConstants
.TRAILING
);
260 jLabel1
.setHorizontalAlignment(javax
.swing
.SwingConstants
.TRAILING
);
261 jPanel2
= new JPanel();
262 jPanel2
.setLayout(flowLayout1
);
263 jPanel2
.add(jLabel1
, null);
269 This method initializes jPanel4
271 @return javax.swing.JPanel
273 private JPanel
getJPanel4() {
274 if (jPanel4
== null) {
275 FlowLayout flowLayout2
= new FlowLayout();
276 flowLayout2
.setAlignment(java
.awt
.FlowLayout
.LEFT
);
277 jPanel4
= new JPanel();
278 jPanel4
.setLayout(flowLayout2
);
279 jPanel4
.add(getJTextField1(), null);
280 jPanel4
.add(getJButton1(), null);
286 This method initializes jTextField1
288 @return javax.swing.JTextField
290 private JTextField
getJTextField1() {
291 if (jTextField1
== null) {
292 jTextField1
= new JTextField();
293 jTextField1
.setPreferredSize(new java
.awt
.Dimension(350, 20));
297 // default value is WORKSPACE environmental variable value
299 jTextField1
.setText(System
.getenv("WORKSPACE"));
304 This method initializes jButton1
306 @return javax.swing.JButton
308 private JButton
getJButton1() {
309 if (jButton1
== null) {
310 jButton1
= new JButton();
311 jButton1
.setComponentOrientation(java
.awt
.ComponentOrientation
.LEFT_TO_RIGHT
);
313 jButton1
.setHorizontalAlignment(javax
.swing
.SwingConstants
.LEADING
);
314 jButton1
.setHorizontalTextPosition(javax
.swing
.SwingConstants
.TRAILING
);
315 jButton1
.setText("Browse");
316 jButton1
.setPreferredSize(new java
.awt
.Dimension(80, 20));
317 jButton1
.addMouseListener(new java
.awt
.event
.MouseAdapter() {
318 public void mouseClicked(java
.awt
.event
.MouseEvent e
) {
319 if (chooser
== null) {
320 chooser
= new JFileChooser();
323 // only directories can be selected for workspace location.
325 chooser
.setMultiSelectionEnabled(false);
326 chooser
.setFileSelectionMode(JFileChooser
.DIRECTORIES_ONLY
);
328 int retval
= chooser
.showOpenDialog(frame
);
329 if (retval
== JFileChooser
.APPROVE_OPTION
) {
331 File theFile
= chooser
.getSelectedFile();
332 jTextField1
.setText(theFile
.getPath());
334 // set a default directory for installation (WORKSPACE\PackageFileName)
336 if (jTextField
.getText().length() > 0) {
337 int indexbegin
= jTextField
.getText().lastIndexOf(System
.getProperty("file.separator"));
338 int indexend
= jTextField
.getText().lastIndexOf('.');
339 if (indexbegin
>= 0 && indexend
>= 0) {
340 jTextField2
.setText(jTextField1
.getText()
341 + jTextField
.getText().substring(indexbegin
, indexend
));
343 JOptionPane
.showMessageDialog(frame
, "Wrong Path:" + jTextField
.getText());
355 This method initializes jButton4
357 @return javax.swing.JButton
359 private JButton
getJButton4() {
360 if (jButton4
== null) {
361 jButton4
= new JButton();
362 jButton4
.setComponentOrientation(ComponentOrientation
.LEFT_TO_RIGHT
);
364 jButton4
.setHorizontalAlignment(SwingConstants
.LEADING
);
365 jButton4
.setHorizontalTextPosition(SwingConstants
.TRAILING
);
366 jButton4
.setText("Browse");
367 jButton4
.setPreferredSize(new Dimension(80, 20));
368 jButton4
.addMouseListener(new java
.awt
.event
.MouseAdapter() {
369 public void mouseClicked(java
.awt
.event
.MouseEvent e
) {
370 JFileChooser chooser
= new JFileChooser(jTextField1
.getText());
372 chooser
.setMultiSelectionEnabled(false);
373 chooser
.setFileSelectionMode(JFileChooser
.DIRECTORIES_ONLY
);
375 int retval
= chooser
.showOpenDialog(frame
);
376 if (retval
== JFileChooser
.APPROVE_OPTION
) {
378 // specify installation directory from file chooser
380 File theFile
= chooser
.getSelectedFile();
381 jTextField2
.setText(theFile
.getPath());
391 This method initializes jPanel5
393 @return javax.swing.JPanel
395 private JPanel
getJPanel5() {
396 if (jPanel5
== null) {
397 FlowLayout flowLayout3
= new FlowLayout();
398 flowLayout3
.setAlignment(java
.awt
.FlowLayout
.LEFT
);
399 flowLayout3
.setVgap(20);
400 jLabel2
= new JLabel();
401 jLabel2
.setComponentOrientation(java
.awt
.ComponentOrientation
.UNKNOWN
);
402 jLabel2
.setHorizontalTextPosition(javax
.swing
.SwingConstants
.TRAILING
);
403 jLabel2
.setText("Enter Installation Location Within Workspace");
404 jLabel2
.setHorizontalAlignment(javax
.swing
.SwingConstants
.TRAILING
);
405 jPanel5
= new JPanel();
406 jPanel5
.setLayout(flowLayout3
);
407 jPanel5
.add(jLabel2
, null);
413 This method initializes jPanel6
415 @return javax.swing.JPanel
417 private JPanel
getJPanel6() {
418 if (jPanel6
== null) {
419 FlowLayout flowLayout4
= new FlowLayout();
420 flowLayout4
.setAlignment(java
.awt
.FlowLayout
.LEFT
);
421 jPanel6
= new JPanel();
422 jPanel6
.setLayout(flowLayout4
);
423 jPanel6
.add(getJTextField2(), null);
424 jPanel6
.add(getJButton4(), null);
430 This method initializes jPanel7
432 @return javax.swing.JPanel
434 private JPanel
getJPanel7() {
435 if (jPanel7
== null) {
436 FlowLayout flowLayout5
= new FlowLayout();
437 flowLayout5
.setAlignment(java
.awt
.FlowLayout
.RIGHT
);
438 jPanel7
= new JPanel();
439 jPanel7
.setLayout(flowLayout5
);
440 jPanel7
.add(getJProgressBar(), null);
441 jPanel7
.add(getJButton2(), null);
442 jPanel7
.add(getJButton3(), null);
448 This method initializes jTextField2
450 @return javax.swing.JTextField
452 private JTextField
getJTextField2() {
453 if (jTextField2
== null) {
454 jTextField2
= new JTextField();
455 jTextField2
.setPreferredSize(new java
.awt
.Dimension(350, 20));
461 This method initializes jButton2
463 @return javax.swing.JButton
465 private JButton
getJButton2() {
466 if (jButton2
== null) {
467 jButton2
= new JButton();
468 jButton2
.setPreferredSize(new java
.awt
.Dimension(80, 20));
469 jButton2
.setText("Ok");
470 jButton2
.addMouseListener(new java
.awt
.event
.MouseAdapter() {
471 public void mouseClicked(java
.awt
.event
.MouseEvent e
) {
474 // The installation directory must under workspace directory
476 locationcheck(jTextField
.getText(), jTextField1
.getText(), jTextField2
.getText());
477 } catch (Exception ee
) {
478 JOptionPane
.showMessageDialog(frame
, "Package Location Error!");
484 // create a new FrameworkPkg object with user-selected package, current workspace location.
485 // install the package to dest dir from jTextField2
487 int i
= new FrameworkPkg(jTextField
.getText(), jTextField1
.getText())
491 // the package is installed smoothly
494 JOptionPane
.showMessageDialog(frame
, "Package" + jTextField
.getText()
495 + " Installed Successfully!");
497 } catch (BasePkgNotInstalled bpni
) {
499 // exception no base package installed
502 .showMessageDialog(frame
,
503 "The Edk package needs to be installed before installing any other packages.");
504 } catch (VerNotEqual vne
) {
506 // show modal GUI PkgInstallTypeChooser with user selected package name,
507 // current workspace location and the list of package info with same base name
509 ModalFrameUtil
.showAsModal(new PkgInstallTypeChooser(jTextField
.getText(),
510 jTextField1
.getText(), vne
.getVersion()),
513 } catch (GuidNotEqual gne
) {
515 // show modal GUI PkgInstallTypeChooser with user selected package name,
516 // current workspace location and the list of package info with same base name and version
518 ModalFrameUtil
.showAsModal(new PkgInstallTypeChooser(jTextField
.getText(),
519 jTextField1
.getText(), gne
.getGuid()),
522 } catch (SameAll sa
) {
524 // the package with same (base, version, guid) already exists. confirm user action.
525 // quit or replace the original info. (So only one package info entry in db file that may be triple same)
527 int retVal
= JOptionPane
530 "Package already exists. Would you like to replace it?",
531 "Package Installation", JOptionPane
.YES_NO_OPTION
);
532 if (retVal
== JOptionPane
.YES_OPTION
) {
533 String installDir
= sa
.getVersion().listIterator().next().getPathArray(0).getStringValue();
535 ForceInstallPkg f
= new ForceInstallPkg(jTextField
.getText(), jTextField1
.getText());
537 // Get old packag info to meet the calling parameter layout of DbFileContents.updatePkgInfo
538 // ForceInstallPkg will call it after installation to update package info.
540 f
.setOldVersion(sa
.getVersion().listIterator().next().getVersionArray(0));
541 f
.setOldGuid(sa
.getVersion().listIterator().next().getGuidArray(0).getStringValue());
542 int i
= f
.install(jTextField1
.getText() + System
.getProperty("file.separator") + installDir
);
544 JOptionPane
.showMessageDialog(frame
, "Package" + jTextField
.getText()
545 + " Installed Successfully!");
547 } catch (Exception sae
) {
548 System
.out
.println(sae
.toString());
549 JOptionPane
.showMessageDialog(frame
, "Extraction Error!");
553 } catch (XmlException xmle
) {
554 System
.out
.println(xmle
.toString());
555 JOptionPane
.showMessageDialog(frame
, "Package Format Error!");
556 } catch (DirSame ds
) {
558 // You cannot install different packages into the same directory.
560 System
.out
.println(ds
.toString());
561 JOptionPane
.showMessageDialog(frame
,
562 "Another Package Exists There, Please Select Another Directory!");
563 } catch (Exception ext
) {
564 System
.out
.println(ext
.toString());
565 JOptionPane
.showMessageDialog(frame
, "Extraction Error!");
574 * This method initializes jButton3
576 * @return javax.swing.JButton
578 private JButton
getJButton3() {
579 if (jButton3
== null) {
580 jButton3
= new JButton();
581 jButton3
.setPreferredSize(new java
.awt
.Dimension(80, 20));
582 jButton3
.setText("Cancel");
583 jButton3
.addMouseListener(this);
590 This method initializes jPanel3
592 @return javax.swing.JPanel
594 private JPanel
getJPanel3() {
595 if (jPanel3
== null) {
596 jLabel
= new JLabel();
597 jLabel
.setComponentOrientation(ComponentOrientation
.UNKNOWN
);
598 jLabel
.setHorizontalTextPosition(SwingConstants
.TRAILING
);
599 jLabel
.setText("Enter Package Location");
600 jLabel
.setHorizontalAlignment(SwingConstants
.TRAILING
);
601 FlowLayout flowLayout6
= new FlowLayout();
602 flowLayout6
.setVgap(20);
603 flowLayout6
.setAlignment(FlowLayout
.LEFT
);
604 jPanel3
= new JPanel();
605 jPanel3
.setLayout(flowLayout6
);
606 jPanel3
.add(jLabel
, null);
612 check user input validity
614 @param s package path
615 @param s1 workspace path
616 @param s2 installation path
619 private void locationcheck(String s
, String s1
, String s2
) throws Exception
{
620 if (new File(s
).isFile() == false)
621 throw new Exception();
622 if (new File(s1
).isDirectory() == false)
623 throw new Exception();
624 if (s2
.startsWith(s1
) == false)
625 throw new Exception();
629 public void mouseClicked(MouseEvent arg0
) {
630 // TODO Auto-generated method stub
631 int retVal
= JOptionPane
.showConfirmDialog(frame
, "Are you sure to exit?", "Quit", JOptionPane
.YES_NO_OPTION
);
632 if (retVal
== JOptionPane
.YES_OPTION
) {
638 public void mouseEntered(MouseEvent arg0
) {
639 // TODO Auto-generated method stub
643 public void mouseExited(MouseEvent arg0
) {
644 // TODO Auto-generated method stub
648 public void mousePressed(MouseEvent arg0
) {
649 // TODO Auto-generated method stub
653 public void mouseReleased(MouseEvent arg0
) {
654 // TODO Auto-generated method stub
659 This method initializes jProgressBar
661 @return javax.swing.JProgressBar
663 private JProgressBar
getJProgressBar() {
664 if (jProgressBar
== null) {
665 jProgressBar
= new JProgressBar();
666 jProgressBar
.setComponentOrientation(java
.awt
.ComponentOrientation
.LEFT_TO_RIGHT
);
667 jProgressBar
.setVisible(false);
674 } // @jve:decl-index=0:visual-constraint="24,82"
677 Derived from WindowAdapter, Event adapter for windowClosing event
679 @since PackageEditor 1.0
681 class GuiPkgInstallAdapter
extends WindowAdapter
{
683 private JFrame frame
= null;
685 GuiPkgInstallAdapter(JFrame f
) {
691 * @see java.awt.event.WindowAdapter#windowClosing(java.awt.event.WindowEvent)
694 public void windowClosing(WindowEvent arg0
) {
695 // TODO Auto-generated method stub
696 super.windowClosing(arg0
);
697 int retVal
= JOptionPane
.showConfirmDialog(frame
, "Are you sure to exit?", "Quit",
698 JOptionPane
.YES_NO_OPTION
);
699 if (retVal
== JOptionPane
.YES_OPTION
) {
708 Filter out some specific type of file
710 @since PackageEditor 1.0
712 class PkgFileFilter
extends FileFilter
{
715 /// hash table used to store filter info.
717 private Hashtable
<String
, String
> filters
= null;
720 public PkgFileFilter() {
721 this.filters
= new Hashtable
<String
, String
>();
725 Create filter and add extension to hash table
727 @param extension file extension string (e.g. "exe")
729 public PkgFileFilter(String extension
) {
731 if(extension
!=null) {
732 addExtension(extension
);
737 public PkgFileFilter(String
[] fileFilters
) {
740 while (i
< fileFilters
.length
) {
741 // add filters one by one
742 addExtension(fileFilters
[i
]);
750 * @see javax.swing.filechooser.FileFilter#accept(java.io.File)
752 public boolean accept(File f
) {
754 if (f
.isDirectory()) {
758 if (getExtension(f
) != null && filters
.get(getExtension(f
)) != null) {
767 Get the extension string of file
772 public String
getExtension(File f
) {
774 int i
= f
.getName().lastIndexOf('.');
775 if (i
>0 && i
<f
.getName().length()-1) {
776 return f
.getName().substring(i
+1).toLowerCase();
784 Add extension info into hash table
786 @param ext extension string for file name
788 public void addExtension(String ext
) {
789 if (filters
== null) {
790 filters
= new Hashtable
<String
, String
>(5);
792 filters
.put(ext
.toLowerCase(), "ext");
797 * @see javax.swing.filechooser.FileFilter#getDescription()
799 public String
getDescription() {