/* * JAME 6.2.1 * http://jame.sourceforge.net * * Copyright 2001, 2016 Andrea Medeghini * * This file is part of JAME. * * JAME is an application for creating fractals and other graphics artifacts. * * JAME 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. * * JAME 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 JAME. If not, see <http://www.gnu.org/licenses/>. * */ package net.sf.jame.twister.swing; import java.awt.Image; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableModel; import net.sf.jame.core.swing.util.GUIUtil; import net.sf.jame.queue.LibraryService; import net.sf.jame.queue.RenderService; import net.sf.jame.queue.RenderService.ServiceCallback; import net.sf.jame.queue.clip.ClipPreview; import net.sf.jame.queue.clip.RenderClipDataRow; /** * @author Andrea Medeghini */ public class RenderClipTableModel extends ServiceAdapter implements TableModel { private static final Logger logger = Logger.getLogger(RenderClipTableModel.class.getName()); private static final long serialVersionUID = 1L; public static final int PREVIEW = 0; public static final int CLIPID = 1; public static final int NAME = 2; public static final int DESCRIPTION = 3; public static final int DURATION = 4; public static final int STATUS = 5; private final List<TableModelListener> listeners; private final List<RenderClipDataRow> model; private final RenderService service; /** * @param service */ public RenderClipTableModel(final RenderService service) { listeners = new ArrayList<TableModelListener>(); model = new ArrayList<RenderClipDataRow>(); this.service = service; service.addServiceListener(this); this.reload(); } /** * @see javax.swing.table.TableModel#addTableModelListener(javax.swing.event.TableModelListener) */ public void addTableModelListener(final TableModelListener listener) { listeners.add(listener); } /** * @see javax.swing.table.TableModel#removeTableModelListener(javax.swing.event.TableModelListener) */ public void removeTableModelListener(final TableModelListener listener) { listeners.remove(listener); } /** * @param e */ protected void fireTableChanged(final TableModelEvent e) { for (final TableModelListener listener : listeners) { listener.tableChanged(e); } } /** * @see javax.swing.table.TableModel#getColumnClass(int) */ public Class<?> getColumnClass(final int columnIndex) { switch (columnIndex) { case PREVIEW: { return Image.class; } case CLIPID: { return String.class; } case NAME: { return String.class; } case DESCRIPTION: { return String.class; } case DURATION: { return String.class; } case STATUS: { return String.class; } default: { break; } } return null; } /** * @see javax.swing.table.TableModel#getColumnCount() */ public int getColumnCount() { return 6; } /** * @see javax.swing.table.TableModel#getColumnName(int) */ public String getColumnName(final int columnIndex) { switch (columnIndex) { case PREVIEW: { return TwisterSwingResources.getInstance().getString("column.preview"); } case CLIPID: { return TwisterSwingResources.getInstance().getString("column.id"); } case NAME: { return TwisterSwingResources.getInstance().getString("column.name"); } case DESCRIPTION: { return TwisterSwingResources.getInstance().getString("column.description"); } case DURATION: { return TwisterSwingResources.getInstance().getString("column.duration"); } case STATUS: { return TwisterSwingResources.getInstance().getString("column.status"); } default: { break; } } return null; } /** * @see javax.swing.table.TableModel#getRowCount() */ public int getRowCount() { return model.size(); } /** * @see javax.swing.table.TableModel#getValueAt(int, int) */ public Object getValueAt(final int rowIndex, final int columnIndex) { final RenderClipDataRow dataRow = model.get(rowIndex); switch (columnIndex) { case PREVIEW: { ClipPreview preview = service.getClipPreview(dataRow.getClipId()); if (preview != null) { return preview.getImage(); } } case CLIPID: { return String.valueOf(dataRow.getClipId()); } case NAME: { return dataRow.getClipName(); } case DESCRIPTION: { return dataRow.getDescription(); } case DURATION: { final long h = dataRow.getDuration() / 3600000; final long t1 = dataRow.getDuration() % 3600000; final long m = t1 / 60000; final long t2 = t1 % 60000; final long s = t2 / 1000; final long ms = t2 % 1000; return String.format("%d:%02d:%02d:%03d", h, m, s, ms); } case STATUS: { return String.valueOf(dataRow.getStatus() == 0 ? TwisterSwingResources.getInstance().getString("label.unlocked") : TwisterSwingResources.getInstance().getString("label.locked") + " (" + dataRow.getStatus() + ")"); } default: { break; } } return null; } /** * @see javax.swing.table.TableModel#isCellEditable(int, int) */ public boolean isCellEditable(final int rowIndex, final int columnIndex) { // if (model.get(rowIndex).getStatus() != 0) { // return false; // } // switch (columnIndex) { // case NAME: { // return true; // } // case DESCRIPTION: { // return true; // } // default: { // break; // } // } return false; } /** * @see javax.swing.table.TableModel#setValueAt(java.lang.Object, int, int) */ public void setValueAt(final Object aValue, final int rowIndex, final int columnIndex) { // final MovieClipDataRow dataRow = model.get(rowIndex); // if (aValue != null) { // switch (columnIndex) { // case NAME: { // dataRow.setClipName((String) aValue); // saveRow(rowIndex); // fireTableChanged(new TableModelEvent(this, rowIndex, rowIndex, MovieClipTableModel.NAME, TableModelEvent.UPDATE)); // break; // } // case DESCRIPTION: { // dataRow.setDescription((String) aValue); // saveRow(rowIndex); // fireTableChanged(new TableModelEvent(this, rowIndex, rowIndex, MovieClipTableModel.DESCRIPTION, TableModelEvent.UPDATE)); // break; // } // default: { // break; // } // } // } } /** * */ public void clear() { final int lastRow = model.size() - 1; model.clear(); if (lastRow >= 0) { fireTableChanged(new TableModelEvent(this, 0, lastRow, TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE)); } } /** * */ public void reload() { service.execute(new ServiceCallback<List<RenderClipDataRow>>() { /** * @param value */ public void executed(final List<RenderClipDataRow> clips) { try { if (RenderClipTableModel.logger.isLoggable(Level.INFO)) { RenderClipTableModel.logger.info("Reload executed"); } GUIUtil.executeTask(new Runnable() { public void run() { RenderClipTableModel.this.reload(clips); } }, true); } catch (final Exception e) { e.printStackTrace(); } } /** * @see net.sf.jame.service.RenderService.ServiceCallback#failed(java.lang.Throwable) */ public void failed(final Throwable throwable) { try { RenderClipTableModel.logger.log(Level.WARNING, "Reload failed", throwable); GUIUtil.executeTask(new Runnable() { public void run() { RenderClipTableModel.this.reload(new LinkedList<RenderClipDataRow>()); } }, true); } catch (final Exception e) { e.printStackTrace(); } } /** * @see net.sf.jame.service.RenderService.ServiceCallback#execute(net.sf.jame.service.LibraryService) */ public List<RenderClipDataRow> execute(final LibraryService service) throws Exception { return service.loadClips(); } }); } private void reload(final List<RenderClipDataRow> clips) { int lastRow = model.size() - 1; model.clear(); if (lastRow >= 0) { fireTableChanged(new TableModelEvent(this, 0, lastRow, TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE)); } for (final RenderClipDataRow clip : clips) { model.add(clip); } lastRow = model.size() - 1; if (lastRow >= 0) { fireTableChanged(new TableModelEvent(this, 0, lastRow, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT)); } } // private void saveRow(final int rowIndex) { // final MovieClipDataRow dataRow = model.get(rowIndex); // service.saveClip(new ServiceVoidCallback() { // /** // * @see net.sf.jame.service.AsyncService.ServiceVoidCallback#executed() // */ // public void executed() { // if (MovieClipTableModel.logger.isLoggable(Level.INFO)) { // MovieClipTableModel.logger.info("Save executed"); // } // } // // /** // * @see net.sf.jame.service.AsyncService.ServiceVoidCallback#failed(java.lang.Throwable) // */ // public void failed(final Throwable throwable) { // MovieClipTableModel.logger.log(Level.WARNING, "Save failed", throwable); // } // }, dataRow); // } /** * @param rowIndex * @return */ public RenderClipDataRow getClip(final int rowIndex) { return model.get(rowIndex); } /** * @see net.sf.jame.twister.swing.ServiceAdapter#clipCreated(net.sf.jame.service.clip.RenderClipDataRow) */ @Override public void clipCreated(final RenderClipDataRow clip) { GUIUtil.executeTask(new TableModelAdapter(this) { /** * @see java.lang.Runnable#run() */ @Override public void run() { for (int rowIndex = 0; rowIndex < model.size(); rowIndex++) { if (model.get(rowIndex).getClipId() == clip.getClipId()) { model.remove(rowIndex); RenderClipTableModel.this.fireTableChanged(new TableModelEvent(tableModel, rowIndex, rowIndex, TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE)); break; } } final int rowIndex = model.size(); model.add(clip); RenderClipTableModel.this.fireTableChanged(new TableModelEvent(tableModel, rowIndex, rowIndex, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT)); } }, true); } /** * @see net.sf.jame.twister.swing.ServiceAdapter#clipDeleted(net.sf.jame.service.clip.RenderClipDataRow) */ @Override public void clipDeleted(final RenderClipDataRow clip) { GUIUtil.executeTask(new TableModelAdapter(this) { /** * @see java.lang.Runnable#run() */ @Override public void run() { for (int rowIndex = 0; rowIndex < model.size(); rowIndex++) { if (model.get(rowIndex).getClipId() == clip.getClipId()) { model.remove(rowIndex); RenderClipTableModel.this.fireTableChanged(new TableModelEvent(tableModel, rowIndex, rowIndex, TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE)); break; } } } }, true); } /** * @see net.sf.jame.twister.swing.ServiceAdapter#clipUpdated(net.sf.jame.service.clip.RenderClipDataRow) */ @Override public void clipUpdated(final RenderClipDataRow clip) { GUIUtil.executeTask(new TableModelAdapter(this) { /** * @see java.lang.Runnable#run() */ @Override public void run() { for (int rowIndex = 0; rowIndex < model.size(); rowIndex++) { if (model.get(rowIndex).getClipId() == clip.getClipId()) { model.set(rowIndex, clip); RenderClipTableModel.this.fireTableChanged(new TableModelEvent(tableModel, rowIndex, rowIndex, TableModelEvent.ALL_COLUMNS, TableModelEvent.UPDATE)); break; } } } }, true); } private class TableModelAdapter implements Runnable { public TableModel tableModel; public TableModelAdapter(final TableModel tableModel) { this.tableModel = tableModel; } public void run() { } } }