/*
* IzPack - Copyright 2001-2008 Julien Ponge, All Rights Reserved.
*
* http://izpack.org/
* http://izpack.codehaus.org/
*
* Copyright 2004 Tino Schwarze
*
* 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.installer.InstallData;
import com.izforge.izpack.installer.InstallerFrame;
import com.izforge.izpack.installer.IzPanel;
import com.izforge.izpack.installer.ProcessPanelWorker;
import com.izforge.izpack.util.AbstractUIProcessHandler;
import com.izforge.izpack.adaptator.IXMLElement;
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
/**
* The process panel class.
* <p/>
* This class allows external processes to be executed during installation.
* <p/>
* Parts of the code have been taken from CompilePanel.java and modified a lot.
*
* @author Tino Schwarze
* @author Julien Ponge
*/
public class ProcessPanel extends IzPanel implements AbstractUIProcessHandler
{
/**
*
*/
private static final long serialVersionUID = 3258417209583155251L;
/**
* The operation label .
*/
protected JLabel processLabel;
/**
* The overall progress bar.
*/
protected JProgressBar overallProgressBar;
/**
* True if the compilation has been done.
*/
private boolean validated = false;
/**
* The processing worker. Does all the work.
*/
private ProcessPanelWorker worker;
/**
* Number of jobs to process. Used for progress indication.
*/
private int noOfJobs = 0;
private int currentJob = 0;
/**
* Where the output is displayed
*/
private JTextArea outputPane;
private static boolean finishedWork = false;
/**
* The constructor.
*
* @param parent The parent window.
* @param idata The installation data.
*/
public ProcessPanel(InstallerFrame parent, InstallData idata) throws IOException
{
super(parent, idata);
this.worker = new ProcessPanelWorker(idata, this);
JLabel heading = new JLabel();
Font font = heading.getFont();
font = font.deriveFont(Font.BOLD, font.getSize() * 2.0f);
heading.setFont(font);
heading.setHorizontalAlignment(SwingConstants.CENTER);
heading.setText(parent.langpack.getString("ProcessPanel.heading"));
heading.setVerticalAlignment(SwingConstants.TOP);
BorderLayout layout = new BorderLayout();
layout.setHgap(2);
layout.setVgap(2);
setLayout(layout);
add(heading, BorderLayout.NORTH);
// put everything but the heading into it's own panel
// (to center it vertically)
JPanel subpanel = new JPanel();
subpanel.setAlignmentX(0.5f);
subpanel.setLayout(new BoxLayout(subpanel, BoxLayout.Y_AXIS));
this.processLabel = new JLabel();
this.processLabel.setAlignmentX(0.5f);
this.processLabel.setText(" ");
subpanel.add(this.processLabel);
this.overallProgressBar = new JProgressBar();
this.overallProgressBar.setAlignmentX(0.5f);
this.overallProgressBar.setStringPainted(true);
subpanel.add(this.overallProgressBar);
this.outputPane = new JTextArea();
this.outputPane.setEditable(false);
JScrollPane outputScrollPane = new JScrollPane(this.outputPane);
subpanel.add(outputScrollPane);
add(subpanel, BorderLayout.CENTER);
}
/**
* Indicates wether the panel has been validated or not.
*
* @return The validation state.
*/
public boolean isValidated()
{
return validated;
}
/**
* The compiler starts.
*/
public void startProcessing(int no_of_jobs)
{
this.noOfJobs = no_of_jobs;
overallProgressBar.setMaximum(no_of_jobs);
overallProgressBar.setIndeterminate(true);
parent.lockPrevButton();
}
/**
* The compiler stops.
*/
public void finishProcessing(boolean unlockPrev, boolean unlockNext)
{
overallProgressBar.setIndeterminate(false);
String no_of_jobs = Integer.toString(this.noOfJobs);
overallProgressBar.setString(no_of_jobs + " / " + no_of_jobs);
processLabel.setText(" ");
processLabel.setEnabled(false);
validated = true;
idata.installSuccess = worker.getResult();
if (idata.panels.indexOf(this) != (idata.panels.size() - 1))
{
if (unlockNext)
parent.unlockNextButton();
}
if (unlockPrev)
parent.unlockPrevButton();
// set to finished only in case of success
finishedWork = idata.installSuccess;
}
/**
* Log a message.
*
* @param message The message.
* @param stderr Whether the message came from stderr or stdout.
*/
public void logOutput(String message, boolean stderr)
{
// TODO: make it colored
this.outputPane.append(message + '\n');
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
outputPane.setCaretPosition(outputPane.getText().length());
}
});
}
/**
* Next job starts.
*
* @param jobName The job name.
*/
public void startProcess(String jobName)
{
processLabel.setText(jobName);
this.currentJob++;
overallProgressBar.setValue(this.currentJob);
overallProgressBar.setString(Integer.toString(this.currentJob) + " / "
+ Integer.toString(this.noOfJobs));
}
public void finishProcess()
{
}
/**
* Called when the panel becomes active.
*/
public void panelActivate()
{
// We clip the panel
Dimension dim = parent.getPanelsContainerSize();
dim.width -= (dim.width / 4);
dim.height = 150;
setMinimumSize(dim);
setMaximumSize(dim);
setPreferredSize(dim);
parent.lockNextButton();
// only let the process start if the weren't finished before.
if (!finishedWork)
{
this.worker.startThread();
}
}
/**
* Create XML data for automated installation.
*/
public void makeXMLData(IXMLElement panelRoot)
{
// does nothing (no state to save)
}
}