/** *######################################################################### * * A component of the Gatherer application, part of the Greenstone digital * library suite from the New Zealand Digital Library Project at the * University of Waikato, New Zealand. * * Author: Katherine Don, Greenstone Digital Library, University of Waikato * * Copyright (C) 2005 New Zealand Digital Library Project * * 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 * (at your option) 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., 675 Mass Ave, Cambridge, MA 02139, USA. *######################################################################## */ package org.greenstone.gatherer.gui; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.text.*; import java.io.*; import java.util.ArrayList; import org.w3c.dom.Document; import org.greenstone.gatherer.Dictionary; import org.greenstone.gatherer.Configuration; import org.greenstone.gatherer.Gatherer; import org.greenstone.gatherer.cdm.Argument; import org.greenstone.gatherer.cdm.ArgumentControl; import org.greenstone.gatherer.cdm.CollectionDesignManager; import org.greenstone.gatherer.cdm.Plugin; import org.greenstone.gatherer.collection.CollectionManager; import org.greenstone.gatherer.collection.ScriptOptions; import org.greenstone.gatherer.collection.Collection; import org.greenstone.gatherer.feedback.Base64; import org.greenstone.gatherer.greenstone.LocalGreenstone; import org.greenstone.gatherer.gui.tree.DragTree; import org.greenstone.gatherer.metadata.MetadataXMLFileManager; import org.greenstone.gatherer.metadata.MetadataElement; import org.greenstone.gatherer.metadata.MetadataSet; import org.greenstone.gatherer.metadata.MetadataSetManager; import org.greenstone.gatherer.metadata.MetadataTools; import org.greenstone.gatherer.remote.RemoteGreenstoneServer; import org.greenstone.gatherer.shell.GShell; import org.greenstone.gatherer.shell.GShellEvent; import org.greenstone.gatherer.shell.GShellListener; import org.greenstone.gatherer.util.Utility; import org.greenstone.gatherer.util.XMLTools; public class ExplodeMetadataDatabasePrompt extends ModalDialog implements GShellListener { /** The size of this new collection dialog box. */ static private Dimension SIZE = new Dimension(675, 350); private JDialog self; /** the file we wil be exploding */ private File metadata_file = null; /** the list of potential plugins to be used */ private Argument plugin_arg = null; /** holds all the available options for the exploding script */ private ScriptOptions options = null; /** the pane containing the options */ private JPanel options_pane = null; /** the error message if any */ private StringBuffer error_message = null; /** whether we were successful or not */ private boolean successful; public ExplodeMetadataDatabasePrompt(File source_file) { super(Gatherer.g_man, true); this.self = this; this.metadata_file = source_file; this.setComponentOrientation(Dictionary.getOrientation()); // check that we actually have an explodable file ArrayList exp_plugins = CollectionDesignManager.plugin_manager.getExploderPlugins(source_file); if (exp_plugins.size() == 0) { JOptionPane.showMessageDialog(Gatherer.g_man, Dictionary.get("ExplodeMetadataPrompt.NotExplodable"), Dictionary.get("ExplodeMetadataPrompt.Title"), JOptionPane.ERROR_MESSAGE); return; } plugin_arg = createPluginArgument(exp_plugins); setJMenuBar(new SimpleMenuBar("explodingmetadata")); setSize(SIZE); setTitle(Dictionary.get("ExplodeMetadataPrompt.Title")); // set up the script options // we have empty initial values String dom_string = "\n"; Document doc = XMLTools.parseXML(new StringReader(dom_string)); options = new ScriptOptions(doc.getDocumentElement(), "explode_metadata_database.pl"); // Creation JPanel content_pane = (JPanel) getContentPane(); content_pane.setComponentOrientation(Dictionary.getOrientation()); content_pane.setOpaque(true); options_pane = new JPanel(); options_pane.setComponentOrientation(Dictionary.getOrientation()); addScriptOptions(options_pane); JScrollPane middle_pane = new JScrollPane(options_pane); middle_pane.setComponentOrientation(Dictionary.getOrientation()); JTextArea instructions_area = new JTextArea(Dictionary.get("ExplodeMetadataPrompt.Instructions")); instructions_area.setComponentOrientation(Dictionary.getOrientation()); instructions_area.setEditable(false); instructions_area.setLineWrap(true); instructions_area.setRows(5); instructions_area.setWrapStyleWord(true); JPanel button_pane = new JPanel(); button_pane.setComponentOrientation(Dictionary.getOrientation()); JButton explode_button = new GLIButton(Dictionary.get("ExplodeMetadataPrompt.Explode"), Dictionary.get("ExplodeMetadataPrompt.Explode_Tooltip")); JButton cancel_button = new GLIButton(Dictionary.get("General.Cancel"), Dictionary.get("General.Cancel_Tooltip")); // Connection cancel_button.addActionListener(new CancelListener()); explode_button.addActionListener(new ExplodeListener()); // Layout button_pane.setBorder(BorderFactory.createEmptyBorder(5,0,0,0)); button_pane.setLayout(new GridLayout(1,2)); button_pane.add(explode_button); button_pane.add(cancel_button); content_pane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); content_pane.setLayout(new BorderLayout()); content_pane.add(instructions_area, BorderLayout.NORTH); content_pane.add(middle_pane, BorderLayout.CENTER); content_pane.add(button_pane, BorderLayout.SOUTH); // Final dialog setup & positioning. Dimension screen_size = Configuration.screen_size; setLocation((screen_size.width - SIZE.width) / 2, (screen_size.height - SIZE.height) / 2); setVisible(true); } public void destroy() { } /** All implementation of GShellListener must include this method so the listener can be informed of messages from the GShell. * @param event A GShellEvent that contains, amoung other things, the message. */ public synchronized void message(GShellEvent event) { String message = event.getMessage(); if (message.startsWith("explode_metadata_database.pl>")) { message = message.substring(29); error_message.append(message); error_message.append("\n"); } } /** All implementation of GShellListener must include this method so the listener can be informed when a GShell begins its task. Implementation side-effect, not actually used. * @param event A GShellEvent that contains details of the initial state of the GShell before task comencement. */ public synchronized void processBegun(GShellEvent event) { // We don't care. } /** All implementation of GShellListener must include this method so the listener can be informed when a GShell completes its task. * @param event A GShellEvent that contains details of the final state of the GShell after task completion. */ public synchronized void processComplete(GShellEvent event) { successful = false; if(event.getStatus() == GShell.OK) { successful = true; } } private Argument createPluginArgument(ArrayList plugin_list) { Argument arg = new Argument(); arg.setName("plugin"); arg.setDescription(Dictionary.get("ExplodeMetadataPrompt.Plugin")); arg.setRequired(true); arg.setType(Argument.ENUM); for (int i=0; i