/*
* Licensed Materials - Property of Rogue Wave Software, Inc.
* © Copyright Rogue Wave Software, Inc. 2014, 2017
* © Copyright IBM Corp. 2009, 2014
* © Copyright ILOG 1996, 2009
* All Rights Reserved.
*
* Note to U.S. Government Users Restricted Rights:
* The Software and Documentation were developed at private expense and
* are "Commercial Items" as that term is defined at 48 CFR 2.101,
* consisting of "Commercial Computer Software" and
* "Commercial Computer Software Documentation", as such terms are
* used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
* as applicable.
*/
import ilog.views.gantt.IlvGanttChart;
import ilog.views.gantt.action.IlvZoomToFitAction;
import ilog.views.gantt.project.IlvGanttProjectConfiguration;
import ilog.views.gantt.project.IlvGanttXMLDataSource;
import ilog.views.util.IlvProductUtil;
import ilog.views.util.styling.IlvStylingException;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
/**
* Extend Project sample.
* This sample code shows how to change the Gantt data source using the
* project configuration built with the Gantt Designer.
*/
public class ExtendProject extends JPanel {
public IlvGanttChart chart;
// The project configuration file obtained using the Gantt Designer.
static final String projectURL = "data/basic.igpr";
// The complex XML data we want to use instead of the basic one
static final String complexXML = "data/complexGantt.xml";
// The zoom-to-fit action.
private IlvZoomToFitAction zoomToFitAction;
public ExtendProject(JFrame frame) {
final JFrame parent = frame;
// Prepare the JPanel's appearance
setLayout(new BorderLayout());
JPanel panel = new JPanel();
chart = new IlvGanttChart();
try {
// Set initially the sample project
chart.setProject(getResourceURL(projectURL));
} catch (IOException e1) {
JOptionPane.showMessageDialog(parent,
e1,
"Error",
JOptionPane.ERROR_MESSAGE);
} catch (IlvStylingException e1) {
JOptionPane.showMessageDialog(parent,
e1,
"Error",
JOptionPane.ERROR_MESSAGE);
}
// A button to change the data of the project.
Button buttonGantt = new Button("Change to more complex data");
buttonGantt.addActionListener(new ActionListener()
{
Override
public void actionPerformed(ActionEvent e) {
// Let's take the project configuration to change the data
// of the project.
IlvGanttProjectConfiguration configuration =
new IlvGanttProjectConfiguration();
try {
// Read the configuration file.
URL url = getResourceURL(projectURL);
configuration.read(url);
// The project configuration contains now the styling, the reference
// to the data source and the Gantt model from this data source.
// In order to change the data source of this configuration,
// we need to:
// 1. Change the data source of this configuration.
// 2. Create the data model from this data source, and put it
// into the configuration.
// 3. Apply this new configuration to the Gantt
// 1. Change the data source by referencing a new XML file
IlvGanttXMLDataSource dataSource = new IlvGanttXMLDataSource();
dataSource.setDataURL(getResourceURL(complexXML));
configuration.setDataSource(dataSource);
try {
// 2. Update the Gantt model of the configuration associated to
// this data source.
dataSource.read(configuration.getGanttModel());
} catch (Exception e1) {
e1.printStackTrace();
}
// 3. Apply the new configuration to the chart.
configuration.apply(chart);
} catch (MalformedURLException ex) {
// cannot happen except if URL is changed
JOptionPane.showMessageDialog(parent,
ex,
"Error",
JOptionPane.ERROR_MESSAGE);
} catch (IlvStylingException ex) {
JOptionPane.showMessageDialog(parent,
ex,
"Error",
JOptionPane.ERROR_MESSAGE);
} catch (IOException ex) {
JOptionPane.showMessageDialog(parent,
ex,
"Error",
JOptionPane.ERROR_MESSAGE);
}
chart.revalidate();
// Make sure the full chart is visible.
zoomToFit();
chart.expandAllRows();
}
});
panel.add(buttonGantt);
add(BorderLayout.CENTER, chart);
chart.revalidate();
zoomToFitAction = new IlvZoomToFitAction(chart, "", null, null, "", "");
zoomToFit();
// Make sure the full chart is visible.
chart.expandAllRows();
add(BorderLayout.SOUTH, panel);
}
public static void main(String[] args) {
// This sample uses JViews Gantt features. When deploying an
// application that includes this code, you need to be in possession
// of a Rogue Wave JViews Gantt Deployment license.
IlvProductUtil.DeploymentLicenseRequired(
IlvProductUtil.JViews_Gantt_Deployment);
SwingUtilities.invokeLater(new Runnable() {
Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(10, 400, 700, 400);
ExtendProject example = new ExtendProject(frame);
frame.getContentPane().add(example);
frame.setVisible(true);
}
});
}
// =========================================
// Accessing Resources
// =========================================
/**
* Returns the fully qualified URL of a resource file that is specified
* relative to the working directory of the example. Note that this is
* different than calling <code>Class.getResource()</code>, which performs
* resource lookup relative to the example's classpath.
*
* @param relativePath The path of the resource file, relative to the working
* directory of the example.
* @return The resource URL.
*
* @throws IOException if the path cannot be resolved to a valid and existing
* URL.
*/
public URL getResourceURL(String relativePath)
throws IOException {
relativePath = relativePath.replace('\\', '/');
URL url;
// In an application context, we try to find an external file relative to
// the current working directory. If an external file does not exist, then
// the file may be bundled into the jar with the classes. In this case, we
// prepend a '/' to relativePath so that we search relative to the
// classloader's root and not relative to the packaging of the current
// class.
File file = new File(relativePath);
// If the file exists in the external file system, we return its
// corresponding URL.
if (file.exists()) {
url = file.toURI().toURL();
}
// Otherwise, we search for the file relative to the classloader's root.
// This will find the file if it is packaged into a jar with the classes.
else {
// Prepend a '/' so that we search relative to the classloader's root and
// not relative to the packaging of the current class.
if (relativePath.charAt(0) != '/') {
relativePath = '/' + relativePath;
}
url = getClass().getResource(relativePath);
}
// Verify that we have a valid URL by trying to open its associated stream.
if (url == null) {
throw new FileNotFoundException(relativePath);
}
InputStream stream = url.openStream();
stream.close();
return url;
}
/**
* Zooms the chart to fit the data model's time interval.
*/
protected void zoomToFit() {
zoomToFitAction.perform();
}
}