--- /dev/null
+/** @file\r
+\r
+ Copyright (c) 2006, Intel Corporation\r
+ All rights reserved. This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php\r
+ \r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ \r
+ **/\r
+\r
+package org.tianocore.frameworkwizard.far.deleteui;\r
+\r
+import java.awt.Dimension;\r
+import java.awt.Toolkit;\r
+import java.awt.event.MouseEvent;\r
+import java.awt.event.MouseListener;\r
+import java.io.File;\r
+import java.util.Iterator;\r
+import java.util.LinkedHashSet;\r
+import java.util.Set;\r
+import java.util.Vector;\r
+\r
+import javax.swing.ButtonGroup;\r
+import javax.swing.JPanel;\r
+import javax.swing.JButton;\r
+import javax.swing.JTextArea;\r
+import javax.swing.JLabel;\r
+import javax.swing.JRadioButton;\r
+\r
+import org.tianocore.frameworkwizard.common.DataType;\r
+import org.tianocore.frameworkwizard.common.ui.IDialog;\r
+import org.tianocore.frameworkwizard.far.FarIdentification;\r
+import org.tianocore.frameworkwizard.packaging.PackageIdentification;\r
+import org.tianocore.frameworkwizard.platform.PlatformIdentification;\r
+import org.tianocore.frameworkwizard.workspace.WorkspaceTools;\r
+\r
+public class DeleteStepTwo extends IDialog implements MouseListener {\r
+\r
+ /**\r
+ * \r
+ */\r
+ private static final long serialVersionUID = -1333748185798962746L;\r
+\r
+ private JPanel jContentPane = null;\r
+\r
+ private JButton jButtonCancel = null;\r
+\r
+ private JButton jButtonFinish = null;\r
+\r
+ private JButton jButtonPrevious = null;\r
+\r
+ private JTextArea jTextArea = null;\r
+\r
+ private JLabel jLabel = null;\r
+\r
+ private JRadioButton jRadioButton = null;\r
+\r
+ private JRadioButton jRadioButton1 = null;\r
+\r
+ private DeleteStepOne stepOne = null;\r
+\r
+ public DeleteStepTwo(IDialog iDialog, boolean modal, DeleteStepOne stepOne) {\r
+ this(iDialog, modal);\r
+ this.stepOne = stepOne;\r
+ }\r
+\r
+ /**\r
+ * This method initializes jButtonCancel \r
+ * \r
+ * @return javax.swing.JButton \r
+ */\r
+ private JButton getJButtonCancel() {\r
+ if (jButtonCancel == null) {\r
+ jButtonCancel = new JButton();\r
+ jButtonCancel.setBounds(new java.awt.Rectangle(570, 330, 90, 20));\r
+ jButtonCancel.setText("Cancel");\r
+ jButtonCancel.addMouseListener(this);\r
+ }\r
+ return jButtonCancel;\r
+ }\r
+\r
+ /**\r
+ * This method initializes jButtonFinish \r
+ * \r
+ * @return javax.swing.JButton \r
+ */\r
+ private JButton getJButtonFinish() {\r
+ if (jButtonFinish == null) {\r
+ jButtonFinish = new JButton();\r
+ jButtonFinish.setBounds(new java.awt.Rectangle(470, 330, 90, 20));\r
+ jButtonFinish.setText("Finish");\r
+ jButtonFinish.addMouseListener(this);\r
+ }\r
+ return jButtonFinish;\r
+ }\r
+\r
+ /**\r
+ * This method initializes jButtonPrevious \r
+ * \r
+ * @return javax.swing.JButton \r
+ */\r
+ private JButton getJButtonPrevious() {\r
+ if (jButtonPrevious == null) {\r
+ jButtonPrevious = new JButton();\r
+ jButtonPrevious.setBounds(new java.awt.Rectangle(370, 330, 90, 20));\r
+ jButtonPrevious.setText("Previous");\r
+ jButtonPrevious.addMouseListener(this);\r
+ }\r
+ return jButtonPrevious;\r
+ }\r
+\r
+ /**\r
+ * This method initializes jTextArea \r
+ * \r
+ * @return javax.swing.JTextArea \r
+ */\r
+ private JTextArea getJTextArea() {\r
+ if (jTextArea == null) {\r
+ jTextArea = new JTextArea();\r
+ jTextArea.setBounds(new java.awt.Rectangle(30, 7, 642, 50));\r
+ jTextArea.setText("Step 2: Choose Delete Mode. \n");\r
+ jTextArea.append("Mode 1 only remove register information from framework database. \n");\r
+ jTextArea.append("Mode 2 also delete all files from file system. ");\r
+ jTextArea.setEditable(false);\r
+ }\r
+ return jTextArea;\r
+ }\r
+\r
+ /**\r
+ * This method initializes jRadioButton \r
+ * \r
+ * @return javax.swing.JRadioButton \r
+ */\r
+ private JRadioButton getJRadioButton() {\r
+ if (jRadioButton == null) {\r
+ jRadioButton = new JRadioButton();\r
+ jRadioButton.setBounds(new java.awt.Rectangle(100, 100, 340, 20));\r
+ jRadioButton.setSelected(true);\r
+ jRadioButton.setText("Mode 1: Only remove from framework database");\r
+ }\r
+ return jRadioButton;\r
+ }\r
+\r
+ /**\r
+ * This method initializes jRadioButton1 \r
+ * \r
+ * @return javax.swing.JRadioButton \r
+ */\r
+ private JRadioButton getJRadioButton1() {\r
+ if (jRadioButton1 == null) {\r
+ jRadioButton1 = new JRadioButton();\r
+ jRadioButton1.setBounds(new java.awt.Rectangle(100, 140, 358, 20));\r
+ jRadioButton1.setText("Mode 2: Delete all related files from workspace");\r
+ }\r
+ return jRadioButton1;\r
+ }\r
+\r
+ /**\r
+ * This is the default constructor\r
+ */\r
+ public DeleteStepTwo(IDialog iDialog, boolean modal) {\r
+ super(iDialog, modal);\r
+ initialize();\r
+ }\r
+\r
+ /**\r
+ * This method initializes this\r
+ * \r
+ * @return void\r
+ */\r
+ private void initialize() {\r
+ this.setSize(700, 400);\r
+ this.setContentPane(getJContentPane());\r
+ this.setTitle("Delete Framework Archive(FAR) - Step 2: Choose Delete Mode");\r
+ Dimension d = Toolkit.getDefaultToolkit().getScreenSize();\r
+ this.setLocation((d.width - this.getSize().width) / 2, (d.height - this.getSize().height) / 2);\r
+ }\r
+\r
+ /**\r
+ * This method initializes jContentPane\r
+ * \r
+ * @return javax.swing.JPanel\r
+ */\r
+ private JPanel getJContentPane() {\r
+ if (jContentPane == null) {\r
+ jLabel = new JLabel();\r
+ jLabel.setBounds(new java.awt.Rectangle(30, 70, 200, 20));\r
+ jLabel.setText("Select delete mode: ");\r
+ jContentPane = new JPanel();\r
+ jContentPane.setLayout(null);\r
+ jContentPane.add(getJButtonCancel(), null);\r
+ jContentPane.add(getJButtonFinish(), null);\r
+ jContentPane.add(getJButtonPrevious(), null);\r
+ jContentPane.add(getJTextArea(), null);\r
+ jContentPane.add(jLabel, null);\r
+ ButtonGroup group = new ButtonGroup();\r
+ group.add(getJRadioButton());\r
+ group.add(getJRadioButton1());\r
+ jContentPane.add(getJRadioButton(), null);\r
+ jContentPane.add(getJRadioButton1(), null);\r
+ }\r
+ return jContentPane;\r
+ }\r
+\r
+ public void mouseClicked(MouseEvent e) {\r
+ if (e.getSource() == jButtonCancel) {\r
+ this.setVisible(false);\r
+ this.dispose();\r
+ } else if (e.getSource() == jButtonFinish) {\r
+ FarIdentification far = stepOne.getSelecedFar();\r
+ WorkspaceTools wt = new WorkspaceTools();\r
+ //\r
+ // If remove all source files\r
+ //\r
+ if (jRadioButton1.isSelected()) {\r
+\r
+ Vector<PackageIdentification> removePackages = wt.getPackagesByFar(far);\r
+ Vector<PlatformIdentification> removePlatforms = wt.getPlatformsByFar(far);\r
+\r
+ Vector<PlatformIdentification> allPlatforms = wt.getAllPlatforms();\r
+ Set<File> allPlatformFiles = new LinkedHashSet<File>();\r
+\r
+ Iterator<PlatformIdentification> iter = allPlatforms.iterator();\r
+ while (iter.hasNext()) {\r
+ allPlatformFiles.add(iter.next().getFpdFile());\r
+ }\r
+\r
+ //\r
+ // For all platforms, only remove its FPD file\r
+ //\r
+ Iterator<PlatformIdentification> platfomrIter = removePlatforms.iterator();\r
+ while (platfomrIter.hasNext()) {\r
+ PlatformIdentification item = platfomrIter.next();\r
+ allPlatformFiles.remove(item.getFpdFile());\r
+ File parentDir = item.getFpdFile().getParentFile();\r
+ item.getFpdFile().delete();\r
+ //\r
+ // Remove all empty parent dir\r
+ //\r
+ while (parentDir.listFiles().length == 0) {\r
+ File tempFile = parentDir;\r
+ parentDir = parentDir.getParentFile();\r
+ tempFile.delete();\r
+ }\r
+ }\r
+\r
+ //\r
+ // For all packages, remove all files. \r
+ // Exception FPD file still in DB\r
+ //\r
+\r
+ Iterator<PackageIdentification> packageIter = removePackages.iterator();\r
+ while (packageIter.hasNext()) {\r
+ PackageIdentification item = packageIter.next();\r
+ Set<File> deleteFiles = new LinkedHashSet<File>();\r
+ recursiveDir(deleteFiles, item.getSpdFile().getParentFile(), allPlatformFiles);\r
+ Iterator<File> iterDeleteFile = deleteFiles.iterator();\r
+ while (iterDeleteFile.hasNext()) {\r
+ deleteFiles(iterDeleteFile.next());\r
+ }\r
+ //\r
+ // Remove all empty parent dir\r
+ //\r
+ File parentDir = item.getSpdFile().getParentFile();\r
+ while (parentDir.listFiles().length == 0) {\r
+ File tempFile = parentDir;\r
+ parentDir = parentDir.getParentFile();\r
+ tempFile.delete();\r
+ }\r
+ }\r
+ }\r
+\r
+ //\r
+ // Update DB file\r
+ //\r
+ wt.removeFarFromDb(far);\r
+\r
+ this.setVisible(false);\r
+ this.stepOne.returnType = DataType.RETURN_TYPE_OK;\r
+ this.dispose();\r
+ } else if (e.getSource() == jButtonPrevious) {\r
+ this.setVisible(false);\r
+ stepOne.setVisible(true);\r
+ }\r
+ }\r
+\r
+ public void mousePressed(MouseEvent e) {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ public void mouseReleased(MouseEvent e) {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ public void mouseEntered(MouseEvent e) {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ public void mouseExited(MouseEvent e) {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+\r
+ private void recursiveDir(Set<File> files, File dir, Set<File> platformFiles) {\r
+ File[] fileList = dir.listFiles();\r
+ for (int i = 0; i < fileList.length; i++) {\r
+ if (fileList[i].isFile()) {\r
+ if (!platformFiles.contains(fileList[i])) {\r
+ files.add(fileList[i]);\r
+ }\r
+ } else {\r
+ if (isContain(fileList[i], platformFiles)) {\r
+ recursiveDir(files, fileList[i], platformFiles);\r
+ } else {\r
+ files.add(fileList[i]);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ private void deleteFiles(File file) {\r
+ if (file.isDirectory()) {\r
+ File[] files = file.listFiles();\r
+ for (int i = 0; i < files.length; i++) {\r
+ deleteFiles(files[i]);\r
+ }\r
+ }\r
+ file.delete();\r
+ }\r
+\r
+ private boolean isContain(File dir, Set<File> platformFiles) {\r
+ Iterator<File> iter = platformFiles.iterator();\r
+ while (iter.hasNext()) {\r
+ File file = iter.next();\r
+ if (file.getPath().startsWith(dir.getPath())) {\r
+ //\r
+ // continue this FPD file\r
+ //\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+}\r