/************************************************************************** OmegaT - Computer Assisted Translation (CAT) tool with fuzzy matching, translation memory, keyword search, glossaries, and translation leveraging into updated projects. Copyright (C) 2014 Alex Buloichik Home page: http://www.omegat.org/ Support center: http://groups.yahoo.com/group/OmegaT/ This file is part of OmegaT. OmegaT 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. OmegaT 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, see <http://www.gnu.org/licenses/>. **************************************************************************/ package org.omegat.gui.glossary.taas; import java.awt.Component; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.text.DateFormat; import java.text.MessageFormat; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.concurrent.ExecutionException; import javax.swing.JTable; import javax.swing.RowSorter; import javax.swing.SortOrder; import javax.swing.SwingWorker; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.table.TableRowSorter; import org.omegat.core.Core; import org.omegat.util.Language; import org.omegat.util.Log; import org.omegat.util.OStrings; import org.omegat.util.gui.StaticUIUtils; import gen.taas.TaasCollection; import gen.taas.TaasCollectionType; import gen.taas.TaasDomain; import gen.taas.TaasLanguage; /** * Controller for TaaS download UI. * * @author Alex Buloichik (alex73mail@gmail.com) */ @SuppressWarnings("serial") public final class BrowseTaasCollectionsController { static BrowseTaasCollectionsUI dialog; private BrowseTaasCollectionsController() { } public static void show() { dialog = new BrowseTaasCollectionsUI(Core.getMainWindow().getApplicationFrame(), true); final Language sourceLang = Core.getProject().getProjectProperties().getSourceLanguage(); final Language targetLang = Core.getProject().getProjectProperties().getTargetLanguage(); List<TaasCollection> list = Collections.emptyList(); CollectionsTable model = new CollectionsTable(list, sourceLang, targetLang); dialog.tableCollections.setModel(model); dialog.tableCollections.setColumnModel(createColumnModel()); dialog.labelStatus.setText(OStrings.getString("TAAS_STATUS_LIST")); new SwingWorker<List<TaasCollection>, Void>() { @Override protected List<TaasCollection> doInBackground() throws Exception { return TaaSPlugin.getClient().getCollectionsList(); } @Override protected void done() { try { List<TaasCollection> list = get(); removeUnusedCollections(list); CollectionsTable model = new CollectionsTable(list, sourceLang, targetLang); dialog.tableCollections.setModel(model); TableRowSorter<CollectionsTable> sorter = new TableRowSorter<CollectionsTable>(model); dialog.tableCollections.setRowSorter(sorter); sorter.setSortKeys(Arrays.asList(new RowSorter.SortKey(0, SortOrder.ASCENDING))); dialog.tableCollections.setColumnModel(createColumnModel()); dialog.labelStatus.setText(" "); } catch (ExecutionException e) { Throwable ex = e.getCause(); if (ex instanceof TaaSClient.FormatError) { Log.logErrorRB(ex, "TAAS_FORMAT_ERROR", ex.getMessage()); dialog.labelStatus.setText(OStrings.getString("TAAS_FORMAT_ERROR")); } else if (ex instanceof TaaSClient.Unauthorized) { Log.logErrorRB(ex, "TAAS_UNAUTHORIZED_ERROR"); dialog.labelStatus.setText(OStrings.getString("TAAS_UNAUTHORIZED_ERROR")); } else { Log.logErrorRB(ex, "TAAS_GENERAL_ERROR", ex.getMessage()); dialog.labelStatus.setText(MessageFormat.format( OStrings.getString("TAAS_GENERAL_ERROR"), ex.getMessage())); } } catch (InterruptedException ex) { } } }.execute(); dialog.btnDownload.addActionListener(DOWNLOAD_LISTENER); StaticUIUtils.setEscapeClosable(dialog); dialog.btnClose.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { dialog.dispose(); } }); dialog.setLocationRelativeTo(Core.getMainWindow().getApplicationFrame()); dialog.setVisible(true); } /** * Removes collections with zero terms count. */ static void removeUnusedCollections(List<TaasCollection> list) { final Language sourceLang = Core.getProject().getProjectProperties().getSourceLanguage(); final Language targetLang = Core.getProject().getProjectProperties().getTargetLanguage(); for (int i = 0; i < list.size(); i++) { TaasCollection c = list.get(i); if (getCountForLanguage(c, sourceLang) == 0 || getCountForLanguage(c, targetLang) == 0) { list.remove(i); i--; } } } static int getCountForLanguage(TaasCollection c, Language lang) { String langCode = lang.getLanguageCode(); for (TaasLanguage l : c.getLanguages().getLanguage()) { if (langCode.equalsIgnoreCase(l.getId())) { return l.getCount(); } } return 0; } static TableColumnModel createColumnModel() { TableColumnModel columns = new DefaultTableColumnModel(); TableColumn cName = new TableColumn(0, 150); cName.setHeaderValue(OStrings.getString("TAAS_LIST_NAME")); cName.setCellRenderer(NAME_CELL_RENDERER); TableColumn cDesc = new TableColumn(1, 150); cDesc.setHeaderValue(OStrings.getString("TAAS_LIST_DESC")); TableColumn cSource = new TableColumn(2, 50); cSource.setHeaderValue(OStrings.getString("TAAS_LIST_SOURCE_COUNT")); TableColumn cTarget = new TableColumn(3, 50); cTarget.setHeaderValue(OStrings.getString("TAAS_LIST_TARGET_COUNT")); TableColumn cDomains = new TableColumn(4, 150); cDomains.setHeaderValue(OStrings.getString("TAAS_LIST_DOMAINS")); TableColumn cUpdated = new TableColumn(5, 50); cUpdated.setHeaderValue(OStrings.getString("TAAS_LIST_UPDATED")); TableColumn cDownload = new TableColumn(6, 50); cDownload.setHeaderValue(""); columns.addColumn(cDownload); columns.addColumn(cName); columns.addColumn(cDesc); columns.addColumn(cSource); columns.addColumn(cTarget); columns.addColumn(cDomains); columns.addColumn(cUpdated); return columns; } static final DefaultTableCellRenderer NAME_CELL_RENDERER = new DefaultTableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c = super .getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); final List<TaasCollection> list = ((CollectionsTable) dialog.tableCollections.getModel()).list; if (list.get(row).getType() == TaasCollectionType.PRIVATE) { c.setFont(c.getFont().deriveFont(Font.BOLD)); } return c; } }; static final ActionListener DOWNLOAD_LISTENER = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final List<TaasCollection> list = ((CollectionsTable) dialog.tableCollections.getModel()).list; final boolean[] marks = ((CollectionsTable) dialog.tableCollections.getModel()).marks; new SwingWorker<Object, String>() { @Override protected Object doInBackground() throws Exception { for (int i = 0; i < list.size(); i++) { TaasCollection c = list.get(i); if (marks[i]) { publish(c.getName()); File glossaryFile = getFileForCollection(c); File newFile = new File(glossaryFile.getAbsolutePath() + ".new"); TaaSPlugin.getClient().downloadCollection(c.getId(), newFile); if (glossaryFile.exists()) { glossaryFile.delete(); } if (!newFile.renameTo(glossaryFile)) { dialog.labelStatus.setText(OStrings.getString("TAAS_REPLACE_ERROR")); return null; } } } return null; } /** * Show collection name. */ @Override protected void process(List<String> chunks) { for (String n : chunks) { dialog.labelStatus.setText(MessageFormat.format( OStrings.getString("TAAS_STATUS_DOWNLOAD"), n)); } } @Override protected void done() { try { get(); dialog.labelStatus.setText(" "); dialog.tableCollections.repaint(); } catch (ExecutionException e) { Throwable ex = e.getCause(); if (ex instanceof TaaSClient.FormatError) { Log.logErrorRB(ex, "TAAS_FORMAT_ERROR", ex.getMessage()); dialog.labelStatus.setText(OStrings.getString("TAAS_FORMAT_ERROR")); } else if (ex instanceof TaaSClient.Unauthorized) { Log.logErrorRB(ex, "TAAS_UNAUTHORIZED_ERROR"); dialog.labelStatus.setText(OStrings.getString("TAAS_UNAUTHORIZED_ERROR")); } else { Log.logErrorRB(ex, "TAAS_GENERAL_ERROR", ex.getMessage()); dialog.labelStatus.setText(MessageFormat.format( OStrings.getString("TAAS_GENERAL_ERROR"), ex.getMessage())); } } catch (InterruptedException ex) { } } }.execute(); } }; static File getFileForCollection(TaasCollection collection) { File dir = new File(Core.getProject().getProjectProperties().getGlossaryRoot()); return new File(dir, "TaaS-" + collection.getId() + ".tbx"); } public static final class CollectionsTable extends AbstractTableModel { final List<TaasCollection> list; final boolean[] marks; final Language source; final Language target; public CollectionsTable(List<TaasCollection> list, Language source, Language target) { this.list = list; marks = new boolean[list.size()]; this.source = source; this.target = target; } @Override public int getColumnCount() { return 7; } @Override public int getRowCount() { return list.size(); } @Override public Class<?> getColumnClass(int columnIndex) { switch (columnIndex) { case 0: return String.class; case 1: return String.class; case 2: return Integer.class; case 3: return Integer.class; case 4: return String.class; case 5: return String.class; case 6: return Boolean.class; default: return null; } } @Override public Object getValueAt(int rowIndex, int columnIndex) { TaasCollection c = list.get(rowIndex); File glossaryFile = getFileForCollection(c); switch (columnIndex) { case 0: return c.getName(); case 1: return c.getDescription(); case 2: return getCountForLanguage(c, source); case 3: return getCountForLanguage(c, target); case 4: StringBuilder o = new StringBuilder(200); for (TaasDomain d : c.getDomains().getDomain()) { o.append('/').append(d.getName()); } return o.substring(1); case 5: if (glossaryFile.exists()) { Date m = new Date(glossaryFile.lastModified()); String sm = DateFormat.getDateInstance().format(m); String sc = DateFormat.getDateInstance().format(new Date()); if (sm.equals(sc)) { sm = DateFormat.getTimeInstance().format(m); } return sm; } else { return ""; } case 6: return marks[rowIndex]; default: return null; } } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return columnIndex == 6; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { if (columnIndex == 6) { marks[rowIndex] = (Boolean) aValue; } } } }