package net.frontlinesms.ui.handler.importexport;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.frontlinesms.csv.CsvImporter;
import net.frontlinesms.csv.CsvParseException;
import net.frontlinesms.csv.CsvRowFormat;
import net.frontlinesms.data.importexport.MessageCsvImporter;
import net.frontlinesms.ui.Icon;
import net.frontlinesms.ui.UiGeneratorController;
import net.frontlinesms.ui.i18n.InternationalisationUtils;
import net.frontlinesms.ui.i18n.LanguageBundle;
public class MessageImportDialogHandler extends ImportDialogHandler {
/** I18n Text Key: TODO document */
private static final String MESSAGE_IMPORTING_SELECTED_MESSAGES = "message.importing.messages";
private static final String I18N_MULTIMEDIA_MESSAGES_IMPORT_SUCCESSFUL = "importexport.import.multimedia.messages.successful";
//> INSTANCE PROPERTIES
private LanguageBundle usedLanguageBundle;
private MessageCsvImporter importer;
private int messageTypeColumnIndex;
private int columnCount;
public MessageImportDialogHandler(UiGeneratorController ui) {
super(ui, EntityType.MESSAGES);
}
@Override
String getWizardTitleI18nKey() {
return MESSAGE_IMPORTING_SELECTED_MESSAGES;
}
@Override
String getOptionsFilePath() {
return UI_FILE_OPTIONS_PANEL_MESSAGE;
}
@Override
protected CsvImporter getImporter() {
return this.importer;
}
@Override
protected void setImporter(String filename) throws CsvParseException {
this.importer = new MessageCsvImporter(new File(filename));
}
@Override
void doSpecialImport(String dataPath) throws CsvParseException {
CsvRowFormat rowFormat = getRowFormatForMessage();
int multimediaMessagesCount = importer.importMessages(this.messageDao, rowFormat).getMultimediaMessageCount(); // FIXME importer should be of known type depending on the handler we are in
if (multimediaMessagesCount == 0) {
this.uiController.infoMessage(InternationalisationUtils.getI18nString(I18N_IMPORT_SUCCESSFUL));
} else {
this.uiController.infoMessage(InternationalisationUtils.getI18nStrings(I18N_MULTIMEDIA_MESSAGES_IMPORT_SUCCESSFUL, String.valueOf(multimediaMessagesCount)).toArray(new String[0]));
}
}
@Override
protected void appendPreviewHeaderItems(Object header) {
int columnCount = 0;
for (Object checkbox : getCheckboxes()) {
if (this.uiController.isSelected(checkbox)) {
String attributeName = this.uiController.getText(checkbox);
if (this.uiController.getName(checkbox).equals(COMPONENT_CB_TYPE)) {
this.messageTypeColumnIndex = columnCount;
}
this.uiController.add(header, this.uiController.createColumn(attributeName, attributeName));
++columnCount;
}
}
this.columnCount = columnCount;
}
@Override
protected Object[] getPreviewRows() {
List<String[]> lines = this.importer.getRawValues();
ArrayList<Object> previewRows = new ArrayList<Object>(lines.size());
for (String[] lineValues : lines) {
previewRows.add(getRow(lineValues));
}
return previewRows.toArray();
}
private Object getRow(String[] lineValues) {
Object row = this.uiController.createTableRow();
String rowIcon = getIconFromI18nString(lineValues);
Object iconCell = this.uiController.createTableCell("");
this.uiController.setIcon(iconCell, rowIcon);
this.uiController.add(row, iconCell);
for (int i = 0; i < this.columnCount && i < lineValues.length; ++i) {
String cellValue = lineValues[i];
this.uiController.add(row, this.uiController
.createTableCell(cellValue));
}
return row;
}
private List<Object> getCheckboxes() {
List<Object> allCheckboxes = new ArrayList<Object>();
Object pnCheckboxes = this.uiController.find(this.wizardDialog, COMPONENT_PN_CHECKBOXES);
allCheckboxes.addAll(Arrays.asList(this.uiController.getItems(pnCheckboxes)));
Object pnCheckboxes2 = this.uiController.find(this.wizardDialog, COMPONENT_PN_CHECKBOXES_2);
allCheckboxes.addAll(Arrays.asList(this.uiController.getItems(pnCheckboxes2)));
return allCheckboxes;
}
private String getIconFromI18nString(String[] lineValues) {
if(messageTypeColumnIndex != -1
&& usedLanguageBundle != null) {
switch (MessageCsvImporter.getTypeFromString(lineValues[messageTypeColumnIndex], usedLanguageBundle)) {
case OUTBOUND :
return Icon.SMS_SEND;
case RECEIVED :
return Icon.SMS_RECEIVE;
}
}
return Icon.SMS;
}
}