blob: 724a5b986565e5612c0095000d97eb93ab274674 [file] [log] [blame]
/*
*****************************************************************************
* Copyright (C) 2000-2007, International Business Machines Corporation and *
* others. All Rights Reserved. *
*****************************************************************************
*/
package com.ibm.rbm;
import java.io.*;
import javax.swing.*;
import com.ibm.rbm.gui.RBManagerGUI;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
/**
* <P>This is the super class for all importer plug-in classes.</P>
* <P>
* In terms of general functionality of this class or its children classes, the following steps should happen in order:
* <OL>
* <LI>A Dialog is shown from which the user may select options about the import, including the file from which to import.</LI>
* <LI>The 'Import' button is pressed, closing the options dialog and opening a progress bar dialog box.</LI>
* <LI>The class should resolve all conflicts with locale encodings existing in the import files, but not in the active resource bundle.</LI>
* <LI>The class should parse resources one at a time and use the importResource() method to insert them into the resource bundle.</LI>
* <LI>The class should report when all resources have been read and the import is complete.</LI>
* </OL>
* </P>
*
* @author Jared Jackson
* @see com.ibm.rbm.RBManager
*/
public class RBImporter extends JDialog {
private final static int FILE_OPTION_POPULATE = 0; // Create a new locale file populated from base file
private final static int FILE_OPTION_EMPTY = 1; // Create a new empty locale file
private final static int FILE_OPTION_IGNORE = 2; // Ignore all resources from this encoding
private final static int FILE_OPTION_PROMPT = 3; // Prompt for each conflict
private final static int RESOURCE_OPTION_OVERWRITE = 0; // Use the value from the source import file
private final static int RESOURCE_OPTION_IGNORE = 1; // Ignore the import and use existing value
private final static int RESOURCE_OPTION_PROMPT = 2; // Propmpt for each conflict
protected static JFileChooser chooser;
protected int num_conflicts;
protected int num_extra_files;
protected String title;
protected RBManager rbm;
protected RBManagerGUI gui;
protected boolean pathSet = false;
// Visual Components
JRadioButton resourceOverwriteRadio = new JRadioButton(Resources.getTranslation("import_resource_conflict_overwrite"), false);
JRadioButton resourceIgnoreRadio = new JRadioButton(Resources.getTranslation("import_resource_conflict_ignore"), false);
JRadioButton resourcePromptRadio = new JRadioButton(Resources.getTranslation("import_conflict_prompt"), true);
JRadioButton fileGeneratePopulateRadio = new JRadioButton(Resources.getTranslation("import_file_conflict_generate_populate"), false);
JRadioButton fileGenerateEmptyRadio = new JRadioButton(Resources.getTranslation("import_file_conflict_generate_empty"), false);
JRadioButton fileIgnoreRadio = new JRadioButton(Resources.getTranslation("import_file_conflict_ignore"), false);
JRadioButton filePromptRadio = new JRadioButton(Resources.getTranslation("import_conflict_prompt"), true);
JCheckBox markTranslatedCheck = new JCheckBox(Resources.getTranslation("import_default_translated"), true);
JCheckBox createGroupsCheck = new JCheckBox(Resources.getTranslation("import_default_group_creation"), true);
JComboBox groupComboBox = new JComboBox();
JLabel sourceLabel;
JDialog progressBarDialog;
JProgressBar progressBar;
/**
* Constructor
* @param title The title that appears in the Dialog box
* @param rbm An RBManager instance
* @param gui The RBManager GUI instance associated with the RBManager instance
*/
public RBImporter(String title, RBManager rbm, RBManagerGUI gui) {
super(new Frame(), title, true);
this.title = title;
this.rbm = rbm;
this.gui = gui;
init();
}
protected void init() {
chooser = new JFileChooser();
setupFileChooser();
num_conflicts = 0;
num_extra_files = 0;
initComponents();
setVisible(true);
}
protected void setupFileChooser() {
// To be overwritten
}
protected void beginImport() throws IOException {
// To be overwritten
if (!pathSet)
throw new IOException("Path not set yet");
}
protected void chooseFile() {
int result = chooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
File f = chooser.getSelectedFile();
sourceLabel.setText(Resources.getTranslation("import_source_file",f.getAbsolutePath()));
pathSet = true;
}
}
protected File getChosenFile() {
return chooser.getSelectedFile();
}
/**
* A super class method intended for use of nearly all subclass importers, once a resource
* is found by those subclasses. This method is called in order to create the new resource
* and handle the various conflict errors that may result as a part of that import.
*/
protected void importResource(BundleItem item, String encoding, String group_name) {
Bundle bundle = null;
BundleGroup group = null;
BundleGroup backup_group = null;
if (group_name == null)
group_name = getDefaultGroup();
if (encoding == null)
return;
// Get the bundle to which we will be adding this resource
bundle = rbm.getBundle(encoding);
// Skip this import if the bundle is non-existent (Should have been resolved if wanted)
if (bundle == null)
return;
// Find the group in the bundle, Ungrouped if non-existent
Vector gv = bundle.getGroupsAsVector();
for (int i=0; i < gv.size(); i++) {
BundleGroup tempg = (BundleGroup)gv.elementAt(i);
if (i==0) backup_group = tempg;
if (tempg.getName().equals("Ungrouped Items")) backup_group = tempg;
else if (tempg.getName().equals(group_name)) {
group = tempg;
break;
}
}
if (group == null) {
if (getDefaultGroupCreation()) {
// Create a new group by this name
bundle.addBundleGroup(group_name, "");
gv = bundle.getGroupsAsVector();
for (int i=0; i < gv.size(); i++) {
BundleGroup tempg = (BundleGroup)gv.elementAt(i);
if (tempg.getName().equals(group_name)) {
group = tempg;
break;
}
}
} else {
// Use the backup_group
group = backup_group;
}
}
// If all group identification efforts fail, we fail
if (group == null)
return;
item.setParentGroup(group);
// Check for and resolve conflicts
if (bundle.allItems.containsKey(item.getKey())) {
resolveResource(bundle,item);
RBManagerGUI.debugMsg("Resolve conflict");
} else {
// Insert the resource
bundle.addBundleItem(item);
}
}
/**
* This method should be called when trying to import and item whose key all ready exists within the bundle.
*/
protected void resolveResource(Bundle bundle, BundleItem item) {
if (this.getResourceConflictOption() == RESOURCE_OPTION_IGNORE)
return;
else if (this.getResourceConflictOption() == RESOURCE_OPTION_OVERWRITE) {
bundle.removeItem(item.getKey());
bundle.addBundleItem(item);
} else if (this.getResourceConflictOption() == RESOURCE_OPTION_PROMPT) {
BundleItem original = (BundleItem)bundle.allItems.get(item.getKey());
if (original == null)
return;
String trans = original.getTranslation();
String options[] = { Resources.getTranslation("import_resource_conflict_overwrite"),
Resources.getTranslation("import_resource_conflict_ignore")};
String insert[] = {item.getKey(), (bundle.encoding.equals("") ? "(Base Class)" : bundle.encoding)};
String result = (String)JOptionPane.showInputDialog(this, Resources.getTranslation("import_resource_conflict_choose", insert) +
"\n" + Resources.getTranslation("import_resource_conflict_choose_source", item.getTranslation()) +
"\n" + Resources.getTranslation("import_resource_conflict_choose_target", trans),
Resources.getTranslation("import_file_conflicts"), JOptionPane.QUESTION_MESSAGE,
null, options, options[0]);
if (result == null)
return;
if (result.equals(Resources.getTranslation("import_resource_conflict_overwrite"))) {
bundle.removeItem(item.getKey());
bundle.addBundleItem(item);
} else if (result.equals(Resources.getTranslation("import_resource_conflict_ignore")))
return;
}
}
/**
* Given a vector of strings containing locale encodings (e.g. {"en", "en_us", "de"}), attempts
* to resolve those conflicts according to the preferences selected by the user.
*/
protected void resolveEncodings(Vector v) {
for (int i=0; i < v.size(); i++) {
String encoding = (String)v.elementAt(i);
if (encoding == null || encoding.equals("") || rbm.hasResource(encoding)) {
continue;
}
// We need to resolve this conflict
if (this.getFileConflictOption() == FILE_OPTION_IGNORE) continue;
else if (this.getFileConflictOption() == FILE_OPTION_POPULATE) {
rbm.createResource(null, null, null, encoding, null, null, null, true);
} else if (this.getFileConflictOption() == FILE_OPTION_EMPTY) {
rbm.createResource(null, null, null, encoding, null, null, null, true);
} else if (this.getFileConflictOption() == FILE_OPTION_PROMPT) {
String options[] = { Resources.getTranslation("import_file_conflict_generate_populate"),
Resources.getTranslation("import_file_conflict_generate_empty"),
Resources.getTranslation("import_file_conflict_ignore")};
String result = (String)JOptionPane.showInputDialog(this, Resources.getTranslation("import_file_conflict_choose", encoding),
Resources.getTranslation("import_file_conflicts"), JOptionPane.QUESTION_MESSAGE,
null, options, options[0]);
if (result == null) continue;
if (result.equals(Resources.getTranslation("import_file_conflict_ignore"))) continue;
else if (result.equals(Resources.getTranslation("import_file_conflict_generate_populate"))) {
rbm.createResource(null, null, null, encoding, null, null, null, true);
} else if (result.equals(Resources.getTranslation("import_file_conflict_generate_empty"))) {
rbm.createResource(null, null, null, encoding, null, null, null, false);
}
}
}
gui.updateDisplayTree();
}
// Returns an integer mask describing the user's selection for file resolving missing file locale conflicts
private int getFileConflictOption() {
if (fileGeneratePopulateRadio.isSelected()) return FILE_OPTION_POPULATE;
if (fileGenerateEmptyRadio.isSelected()) return FILE_OPTION_EMPTY;
if (fileIgnoreRadio.isSelected()) return FILE_OPTION_IGNORE;
if (filePromptRadio.isSelected()) return FILE_OPTION_PROMPT;
return FILE_OPTION_PROMPT;
}
// Returns an integer mask describing the user's selection for duplicate resource key conflicts
private int getResourceConflictOption() {
if (resourceOverwriteRadio.isSelected()) return RESOURCE_OPTION_OVERWRITE;
if (resourceIgnoreRadio.isSelected()) return RESOURCE_OPTION_IGNORE;
if (resourcePromptRadio.isSelected()) return RESOURCE_OPTION_PROMPT;
return RESOURCE_OPTION_PROMPT;
}
// Returns the group name for use when no group name is specified
protected String getDefaultGroup() {
return groupComboBox.getSelectedItem().toString();
}
// Returns the default translation value
protected boolean getDefaultTranslated() {
return markTranslatedCheck.isSelected();
}
// Returns whether or not a group of name non-existant in the active bundle is created
protected boolean getDefaultGroupCreation() {
return createGroupsCheck.isSelected();
}
protected void showProgressBar(int steps) {
thisWindowClosing();
JDialog progressBarDialog = new JDialog(this, Resources.getTranslation("dialog_title_import_progress"), false);
JProgressBar progressBar = new JProgressBar(0, steps);
progressBar.setValue(0);
progressBarDialog.getContentPane().add(progressBar);
progressBarDialog.pack();
progressBarDialog.setVisible(true);
}
protected void incrementProgressBar() {
if (progressBar == null) return;
progressBar.setValue(progressBar.getValue()+1);
if (progressBar.getValue() == progressBar.getMaximum()) hideProgressBar();
}
protected void hideProgressBar() {
if (progressBarDialog != null) progressBarDialog.setVisible(false);
}
/**
* Initialize the visual components for selecting an import file and setting the appropriate
* options
*/
protected void initComponents() {
// Create Components
JLabel titleLabel = new JLabel(title);
sourceLabel = new JLabel(Resources.getTranslation("import_source_file","--"));
JLabel insertGroupLabel = new JLabel(Resources.getTranslation("import_insert_group"));
JButton fileChooseButton = new JButton(Resources.getTranslation("button_choose"));
JButton cancelButton = new JButton(Resources.getTranslation("button_cancel"));
JButton importButton = new JButton(Resources.getTranslation("button_import"));
ButtonGroup resourceGroup = new ButtonGroup();
ButtonGroup fileGroup = new ButtonGroup();
JPanel topPanel = new JPanel(new BorderLayout());
JPanel midPanel = new JPanel(new BorderLayout());
JPanel botPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
JPanel topInnerPanel = new JPanel(new BorderLayout());
Box midBox = new Box(BoxLayout.Y_AXIS);
JPanel resourcePanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel filePanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel defaultPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel defaultPanel2 = new JPanel(new BorderLayout());
Box resourceBox = new Box(BoxLayout.Y_AXIS);
Box fileBox = new Box(BoxLayout.Y_AXIS);
Box groupBox = new Box(BoxLayout.X_AXIS);
// Setup title
titleLabel.setFont(new Font("Serif",Font.BOLD,16));
// Setup panels
midPanel.setBorder(BorderFactory.createTitledBorder(Resources.getTranslation("import_options")));
resourcePanel.setBorder(BorderFactory.createTitledBorder(Resources.getTranslation("import_resource_conflicts")));
filePanel.setBorder(BorderFactory.createTitledBorder(Resources.getTranslation("import_file_conflicts")));
defaultPanel.setBorder(BorderFactory.createTitledBorder(Resources.getTranslation("import_default_values")));
// Arrange button groups
fileGroup.add(fileGeneratePopulateRadio);
fileGroup.add(fileGenerateEmptyRadio);
fileGroup.add(fileIgnoreRadio);
fileGroup.add(filePromptRadio);
resourceGroup.add(resourceOverwriteRadio);
resourceGroup.add(resourceIgnoreRadio);
resourceGroup.add(resourcePromptRadio);
// Add action listeners
cancelButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ev) {
thisWindowClosing();
}
});
importButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ev) {
try {
beginImport();
gui.updateProjectTree();
gui.updateDisplayTree();
thisWindowClosing();
} catch (IOException ioe) {
ioe.printStackTrace(System.err);
JOptionPane.showMessageDialog(null,
Resources.getTranslation("error") + "\n" + ioe.getLocalizedMessage(),
Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE);
}
}
});
fileChooseButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ev) {
chooseFile();
}
});
// Setup combo box
Bundle baseBundle = ((Bundle)rbm.getBundles().elementAt(0));
BundleGroup ungroupedGroup = baseBundle.getUngroupedGroup();
groupComboBox = new JComboBox(baseBundle.getGroupsAsVector());
int groupComboBoxCount = groupComboBox.getItemCount();
for (int selectedIndex = 0; selectedIndex < groupComboBoxCount; selectedIndex++) {
BundleGroup bundGroup = ((BundleGroup)groupComboBox.getItemAt(selectedIndex));
if (bundGroup.getName().equals(ungroupedGroup.getName())) {
// By default, use the ungrouped group. Probably named 'Ungrouped Items'.
groupComboBox.setSelectedIndex(selectedIndex);
break;
}
}
// Arange components
groupBox.add(Box.createHorizontalGlue());
groupBox.add(insertGroupLabel);
groupBox.add(Box.createHorizontalStrut(5));
groupBox.add(groupComboBox);
defaultPanel2.add(groupBox, BorderLayout.NORTH);
defaultPanel2.add(markTranslatedCheck, BorderLayout.CENTER);
defaultPanel2.add(createGroupsCheck, BorderLayout.SOUTH);
fileBox.add(fileGeneratePopulateRadio);
fileBox.add(fileGenerateEmptyRadio);
fileBox.add(fileIgnoreRadio);
fileBox.add(filePromptRadio);
resourceBox.add(resourceOverwriteRadio);
resourceBox.add(resourceIgnoreRadio);
resourceBox.add(resourcePromptRadio);
defaultPanel.add(defaultPanel2);
filePanel.add(fileBox);
resourcePanel.add(resourceBox);
midBox.add(resourcePanel);
midBox.add(filePanel);
midBox.add(defaultPanel);
midPanel.add(midBox, BorderLayout.CENTER);
topInnerPanel.add(sourceLabel, BorderLayout.CENTER);
topInnerPanel.add(fileChooseButton, BorderLayout.EAST);
topPanel.add(titleLabel, BorderLayout.NORTH);
topPanel.add(topInnerPanel, BorderLayout.CENTER);
botPanel.add(cancelButton);
botPanel.add(importButton);
getContentPane().setLayout(new BorderLayout());
getContentPane().add(topPanel, BorderLayout.NORTH);
getContentPane().add(midPanel, BorderLayout.CENTER);
getContentPane().add(botPanel, BorderLayout.SOUTH);
pack();
}
protected void thisWindowClosing() {
setVisible(false);
dispose();
}
}