[izpack-changes] r2004 - izpack-src/trunk/src/lib/com/izforge/izpack/panels

noreply at berlios.de noreply at berlios.de
Thu Jan 24 20:22:56 CET 2008


Author: jgordon
Date: 2008-01-24 20:22:46 +0100 (Thu, 24 Jan 2008)
New Revision: 2004

Added:
   izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathInputPanel.java
   izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathPanel.java
   izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathPanelAutomationHelper.java
   izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathSelectionPanel.java
Log:
Implemented copy of PathPanel as UserPathPanel (as alternative to dir type in UserInputPanel)

Added: izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathInputPanel.java
===================================================================
--- izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathInputPanel.java	2008-01-24 19:21:23 UTC (rev 2003)
+++ izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathInputPanel.java	2008-01-24 19:22:46 UTC (rev 2004)
@@ -0,0 +1,422 @@
+/*
+ * IzPack - Copyright 2001-2007 Julien Ponge, All Rights Reserved.
+ * 
+ * https://izpack.github.io/
+ * http://developer.berlios.de/projects/izpack/
+ * 
+ * Copyright 2004 Klaus Bartz
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *     
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.izforge.izpack.panels;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import com.izforge.izpack.gui.IzPanelLayout;
+import com.izforge.izpack.installer.InstallData;
+import com.izforge.izpack.installer.InstallerFrame;
+import com.izforge.izpack.installer.IzPanel;
+import com.izforge.izpack.installer.ResourceNotFoundException;
+import com.izforge.izpack.util.AbstractUIHandler;
+import com.izforge.izpack.util.Debug;
+import com.izforge.izpack.util.IoHelper;
+import com.izforge.izpack.util.OsVersion;
+import com.izforge.izpack.util.VariableSubstitutor;
+
+/**
+ * Base class for panels which asks for paths.
+ * 
+ * @author Klaus Bartz
+ * @author Jeff Gordon
+ * 
+ */
+public class UserPathInputPanel extends IzPanel implements ActionListener {
+
+  /**
+   * 
+   */
+  private InstallerFrame _parent; 
+  private InstallData _idata;
+  private static final long serialVersionUID = 3257566217698292531L;
+  /** Flag whether the choosen path must exist or not */
+  protected boolean _mustExist = false;
+  protected boolean _loadedDefaultDir = false;
+  /** Files which should be exist */
+  protected String[] _existFiles = null;
+  /** The path which was chosen */
+  // protected String chosenPath;
+  /** The path selection sub panel */
+  protected UserPathSelectionPanel _pathSelectionPanel;
+  protected String _error;
+  protected String _warn;
+  protected String _emptyTargetMsg;
+  protected String _warnMsg;
+  protected String _reqMsg;
+  protected String _notValidMsg;
+  protected String _notWritableMsg;
+  protected String _createDirMsg;
+  protected String _defaultDir = null;
+  protected String _thisPanel = "UserPathInputPanel";
+  protected String _defaultPanelName = "TargetPanel";
+  protected String _targetPanel = "UserPathPanel";
+  protected String _variableName = "pathVariable";
+
+  /**
+   * The constructor.
+   * 
+   * @param parent The parent window.
+   * @param idata The installation data.
+   */
+  public UserPathInputPanel(InstallerFrame parent, InstallData idata, String targetPanel, String variableName) {
+    super(parent, idata, new IzPanelLayout());
+    _parent = parent;
+    _idata = idata;
+    _targetPanel = targetPanel;
+    _variableName = variableName;
+    // Set default values
+    loadMessages();
+    String introText = getI18nStringForClass("extendedIntro", _thisPanel);
+    if (introText == null || introText.endsWith("extendedIntro") || introText.indexOf('$') > -1) {
+      introText = getI18nStringForClass("intro", _thisPanel);
+      if (introText == null || introText.endsWith("intro")) {
+        introText = "";
+      }
+    }
+    // Intro
+    // row 0 column 0
+    add(createMultiLineLabel(introText));
+    add(IzPanelLayout.createParagraphGap());
+    // Label for input
+    // row 1 column 0.
+    add(createLabel("info", _targetPanel, "open", LEFT, true), NEXT_LINE);
+    // Create path selection components and add they to this panel.
+    _pathSelectionPanel = new UserPathSelectionPanel(this, idata, _targetPanel, _variableName);
+    add(_pathSelectionPanel, NEXT_LINE);
+    createLayoutBottom();
+    getLayoutHelper().completeLayout();
+  }
+
+  /**
+   * This method does nothing. It is called from ctor of UserPathInputPanel, to give in a derived
+   * class the possibility to add more components under the path input components.
+   */
+  public void createLayoutBottom() {
+  // Derived classes implements additional elements.
+  }
+
+  /**
+   * Actions-handling method.
+   * 
+   * @param e The event.
+   */
+  public void actionPerformed(ActionEvent e) {
+    Object source = e.getSource();
+    if (source == _pathSelectionPanel.getPathInputField()) {
+      parent.navigateNext();
+    }
+
+  }
+
+  private void loadMessages() {
+    _error = parent.langpack.getString("installer.error");
+    _warn = parent.langpack.getString("installer.warning");
+    _reqMsg = getMessage("required");
+    _emptyTargetMsg = getMessage("empty_target");
+    _warnMsg = getMessage("exists_warn");
+    _notValidMsg = getMessage("notValid");
+    _notWritableMsg = getMessage("notwritable");
+    _createDirMsg = getMessage("createdir");
+  }
+
+  private String getMessage(String type) {
+    String msg = null;
+    msg = getI18nStringForClass(type, _targetPanel);
+    if (msg == null) {
+      msg = getI18nStringForClass(type, _defaultPanelName);
+    }
+    return msg;
+  }
+
+  /**
+   * Indicates whether the panel has been validated or not.
+   * 
+   * @return Whether the panel has been validated or not.
+   */
+  public boolean isValidated() {
+    String chosenPath = _pathSelectionPanel.getPath();
+    boolean ok = true;
+    // We put a warning if the specified target is nameless
+    if (chosenPath.length() == 0) {
+      if (isMustExist()) {
+        emitError(_error, _reqMsg);
+        return false;
+      }
+      ok = emitWarning(_warn, _emptyTargetMsg);
+    }
+    if (!ok) {
+      return ok;
+    }
+    // Normalize the path
+    File path = new File(chosenPath).getAbsoluteFile();
+    chosenPath = path.toString();
+    _pathSelectionPanel.setPath(chosenPath);
+    if (isMustExist()) {
+      if (!path.exists()) {
+        emitError(_error, _reqMsg);
+        return false;
+      }
+      if (!pathIsValid()) {
+        emitError(_error, _notValidMsg);
+        return false;
+      }
+    } else {
+      // We assume, that we would install something into this dir
+      if (!isWriteable()) {
+        emitError(_error, _notWritableMsg);
+        return false;
+      }
+      // We put a warning if the directory exists else we warn
+      // that it will be created
+      if (path.exists()) {
+        int res = askQuestion(_warn, _warnMsg,
+                AbstractUIHandler.CHOICES_YES_NO, AbstractUIHandler.ANSWER_YES);
+        ok = res == AbstractUIHandler.ANSWER_YES;
+      } else {
+        ok = this.emitNotificationFeedback(_createDirMsg + "\n" + chosenPath);
+      }
+    }
+    return ok;
+  }
+
+  /**
+   * Returns whether the chosen path is true or not. If existFiles are not null, the existence of
+   * it under the choosen path are detected. This method can be also implemented in derived
+   * classes to handle special verification of the path.
+   * 
+   * @return true if existFiles are exist or not defined, else false
+   */
+  protected boolean pathIsValid() {
+    if (_existFiles == null) {
+      return true;
+    }
+    for (int i = 0; i < _existFiles.length; ++i) {
+      File path = new File(_pathSelectionPanel.getPath(), _existFiles[i]).getAbsoluteFile();
+      if (!path.exists()) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Returns the must exist state.
+   * 
+   * @return the must exist state
+   */
+  public boolean isMustExist() {
+    return _mustExist;
+  }
+
+  /**
+   * Sets the must exist state. If it is true, the path must exist.
+   * 
+   * @param b must exist state
+   */
+  public void setMustExist(boolean b) {
+    _mustExist = b;
+  }
+
+  /**
+   * Returns the array of strings which are described the files which must exist.
+   * 
+   * @return paths of files which must exist
+   */
+  public String[] getExistFiles() {
+    return _existFiles;
+  }
+
+  /**
+   * Sets the paths of files which must exist under the chosen path.
+   * 
+   * @param strings paths of files which must exist under the chosen path
+   */
+  public void setExistFiles(String[] strings) {
+    _existFiles = strings;
+  }
+
+  /**
+   * "targetPanel" is typically the class name of the implementing panel, such as
+   * "UserPathPanel" or "TargetPanel" set when the class is created, but can be set 
+   * with setDefaultDir().
+   * Loads up the "dir" resource associated with targetPanel. Acceptable dir resource names:
+   * <code>
+   *   targetPanel.dir.macosx
+   *   targetPanel.dir.mac
+   *   targetPanel.dir.windows
+   *   targetPanel.dir.unix
+   *   targetPanel.dir.xxx,
+   *     where xxx is the lower case version of System.getProperty("os.name"),
+   *     with any spaces replace with underscores
+   *   targetPanel.dir (generic that will be applied if none of above is found)
+   *   </code>
+   * As with all IzPack resources, each the above ids should be associated with a separate
+   * filename, which is set in the install.xml file at compile time.
+   */
+  private void loadDefaultDir() {
+    // Load only once ...
+    if (!(_loadedDefaultDir)) {
+      BufferedReader br = null;
+      try {
+        InputStream in = null;
+        if (OsVersion.IS_WINDOWS) {
+          try {
+            in = _parent.getResource(_targetPanel + ".dir.windows");
+          } catch (ResourceNotFoundException rnfe) {
+          }//it's usual, that the resource does not exist
+        } else if (OsVersion.IS_OSX) {
+          try {
+            in = _parent.getResource(_targetPanel + ".dir.macosx");
+          } catch (ResourceNotFoundException rnfe) {
+          }//it's usual, that the resource does not exist
+        } else {
+          String os = System.getProperty("os.name");
+          // first try to look up by specific os name
+          os = os.replace(' ', '_'); // avoid spaces in file names
+          os = os.toLowerCase(); // for consistency among targetPanel res files
+          try {
+            in = _parent.getResource(_targetPanel + ".dir.".concat(os));
+          } catch (ResourceNotFoundException rnfe) {
+          }
+          // if not specific os, try getting generic 'unix' resource file
+          if (in == null) {
+            try {
+              in = _parent.getResource(_targetPanel + ".dir.unix");
+            } catch (ResourceNotFoundException eee) {
+            }
+          }
+        }
+        // if all above tests failed, there is no resource file,
+        // so use system default
+        if (in == null) {
+          try {
+            in = _parent.getResource(_targetPanel + ".dir");
+          } catch (ResourceNotFoundException eee) {
+          }
+        }
+        if (in != null) {
+          // now read the file, once we've identified which one to read
+          InputStreamReader isr = new InputStreamReader(in);
+          br = new BufferedReader(isr);
+          String line;
+          while ((line = br.readLine()) != null) {
+            line = line.trim();
+            // use the first non-blank line
+            if (!"".equals(line)) {
+              break;
+            }
+          }
+          _defaultDir = line;
+          VariableSubstitutor vs = new VariableSubstitutor(idata.getVariables());
+          _defaultDir = vs.substitute(_defaultDir, null);
+        }
+      } catch (Exception e) {
+        //mar: what's the common way to log an exception ?
+        e.printStackTrace();
+        _defaultDir = null;
+      // leave unset to take the system default set by Installer class
+      } finally {
+        try {
+          if (br != null) {
+            br.close();
+          }
+        } catch (IOException ignored) {
+        }
+      }
+    }
+    _loadedDefaultDir = true;
+  }
+
+  /**
+   * This method determines whether the chosen dir is writeable or not.
+   * 
+   * @return whether the chosen dir is writeable or not
+   */
+  public boolean isWriteable() {
+    File existParent = IoHelper.existingParent(new File(_pathSelectionPanel.getPath()));
+    if (existParent == null) {
+      return false;
+    }
+    // On windows we cannot use canWrite because
+    // it looks to the dos flags which are not valid
+    // on NT or 2k XP or ...
+    if (OsVersion.IS_WINDOWS) {
+      File tmpFile;
+      try {
+        tmpFile = File.createTempFile("izWrTe", ".tmp", existParent);
+        tmpFile.deleteOnExit();
+      } catch (IOException e) {
+        Debug.trace(e.toString());
+        return false;
+      }
+      return true;
+    }
+    return existParent.canWrite();
+  }
+
+  /**
+   * Returns the default for the directory.
+   * 
+   * @return the default for the directory
+   */
+  public String getDefaultDir() {
+    if (_defaultDir == null && (!(_loadedDefaultDir))) {
+      loadDefaultDir();
+    }
+    return _defaultDir;
+  }
+
+  /**
+   * Sets the default for the directory to the given string.
+   * 
+   * @param string path for default directory
+   */
+  public void setDefaultDir(String string) {
+    _defaultDir = string;
+  }
+
+  /**
+   * Returns the panel name extending this class.
+   * Used for looking up localized text and resources.
+   * 
+   * @return the default for the directory
+   */
+  public String getTargetPanel() {
+    return _targetPanel;
+  }
+
+  /**
+   * Sets the panel name extending this class.
+   * Used for looking up localized text and resources.
+   * 
+   * @param string path for default directory
+   */
+  public void setTargetPanel(String string) {
+    _targetPanel = string;
+  }
+}

Added: izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathPanel.java
===================================================================
--- izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathPanel.java	2008-01-24 19:21:23 UTC (rev 2003)
+++ izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathPanel.java	2008-01-24 19:22:46 UTC (rev 2004)
@@ -0,0 +1,138 @@
+/*
+ * IzPack - Copyright 2001-2007 Julien Ponge, All Rights Reserved.
+ * 
+ * https://izpack.github.io/
+ * http://developer.berlios.de/projects/izpack/
+ * 
+ * Copyright 2004 Klaus Bartz
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *     
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.izforge.izpack.panels;
+
+import com.izforge.izpack.Pack;
+import net.n3.nanoxml.XMLElement;
+
+import com.izforge.izpack.installer.InstallData;
+import com.izforge.izpack.installer.InstallerFrame;
+import com.izforge.izpack.util.AbstractUIHandler;
+import com.izforge.izpack.util.Debug;
+import com.izforge.izpack.util.OsConstraint;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * The taget directory selection panel.
+ * 
+ * @author Julien Ponge
+ * @author Jeff Gordon
+ */
+public class UserPathPanel extends UserPathInputPanel {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 3256443616359429170L;
+  private static String thisName = "UserPathPanel";
+  private boolean _skip = false;
+  public static String pathVariableName = "UserPathPanelVariable";
+  public static String pathPackDependsName = "UserPathPanelDependsName";
+  public static String pathElementName = "UserPathPanelElement";
+  private XMLElement panelElement;
+
+  /**
+   * The constructor.
+   * 
+   * @param parent The parent window.
+   * @param idata The installation data.
+   */
+  public UserPathPanel(InstallerFrame parent, InstallData idata) {
+    super(parent, idata, thisName, parent.langpack.getString(thisName+".variableName"));
+    // load the default directory info (if present)
+    if (getDefaultDir() != null) {
+      idata.setVariable(pathVariableName, getDefaultDir());
+    }
+  }
+
+  /** Called when the panel becomes active. */
+  public void panelActivate() {
+    boolean found = false;
+    System.out.println(thisName+" looking for activation condition");
+    // Need to have a way to supress panel if not in selected packs.  
+    String dependsName = idata.getVariable(pathPackDependsName);
+    if (dependsName!=null && !(dependsName.equalsIgnoreCase(""))) {
+      System.out.println("Checking for pack dependency of "+dependsName);
+      Iterator iter = idata.selectedPacks.iterator();
+      while (iter.hasNext()) {
+        Pack pack = (Pack)iter.next();
+        System.out.println("- Checking if "+pack.name+" equals "+dependsName);
+        if (pack.name.equalsIgnoreCase(dependsName)) {
+          found = true;
+          System.out.println("-- Found "+dependsName+", panel will be shown");
+          break;
+        }
+      }
+      _skip = !(found);
+    } else {
+      System.out.println("Not Checking for a pack dependency, panel will be shown");
+      _skip = false;
+    }
+    if (_skip) {
+      System.out.println(thisName+" will not be shown");
+      parent.skipPanel();
+      return;
+    }
+    super.panelActivate();
+    // Set the default or old value to the path selection panel.
+    _pathSelectionPanel.setPath(idata.getVariable(pathVariableName));
+  }
+
+  /**
+   * Indicates whether the panel has been validated or not.
+   * 
+   * @return Whether the panel has been validated or not.
+   */
+  public boolean isValidated() {
+    // Standard behavior of PathInputPanel.
+    if (!super.isValidated()) {
+      return (false);
+    }
+    idata.setVariable(pathVariableName, _pathSelectionPanel.getPath());
+    return (true);
+  }
+
+  /**
+   * Asks to make the XML panel data.
+   * 
+   * @param panelRoot The tree to put the data in.
+   */
+  public void makeXMLData(XMLElement panelRoot) {
+    if (!(_skip)) {
+      new UserPathPanelAutomationHelper().makeXMLData(idata, panelRoot);
+    }
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see com.izforge.izpack.installer.IzPanel#getSummaryBody()
+   */
+  public String getSummaryBody() {
+    if (_skip) {
+      return null;
+    } else {
+      return (idata.getVariable(pathVariableName));
+    }
+  }
+}

Added: izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathPanelAutomationHelper.java
===================================================================
--- izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathPanelAutomationHelper.java	2008-01-24 19:21:23 UTC (rev 2003)
+++ izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathPanelAutomationHelper.java	2008-01-24 19:22:46 UTC (rev 2004)
@@ -0,0 +1,77 @@
+/*
+ * IzPack - Copyright 2001-2007 Julien Ponge, All Rights Reserved.
+ * 
+ * https://izpack.github.io/
+ * http://developer.berlios.de/projects/izpack/
+ * 
+ * Copyright 2003 Jonathan Halliday
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *     
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.izforge.izpack.panels;
+
+import net.n3.nanoxml.XMLElement;
+import com.izforge.izpack.installer.AutomatedInstallData;
+import com.izforge.izpack.installer.PanelAutomation;
+import com.izforge.izpack.util.VariableSubstitutor;
+
+/**
+ * Functions to support automated usage of the UserPathPanel
+ * 
+ * @author Jonathan Halliday
+ * @author Julien Ponge
+ * @author Jeff Gordon
+ */
+public class UserPathPanelAutomationHelper implements PanelAutomation {
+  
+  /**
+   * Asks to make the XML panel data.
+   * 
+   * @param idata The installation data.
+   * @param panelRoot The tree to put the data in.
+   */
+  public void makeXMLData(AutomatedInstallData idata, XMLElement panelRoot) {
+    // Installation path markup
+    XMLElement ipath = new XMLElement(UserPathPanel.pathElementName);
+    // check this writes even if value is the default,
+    // because without the constructor, default does not get set.
+    ipath.setContent(idata.getVariable(UserPathPanel.pathVariableName));
+
+    // Checkings to fix bug #1864
+    XMLElement prev = panelRoot.getFirstChildNamed(UserPathPanel.pathElementName);
+    if (prev != null) {
+      panelRoot.removeChild(prev);
+    }
+    panelRoot.addChild(ipath);
+  }
+
+  /**
+   * Asks to run in the automated mode.
+   * 
+   * @param idata The installation data.
+   * @param panelRoot The XML tree to read the data from.
+   * 
+   * @return always true.
+   */
+  public boolean runAutomated(AutomatedInstallData idata, XMLElement panelRoot) {
+    // We set the installation path
+    XMLElement ipath = panelRoot.getFirstChildNamed(UserPathPanel.pathElementName);
+
+    // Allow for variable substitution of the installpath value
+    VariableSubstitutor vs = new VariableSubstitutor(idata.getVariables());
+    String path = ipath.getContent();
+    path = vs.substitute(path, null);
+    idata.setVariable(UserPathPanel.pathVariableName, path);
+    return true;
+  }
+}

Added: izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathSelectionPanel.java
===================================================================
--- izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathSelectionPanel.java	2008-01-24 19:21:23 UTC (rev 2003)
+++ izpack-src/trunk/src/lib/com/izforge/izpack/panels/UserPathSelectionPanel.java	2008-01-24 19:22:46 UTC (rev 2004)
@@ -0,0 +1,197 @@
+/*
+ * IzPack - Copyright 2001-2007 Julien Ponge, All Rights Reserved.
+ * 
+ * https://izpack.github.io/
+ * http://developer.berlios.de/projects/izpack/
+ * 
+ * Copyright 2004 Klaus Bartz
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *     
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.izforge.izpack.panels;
+
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+import com.izforge.izpack.gui.ButtonFactory;
+import com.izforge.izpack.gui.IzPanelConstraints;
+import com.izforge.izpack.gui.IzPanelLayout;
+import com.izforge.izpack.gui.LayoutConstants;
+import com.izforge.izpack.installer.InstallData;
+import com.izforge.izpack.installer.IzPanel;
+import com.izforge.izpack.installer.LayoutHelper;
+
+/**
+ * This is a sub panel which contains a text field and a browse button for path selection. This is
+ * NOT an IzPanel, else it is made to use in an IzPanel for any path selection. If the IzPanel
+ * parent implements ActionListener, the ActionPerformed method will be called, if
+ * PathSelectionPanel.ActionPerformed was called with a source other than the browse button. This
+ * can be used to perform parentFrame.navigateNext in the IzPanel parent. An example implementation
+ * is done in com.izforge.izpack.panels.PathInputPanel.
+ * 
+ * @author Klaus Bartz
+ * @author Jeff Gordon
+ * 
+ */
+public class UserPathSelectionPanel extends JPanel implements ActionListener, LayoutConstants {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 3618700794577105718L;
+  /** The text field for the path. */
+  private JTextField textField;
+  /** The 'browse' button. */
+  private JButton browseButton;
+  /** IzPanel parent (not the InstallerFrame). */
+  private IzPanel parent;
+  /**
+   * The installer internal data.
+   */
+  private InstallData idata;
+  private String targetPanel;
+  private String variableName;
+  private String defaultPanelName = "TargetPanel";
+
+  /**
+   * The constructor. Be aware, parent is the parent IzPanel, not the installer frame.
+   * 
+   * @param parent The parent IzPanel.
+   * @param idata The installer internal data.
+   */
+  public UserPathSelectionPanel(IzPanel parent, InstallData idata, String targetPanel, String variableName) {
+    super();
+    this.parent = parent;
+    this.idata = idata;
+    this.variableName = variableName;
+    this.targetPanel = targetPanel;
+    createLayout();
+  }
+
+  /**
+   * Creates the layout for this sub panel.
+   */
+  protected void createLayout() {
+    // We woulduse the IzPanelLayout also in this "sub"panel.
+    // In an IzPanel there are support of this layout manager at
+    // more than one places. In this panel not, therefore we have
+    // to make all things needed.
+    // First create a layout helper.
+    LayoutHelper layoutHelper = new LayoutHelper(this);
+    // Start the layout.
+    layoutHelper.startLayout(new IzPanelLayout());
+    // One of the rare points we need explicit a constraints.
+    IzPanelConstraints ipc = IzPanelLayout.getDefaultConstraint(TEXT_CONSTRAINT);
+    // The text field should be stretched.
+    ipc.setXStretch(1.0);
+    textField = new JTextField(idata.getVariable(variableName), 35);
+    textField.addActionListener(this);
+    parent.setInitialFocus(textField);
+    add(textField, ipc);
+    // We would have place between text field and button.
+    add(IzPanelLayout.createHorizontalFiller(3));
+    // No explicit constraints for the button (else implicit) because
+    // defaults are OK.
+    String buttonText = parent.getInstallerFrame().langpack.getString(targetPanel+".browse");
+    if (buttonText==null) {
+      buttonText = parent.getInstallerFrame().langpack.getString(defaultPanelName+".browse");
+    }
+    browseButton = ButtonFactory.createButton(buttonText, parent.getInstallerFrame().icons.getImageIcon("open"), idata.buttonsHColor);
+    browseButton.addActionListener(this);
+    add(browseButton);
+  }
+
+  // There are problems with the size if no other component needs the
+  // full size. Sometimes directly, somtimes only after a back step.
+  public Dimension getMinimumSize() {
+    Dimension ss = super.getPreferredSize();
+    Dimension retval = parent.getSize();
+    retval.height = ss.height;
+    return (retval);
+  }
+
+  /**
+   * Actions-handling method.
+   * 
+   * @param e The event.
+   */
+  public void actionPerformed(ActionEvent e) {
+    Object source = e.getSource();
+
+    if (source == browseButton) {
+      // The user wants to browse its filesystem
+
+      // Prepares the file chooser
+      JFileChooser fc = new JFileChooser();
+      fc.setCurrentDirectory(new File(textField.getText()));
+      fc.setMultiSelectionEnabled(false);
+      fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+      fc.addChoosableFileFilter(fc.getAcceptAllFileFilter());
+
+      // Shows it
+      if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
+        String path = fc.getSelectedFile().getAbsolutePath();
+        textField.setText(path);
+      }
+
+    } else {
+      if (parent instanceof ActionListener) {
+        ((ActionListener) parent).actionPerformed(e);
+      }
+    }
+  }
+
+  /**
+   * Returns the chosen path.
+   * 
+   * @return the chosen path
+   */
+  public String getPath() {
+    return (textField.getText());
+  }
+
+  /**
+   * Sets the contents of the text field to the given path.
+   * 
+   * @param path the path to be set
+   */
+  public void setPath(String path) {
+    textField.setText(path);
+  }
+
+  /**
+   * Returns the text input field for the path. This methode can be used to differ in a
+   * ActionPerformed method of the parent between the browse button and the text field.
+   * 
+   * @return the text input field for the path
+   */
+  public JTextField getPathInputField() {
+    return textField;
+  }
+
+  /**
+   * Returns the browse button object for modification or for use with a different ActionListener.
+   * 
+   * @return the browse button to open the JFileChooser
+   */
+  public JButton getBrowseButton() {
+    return browseButton;
+  }
+}



More information about the izpack-changes mailing list