/* GanttProject is an opensource project management tool. License: GPL3 Copyright (C) 2004-2011 Dmitry Barashev, GanttProject Team 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 3 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package net.sourceforge.ganttproject.gui.options; import biz.ganttproject.core.model.task.TaskDefaultColumn; import biz.ganttproject.core.option.BooleanOption; import com.google.common.collect.Lists; import net.sourceforge.ganttproject.ResourceDefaultColumn; import net.sourceforge.ganttproject.gui.UIFacade; import net.sourceforge.ganttproject.gui.UIUtil; import net.sourceforge.ganttproject.io.CSVOptions; import net.sourceforge.ganttproject.language.GanttLanguage; import org.jdesktop.swingx.JXTable; import javax.swing.Box; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SpringLayout; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; import java.awt.BorderLayout; import java.util.List; /** * Panel to edit the text export parameters * * @author dbarashev@gmail.com Major rewrite. * @author athomas */ public class CSVSettingsPanel extends GeneralOptionPanel { private JComboBox cbTextSeparator; private final CSVOptions myCsvOptions; private JComboBox myFieldSeparatorCombo; public CSVSettingsPanel(UIFacade uiFacade, CSVOptions csvOptions) { super(uiFacade, language.getCorrectedLabel("csvexport"), language.getText("settingsCSVExport")); myCsvOptions = csvOptions; vb.add(createSeparatorSettingsPanel()); vb.add(Box.createVerticalStrut(15)); vb.add(createTaskExportFieldsPanel(createTaskPropertiesTableModel(), "taskFields")); vb.add(Box.createVerticalStrut(15)); vb.add(createTaskExportFieldsPanel(createResourcePropertiesTableModel(), "resFields")); applyComponentOrientation(language.getComponentOrientation()); } JComponent createSeparatorSettingsPanel() { JPanel result = new JPanel(new SpringLayout()); result.add(new JLabel(language.getText("textSeparator"))); cbTextSeparator = new JComboBox(getCsvOptions().getSeparatedTextChars()); result.add(cbTextSeparator); result.add(new JLabel(language.getText("separatedFields"))); myFieldSeparatorCombo = new JComboBox(new String[] { language.getText("fixedWidth"), language.getText("doubledot"), language.getText("dotComa"), language.getText("coma") }); myFieldSeparatorCombo.setEditable(false); result.add(myFieldSeparatorCombo); SpringUtilities.makeCompactGrid(result, 2, 2, 0, 0, 3, 3); UIUtil.createTitle(result, language.getText("optionPage.impex.csv.group.csv.label")); return result; } JComponent createTaskExportFieldsPanel(TableModel tableModel, String id) { JXTable table = new JXTable(tableModel); table.setTableHeader(null); table.setVisibleRowCount(10); JScrollPane scrollPane = new JScrollPane(table); JPanel panel = new JPanel(new BorderLayout()); panel.add(BorderLayout.CENTER, scrollPane); UIUtil.createTitle(panel, language.getText(id)); return panel; } private static abstract class ExportFieldsTableModel extends AbstractTableModel { private final List<BooleanOption> myOptions; ExportFieldsTableModel(List<BooleanOption> options) { myOptions = options; } @Override public Class<?> getColumnClass(int columnIndex) { switch (columnIndex) { case 0: return String.class; case 1: return Boolean.class; } return null; } @Override public boolean isCellEditable(int row, int col) { return col == 1; } @Override public int getColumnCount() { return 2; } @Override public int getRowCount() { return myOptions.size(); } @Override public Object getValueAt(int row, int column) { if (row >= 0 && row < getRowCount()) { switch (column) { case 0: String id = myOptions.get(row).getID(); return getOptionName(id); case 1: return myOptions.get(row).getValue(); } } return null; } @Override public void setValueAt(Object aValue, int row, int column) { if (row >= 0 && row < getRowCount()) { myOptions.get(row).setValue((Boolean)aValue); } } protected abstract String getOptionName(String id); } private TableModel createTaskPropertiesTableModel() { final List<BooleanOption> taskOptions = Lists.newArrayList(getCsvOptions().getTaskOptions().values()); return new ExportFieldsTableModel(taskOptions) { @Override protected String getOptionName(String id) { TaskDefaultColumn taskColumn = TaskDefaultColumn.find(id); return taskColumn == null ? GanttLanguage.getInstance().getText(id) : taskColumn.getName(); } }; } private TableModel createResourcePropertiesTableModel() { return new ExportFieldsTableModel(Lists.newArrayList(getCsvOptions().getResourceOptions().values())) { @Override protected String getOptionName(String id) { ResourceDefaultColumn column = ResourceDefaultColumn.find(id); return column == null ? GanttLanguage.getInstance().getText(id) : column.getName(); } }; } @Override public boolean applyChanges(boolean askForApply) { CSVOptions csvOptions = getCsvOptions(); csvOptions.sSeparatedTextChar = getTextSeparat(); csvOptions.sSeparatedChar = getSeparat(); csvOptions.bFixedSize = getFixed(); return true; } @Override public void initialize() { String selectedSeparator; if (getCsvOptions().bFixedSize) { selectedSeparator = language.getText("fixedWidth"); } else { String sSeparatedChar = getCsvOptions().sSeparatedChar; if (",".equals(sSeparatedChar)) { selectedSeparator = language.getText("coma"); } else if (";".equals(sSeparatedChar)) { selectedSeparator = language.getText("dotComa"); } else if (":".equals(sSeparatedChar)) { selectedSeparator = language.getText("doubledot"); } else { selectedSeparator = sSeparatedChar; } } myFieldSeparatorCombo.setSelectedItem(selectedSeparator); if ("\"".equals(getCsvOptions().sSeparatedTextChar)) { cbTextSeparator.setSelectedIndex(1); } } private boolean getFixed() { return language.getText("fixedWidth").equals(myFieldSeparatorCombo.getSelectedItem()); } private String getTextSeparat() { if (cbTextSeparator.getSelectedIndex() == 0) { return "\'"; } return "\""; } private String getSeparat() { String selectedSeparator = (String) myFieldSeparatorCombo.getSelectedItem(); if (selectedSeparator.equals(language.getText("doubledot"))) { return ":"; } if (selectedSeparator.equals(language.getText("coma"))) { return ","; } if (selectedSeparator.equals(language.getText("dotComa"))) { return ";"; } return selectedSeparator; } private CSVOptions getCsvOptions() { return myCsvOptions; } }