/**
*#########################################################################
*
* A component of the Gatherer application, part of the Greenstone digital
* library suite from the New Zealand Digital Library Project at th * University of Waikato, New Zealand.
*
*
*
* Author: Shaoqun Wu, Greenstone Digital Library, University of Waikato
*
*
*
* Copyright (C) 2006 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.gems;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import java.lang.String;
import javax.swing.event.*;
import javax.swing.filechooser.*;
import javax.swing.text.*;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import org.greenstone.gatherer.Configuration;
import org.greenstone.gatherer.DebugStream;
import org.greenstone.gatherer.Dictionary;
import org.greenstone.gatherer.GetOpt;
import org.greenstone.gatherer.gui.GComboBox;
import org.greenstone.gatherer.gui.GLIButton;
import org.greenstone.gatherer.gui.HelpFrame;
import org.greenstone.gatherer.gui.ModalDialog;
import org.greenstone.gatherer.gui.NonWhitespaceField;
import org.greenstone.gatherer.util.Codec;
import org.greenstone.gatherer.util.JarTools;
import org.greenstone.gatherer.util.Utility;
import org.greenstone.gatherer.util.XMLTools;
import org.greenstone.gatherer.Dictionary;
import org.w3c.dom.*;
/*
* @author Shaoqun Wu, Greenstone Digital Library, University of Waikato
* @version 2.4
*/
public class GEMS
extends JFrame implements WindowFocusListener
{
static final private Dimension SIZE = new Dimension(800,550);
// we have a card pane to switch between the no set loaded view, and the
// set loaded view
private CardLayout card_layout = null;
private JPanel card_pane = null;
/** The name of the panel containing the "set loaded" card. */
private String SET_LOADED_CARD = "";
/** The name of the panel containing the "no set loaded" placeholder */
private String NO_SET_LOADED_CARD = "No set loaded";
private GEMS self = null;
private OpenMetadataSetPrompt open_prompt;
private DeleteMetadataSetPrompt delete_prompt;
private NewMetadataSetPrompt new_prompt;
// this is the main panel that gets switched in once a set is loaded
private JSplitPane metadata_set_details_split_pane = null;
// this is the split with the attribute tables in it
private JSplitPane attribute_tables_split_pane = null;
/** Um, the size of the screen I'd guess. */
private Dimension screen_size = null;
private MetadataSetManager msm;
private AttributeTable attribute_table; // meta_element_table
private AttributeTable language_dependent_attribute_table; //lang_element_table;
private MetadataSetTree meta_set_tree;
private MetadataSetModel metadata_set_model;
private boolean stand_alone = true;
private ArrayList listeners;
static public void main(String[] args)
{
//TODO: add an option to open a paticular metadata set
// Parse arguments
GetOpt go = new GetOpt(args);
if (go.debug) {
DebugStream.enableDebugging();
Calendar now = Calendar.getInstance();
String debug_file_path = "debug" + now.get(Calendar.DATE) + "-" + now.get(Calendar.MONTH) + "-" + now.get(Calendar.YEAR) + ".txt";
// Debug file is created in the GLI directory
DebugStream.println("Debug file path: " + debug_file_path);
DebugStream.setDebugFile(debug_file_path);
}
new GEMS(go.gsdl_path,go.gsdl3_path,go.metadata_path,true,go.new_set);
}
/** Constructor.
*/
public GEMS(String gsdl_path, String gsdl3_path, String metadata_path, boolean standalone, boolean new_set)
{
self = this;
JarTools.initialise(this);
screen_size = Configuration.screen_size;
msm = new MetadataSetManager(gsdl_path,gsdl3_path);
stand_alone = standalone;
listeners = new ArrayList();
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
metadata_set_model.save(true);
if (stand_alone){
System.exit(0);
}
else {
notifyListeners();
setVisible(false);
}
}
});
setSize(SIZE);
setTitle(Dictionary.get("GEMS.Title"));
setJMenuBar(new GEMSMenuBar());
addWindowFocusListener(this);
card_layout = new CardLayout();
card_pane = new JPanel();
metadata_set_model = new MetadataSetModel(msm);
msm.setMetadataSetModel(metadata_set_model);
meta_set_tree = new MetadataSetTree(self);
metadata_set_model.addObserver(meta_set_tree);
attribute_table = new AttributeTable(false);
MetadataElementModel mem = new MetadataElementModel();
mem.addMetadataElementListener((MetadataElementListener)attribute_table);
attribute_table.addAttributeListener(metadata_set_model);
language_dependent_attribute_table = new AttributeTable(true);
mem.addMetadataElementListener((MetadataElementListener)language_dependent_attribute_table);
language_dependent_attribute_table.addAttributeListener(metadata_set_model);
MetadataSetInfo msti= new MetadataSetInfo();
msti.addMetadataSetListener((MetadataSetListener)attribute_table);
msti.addMetadataSetListener((MetadataSetListener)language_dependent_attribute_table);
msti.setMetadataSetModel(metadata_set_model);
open_prompt = new OpenMetadataSetPrompt(self,msm);
open_prompt.addMetadataSetListener((MetadataSetListener)metadata_set_model);
open_prompt.addMetadataSetListener((MetadataSetListener)attribute_table);
open_prompt.addMetadataSetListener((MetadataSetListener)language_dependent_attribute_table);
delete_prompt = new DeleteMetadataSetPrompt(self,msm);
delete_prompt.addMetadataSetListener((MetadataSetListener)metadata_set_model);
delete_prompt.addMetadataSetListener((MetadataSetListener)attribute_table);
delete_prompt.addMetadataSetListener((MetadataSetListener)language_dependent_attribute_table);
new_prompt = new NewMetadataSetPrompt(self,msm);
new_prompt.addMetadataSetListener((MetadataSetListener)metadata_set_model);
new_prompt.addMetadataSetListener((MetadataSetListener)attribute_table);
new_prompt.addMetadataSetListener((MetadataSetListener)language_dependent_attribute_table);
// load the initial metadataset
if (metadata_path !=null && !metadata_path.equals("")){
open_prompt.openMetadataSet(metadata_path);
}
else{
if (new_set) new_prompt.display();
}
// the set tree
JScrollPane treePane = new JScrollPane(meta_set_tree);
// the language independent attributes
JScrollPane tablePane = new JScrollPane(attribute_table);
// the language dependent attributes
JScrollPane langTablePane = new JScrollPane(language_dependent_attribute_table);
// no set loaded pane
JPanel no_set_loaded_pane = new JPanel();
no_set_loaded_pane.setBackground(Color.lightGray);
JLabel no_set_loaded_label = new JLabel(Dictionary.get("GEMS.No_Set_Loaded"));
no_set_loaded_label.setHorizontalAlignment(JLabel.CENTER);
no_set_loaded_label.setVerticalAlignment(JLabel.CENTER);
no_set_loaded_pane.setLayout(new BorderLayout());
no_set_loaded_pane.add(no_set_loaded_label, BorderLayout.CENTER);
JPanel buttonPane = new JPanel(new GridLayout(1,2));
JButton arrow_up_button = new GLIButton(Dictionary.get("GEMS.Move_Up"));
arrow_up_button.setIcon(JarTools.getImage("arrow-up.gif"));
JButton arrow_down_button = new GLIButton(Dictionary.get("GEMS.Move_Down"));
arrow_down_button.setIcon(JarTools.getImage("arrow-down.gif"));
arrow_up_button.setActionCommand(GEMSConstants.MOVE_UP);
arrow_up_button.addActionListener(meta_set_tree);
arrow_down_button.addActionListener(meta_set_tree);
arrow_down_button.setActionCommand(GEMSConstants.MOVE_DOWN);
buttonPane.add(arrow_up_button);
buttonPane.add(arrow_down_button);
JPanel leftPane = new JPanel(new BorderLayout());
leftPane.add(treePane,BorderLayout.CENTER);
leftPane.add(buttonPane,BorderLayout.SOUTH);
JLabel selected_language_label = new JLabel(Dictionary.get("GEMS.SelectedLanguage"));
selected_language_label.setOpaque(true);
Vector language_vector = new Vector(msm.getLanguageList());
language_vector.add(0, Dictionary.get("GEMS.Language"));
JComboBox language_combo = new JComboBox(language_vector);
language_combo.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
JComboBox language_combo = (JComboBox) e.getSource();
String langInfo = (String)language_combo.getSelectedItem();
if (!langInfo.equals(Dictionary.get("GEMS.Language"))) {
String lang = langInfo.split("\\s")[0];
language_dependent_attribute_table.addNewLanguage(lang);
}
}
});
JLabel language_label = new JLabel(Dictionary.get("GEMS.LanguageDependent"));
language_label.setOpaque(true);
JPanel selectLangPane = new JPanel(new BorderLayout(5,5));
selectLangPane.add(selected_language_label,BorderLayout.WEST);
selectLangPane.add(language_combo, BorderLayout.CENTER);
JPanel languagePane = new JPanel(new BorderLayout(5,5));
languagePane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
languagePane.add(language_label,BorderLayout.NORTH);
languagePane.add(selectLangPane,BorderLayout.CENTER);
JPanel languageAttributePane = new JPanel(new BorderLayout());
languageAttributePane.add(languagePane,BorderLayout.NORTH);
languageAttributePane.add(langTablePane,BorderLayout.CENTER);
JLabel attribute_label = new JLabel(Dictionary.get("GEMS.Attribute_Table"));
attribute_label.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
JPanel mainAttributePane = new JPanel(new BorderLayout());
mainAttributePane.add(attribute_label, BorderLayout.NORTH);
mainAttributePane.add(tablePane, BorderLayout.CENTER);
attribute_tables_split_pane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,mainAttributePane,languageAttributePane);
metadata_set_details_split_pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,leftPane,attribute_tables_split_pane);
card_pane.setLayout(card_layout);
card_pane.add(no_set_loaded_pane, NO_SET_LOADED_CARD);
card_pane.add(metadata_set_details_split_pane, SET_LOADED_CARD);
getContentPane().add(card_pane,BorderLayout.CENTER);
setLocation((screen_size.width - SIZE.width) / 2, (screen_size.height - SIZE.height) / 2);
if (stand_alone)
setVisible(true);
}
public void setVisible(boolean visible) {
super.setVisible(visible);
if (visible) {
attribute_tables_split_pane.setDividerLocation(0.3);
}
}
// called from GLI
public void displayMetadataSet(String metadata_path){
open_prompt.openMetadataSet(metadata_path);
updateCardLayout(true);
setVisible(true);
}
// called from GLI
public void newMetadataSet(){
new_prompt.display();
if (!new_prompt.isCancelled()) {
updateCardLayout(true);
setVisible(true);
}
}
public void addGEMSListener(GEMSListener listener){
listeners.add(listener);
}
public void removeGEMSListener(GEMSListener listener){
listeners.remove(listener);
}
public void notifyListeners(){
for (int i=0;i New
if (event_source == file_new) {
new_prompt.display();
if (!new_prompt.isCancelled()) {
updateCardLayout(true);
}
return;
}
// File -> Open
if (event_source == file_open) {
open_prompt.display();
if (!open_prompt.isCancelled()) {
updateCardLayout(true);
}
return;
}
// File -> Close
if (event_source == file_close) {
metadata_set_model.save(true);
updateCardLayout(false);
return;
}
// File -> Delete
if (event_source == file_delete) {
delete_prompt.display();
return;
}
// File -> Save
if (event_source == file_save) {
metadata_set_model.save(false);
return;
}
// File -> Exit
if (event_source == file_exit) {
metadata_set_model.save(true);
if (stand_alone){
System.exit(0);
}
else {
self.notifyListeners();
self.setVisible(false);
return;
}
}
/// File -> Preferences
// if(event_source == file_preferences){
// GEMSPreferences GemsPreferences = new GEMSPreferences();
//}
// Edit -> Cut
if (event_source == edit_cut) {
try {
KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
// Get the component with selected text as a JTextComponent
JTextComponent text = (JTextComponent) kfm.getPermanentFocusOwner();
// Cut the text to the clipboard
text.cut();
}
catch (ClassCastException cce) {
// If the component is not a text component ignore the cut command
DebugStream.println(cce.toString());
}
return;
}
// Edit -> Copy
if (event_source == edit_copy) {
try {
KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
// Get the component with selected text as a JTextComponent
JTextComponent text = (JTextComponent) kfm.getPermanentFocusOwner();//getFocusOwner();
text.copy();
}
catch (Exception cce) {
// If the component is not a text component ignore the copy command
DebugStream.println(cce.toString());
}
return;
}
// Edit -> Paste
if (event_source == edit_paste) {
try {
KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
// Get the component with selected text as a JTextComponent
JTextComponent text = (JTextComponent) kfm.getPermanentFocusOwner();
// Cut the text to the clipboard
text.paste();
}
catch (ClassCastException cce) {
// If the component is not a text component ignore the paste command
DebugStream.println(cce.toString());
}
return;
}
}
}
}