/*
* Jajuk
* Copyright (C) The Jajuk Team
* http://jajuk.info
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
package org.jajuk.ui.wizard;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.border.BevelBorder;
import javax.swing.border.EmptyBorder;
import net.miginfocom.swing.MigLayout;
import org.jajuk.base.Device;
import org.jajuk.base.DeviceManager;
import org.jajuk.services.core.SessionService;
import org.jajuk.ui.widgets.JajukFileChooser;
import org.jajuk.ui.widgets.OKCancelPanel;
import org.jajuk.ui.widgets.PathSelector;
import org.jajuk.ui.widgets.ToggleLink;
import org.jajuk.util.Const;
import org.jajuk.util.IconLoader;
import org.jajuk.util.JajukFileFilter;
import org.jajuk.util.JajukIcons;
import org.jajuk.util.Messages;
import org.jajuk.util.UtilGUI;
import org.jajuk.util.filters.DirectoryFilter;
import org.jdesktop.swingx.JXCollapsiblePane;
import org.jdesktop.swingx.VerticalLayout;
/**
* First time Wizard.
*/
public class FirstTimeWizard extends JFrame implements ActionListener, PropertyChangeListener {
// Do not extend JajukJDialog because it requires main window to be instantiated and it comes with
// many trouble (like Global keystrokes issues in file path selection) in this low-level dialog
/** Generated serialVersionUID. */
private static final long serialVersionUID = 1L;
private JLabel jlLeftIcon;
private JPanel jpRightPanel;
private JButton jbFileSelection;
private JLabel jlSelectedFile;
private PathSelector workspacePath;
private JLabel jlRefreshTime;
private JTextField jtfRefreshTime;
private JXCollapsiblePane advanced;
private JButton jbOk;
private JButton jbCancel;
private JPanel jpMain;
/** Selected directory. */
private File fDir;
/** Default workspace location. */
private String defaultWorkspacePath;
/** User chosen workspace location. */
private String userWorkspacePath;
/** Any new device we created using this wizard. */
private static Device newDevice;
/**
* Gets the user workspace path.
*
* @return the user workspace path
*/
public String getUserWorkspacePath() {
return this.userWorkspacePath;
}
/**
* Gets any new device created through this wizard.
*
* @return any new device created through this wizard
*/
public static Device getNewDevice() {
return newDevice;
}
/**
* First time wizard.
*
* @param defaultWorkspacePath the default workspace path set in the textfield
*/
public FirstTimeWizard(String defaultWorkspacePath) {
super();
this.defaultWorkspacePath = defaultWorkspacePath;
}
/*
* (non-Javadoc)
*
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(final ActionEvent e) {
if (e.getSource() == jbCancel) {
dispose(); // close window
// alert SessionService to continue startup
SessionService.notifyFirstTimeWizardClosed();
} else if (e.getSource() == jbFileSelection) {
final JajukFileChooser jfc = new JajukFileChooser(new JajukFileFilter(
DirectoryFilter.getInstance()));
jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
jfc.setDialogTitle(Messages.getString("FirstTimeWizard.5"));
jfc.setMultiSelectionEnabled(false);
final int returnVal = jfc.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
fDir = jfc.getSelectedFile();
// First, check device availability
int code = DeviceManager.getInstance().checkDeviceAvailablity(fDir.getName(),
Device.Type.DIRECTORY, fDir.getAbsolutePath(), true);
if (code != 0) {
Messages.showErrorMessage(code);
jbOk.setEnabled(false);
return;
}
jbOk.setEnabled(true);
jbOk.grabFocus();
jlSelectedFile.setText(fDir.getAbsolutePath());
pack(); // repack as size of dialog can be exceeded now
}
} else if (e.getSource() == jbOk) {
String sPATH = workspacePath.getUrl().trim();
// Check workspace directory
if ((!sPATH.isEmpty()) && (!new File(sPATH).canRead())) {
Messages.showErrorMessage(165);
return;
}
// Close window
dispose();
// update the user chosen workspace path (read afterward by the SessionService)
userWorkspacePath = workspacePath.getUrl().trim();
// Notify Main to continue startup
SessionService.notifyFirstTimeWizardClosed();
// Create the new device
newDevice = DeviceManager.getInstance().registerDevice(fDir.getName(), Device.Type.DIRECTORY,
fDir.getAbsolutePath());
newDevice.setProperty(Const.XML_DEVICE_AUTO_MOUNT, true);
// Set refresh time
double dRefreshTime = 5d;
try {
dRefreshTime = Double.parseDouble(jtfRefreshTime.getText());
if (dRefreshTime < 0) {
dRefreshTime = 0;
}
} catch (final NumberFormatException e1) {
dRefreshTime = 0;
}
newDevice.setProperty(Const.XML_DEVICE_AUTO_REFRESH, dRefreshTime);
}
}
/**
* Inits the ui.
*/
public void initUI() {
setIconImage(IconLoader.getIcon(JajukIcons.LOGO).getImage());
setTitle(Messages.getString("FirstTimeWizard.0"));
jlLeftIcon = new JLabel(UtilGUI.getImage(Const.IMAGE_SEARCH));
jlLeftIcon.setBorder(new EmptyBorder(0, 20, 0, 0));
jpRightPanel = new JPanel();
JLabel jlWelcome = new JLabel(Messages.getString("FirstTimeWizard.1"));
JLabel jlFileSelection = new JLabel(Messages.getString("FirstTimeWizard.2"));
jbFileSelection = new JButton(IconLoader.getIcon(JajukIcons.OPEN_DIR));
jbFileSelection.addActionListener(this);
JLabel jlSelectedFileText = new JLabel(Messages.getString("FirstTimeWizard.8"));
jlSelectedFile = new JLabel(Messages.getString("FirstTimeWizard.9"));
jlSelectedFile.setBorder(new BevelBorder(BevelBorder.LOWERED));
final JLabel jlWorkspace = new JLabel(Messages.getString("FirstTimeWizard.7"));
jlWorkspace.setToolTipText(Messages.getString("FirstTimeWizard.7"));
workspacePath = new PathSelector(defaultWorkspacePath);
workspacePath.setToolTipText(Messages.getString("FirstTimeWizard.7"));
// If user provided a forced workspace, he can't change it again here
if (SessionService.isForcedWorkspace()) {
jlWorkspace.setEnabled(false);
workspacePath.setEnabled(false);
}
// Refresh time
jlRefreshTime = new JLabel(Messages.getString("DeviceWizard.53"));
jtfRefreshTime = new JTextField("5");// 5 mins by default
JLabel jlMins = new JLabel(Messages.getString("DeviceWizard.54"));
// buttons
OKCancelPanel okp = new OKCancelPanel(this);
jbOk = okp.getOKButton();
jbCancel = okp.getCancelButton();
jbCancel.setText(Messages.getString("Later"));
jbOk.setEnabled(false);
advanced = new JXCollapsiblePane();
// we need to listen for the animation state property in order to allow to
// resize the dialog after the advanced-panel is expanded/collapsed
// see http://forums.java.net/jive/thread.jspa?threadID=67800&tstart=0 for some related
// discussion
// why we need to listen on "animationState" to know when the expanding/collapsing is finished
advanced.addPropertyChangeListener("animationState", this);
// Build the toggle link used to expand / collapse the panel
final ToggleLink toggle = new ToggleLink(Messages.getString("FirstTimeWizard.6"), advanced);
// Advanced collapsible panel
advanced.setLayout(new VerticalLayout(10));
advanced.setCollapsed(true);
advanced.add(jlWorkspace);
advanced.add(workspacePath);
// Add items
setLayout(new MigLayout("insets 10,gapx 10,gapy 15", "[][grow]", "[][][][][][]"));
add(jlLeftIcon, "cell 0 0 1 6,top");
add(jlWelcome, "cell 1 0");
add(jlFileSelection, "split 2,cell 1 1");
add(jbFileSelection, "cell 1 1");
add(jlSelectedFileText, "split 2,cell 1 2");
add(jlSelectedFile, "cell 1 2, grow");
add(jlRefreshTime, "split 3,cell 1 3");
add(jtfRefreshTime, "cell 1 3, grow,width ::50");
add(jlMins, "cell 1 3");
add(toggle, "cell 1 4,grow");
add(advanced, "cell 1 5,grow");
add(okp, "right,span,cell 1 6");
getRootPane().setDefaultButton(jbOk);
pack();
final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
setLocation(((int) dim.getWidth() / 3), ((int) dim.getHeight() / 3));
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
setVisible(true);
}
/*
* (non-Javadoc)
*
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent )
*/
@Override
public void propertyChange(PropertyChangeEvent evt) {
// if the property changes to "collapsed" or "expanded" the change of the panel is
// finished and we should re-pack() the dialog in order to make space for the panel in the
// dialog correctly
if (evt.getNewValue().equals("collapsed") || evt.getNewValue().equals("expanded")) {
pack(); // repack as size of dialog can be exceeded now
}
}
}