/********************************************************************************
* *
* (c) Copyright 2010 Verizon Communications USA and The Open University UK *
* *
* This software is freely distributed in accordance with *
* the GNU Lesser General Public (LGPL) license, version 3 or later *
* as published by the Free Software Foundation. *
* For details see LGPL: http://www.fsf.org/licensing/licenses/lgpl.html *
* and GPL: http://www.fsf.org/licensing/licenses/gpl-3.0.html *
* *
* This software is provided by the copyright holders and contributors "as is" *
* and any express or implied warranties, including, but not limited to, the *
* implied warranties of merchantability and fitness for a particular purpose *
* are disclaimed. In no event shall the copyright owner or contributors be *
* liable for any direct, indirect, incidental, special, exemplary, or *
* consequential damages (including, but not limited to, procurement of *
* substitute goods or services; loss of use, data, or profits; or business *
* interruption) however caused and on any theory of liability, whether in *
* contract, strict liability, or tort (including negligence or otherwise) *
* arising in any way out of the use of this software, even if advised of the *
* possibility of such damage. *
* *
********************************************************************************/
package com.compendium.ui;
import java.awt.Color;
import java.awt.Component;
import java.awt.FontMetrics;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.Vector;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JDialog;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.compendium.LanguageProperties;
import com.compendium.ProjectCompendium;
import com.compendium.core.datamodel.IModel;
import com.compendium.core.datamodel.LinkedFile;
import com.compendium.core.datamodel.PCSession;
import com.compendium.core.datamodel.services.NodeService;
import com.compendium.ui.dialogs.UILinkedFileUsageDialog;
/**
* This class controls the tags working table area.
*
* @author Michelle Bachler
*/
public class UILinkedFilesTable implements TableModelListener {
/**
* class's own logger
*/
final Logger log = LoggerFactory.getLogger(getClass());
/** Table that holds the list data for this list view.*/
private JTable table;
/** The model for the data in the list view table.*/
private UILinkedFilesTableModel model;
/** The table sort for the table for this list view.*/
private TableSorter sorter;
private JDialog oParent = null;
/**
* Constructor. Initializes and table and options for this list.
*/
public UILinkedFilesTable(JDialog parent) {
oParent = parent;
model = new UILinkedFilesTableModel();
sorter = new TableSorter(model);
sorter.addTableModelListener(this);
table = new JTable(sorter);
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
table.setBackground(Color.white);
table.setCellSelectionEnabled(false);
table.setRowSelectionAllowed(true);
Action openUsageDialog = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
int row = table.getSelectedRow();
if (row != -1) {
openUsageDialog(row);
}
}
};
table.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0),"openUsageDialog"); //$NON-NLS-1$
table.getActionMap().put("openUsageDialog",openUsageDialog); //$NON-NLS-1$
//CSH.setHelpIDString(table,"node.views");
table.getColumn(LanguageProperties.getString(LanguageProperties.UI_GENERAL_BUNDLE, "UILinkedFilesTableModel.timesused")).setPreferredWidth(100); //$NON-NLS-1$
//table.getColumn("Tags").setPreferredWidth(10);
//table.getColumn("Views").setPreferredWidth(10);
table.getColumn(LanguageProperties.getString(LanguageProperties.UI_GENERAL_BUNDLE, "UILinkedFilesTableModel.timesused")).setMaxWidth(200); //$NON-NLS-1$
//table.getColumn("Tags").setMaxWidth(60);
//table.getColumn("Views").setMaxWidth(60);
table.getTableHeader().setReorderingAllowed(false);
sorter.addMouseListenerToHeaderInTable(table);
table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
boolean isLeftMouse = SwingUtilities.isLeftMouseButton(e);
if (ProjectCompendium.isMac &&
(e.getButton() == 3 && e.isShiftDown())) {
isLeftMouse = false;
}
if (isLeftMouse && e.getClickCount() == 2) {
int row = table.rowAtPoint( e.getPoint() );
openUsageDialog(row);
}
}
});
/*table.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_ENTER) {
int row = table.getSelectedRow();
if (row != -1) {
openUsageDialog(row);
}
}
}
});*/
table.setFont(ProjectCompendium.APP.currentDefaultFont);
FontMetrics metrics = table.getFontMetrics(ProjectCompendium.APP.currentDefaultFont);
table.setRowHeight(table.getRowMargin()+metrics.getHeight());
setRenderers();
((TableSorter)table.getModel()).setSelectedColumn(1);
}
/**
* Update the table after a change.
*/
public void updateTable() {
sorter.fireTableChanged(new TableModelEvent(table.getModel()));
}
/**
* Display the new data.
* @param vtData
*/
public void refreshTable(Vector vtData) {
int sort = sorter.getSelectedColumn();
model.removeAllElements();
model.setData(vtData);
sorter.setModel(model);
if (sort > -1) {
sorter.sortByColumn(sort, sorter.getAscending());
}
updateTable();
table.revalidate();
table.repaint();
}
/**
* Process a TableModelEvent, when something has changed in the data.
* Refresh the table and repaint.
* @param tme, the associated TableModelEvent.
*/
public void tableChanged(TableModelEvent tme) {
table.invalidate();
table.repaint();
}
/**
* Set the header renderers for the table column headers and the table cells.
*/
public void setRenderers() {
int count = table.getModel().getColumnCount();
for (int i = 0; i < count; i++) {
TableColumn aColumn = table.getColumnModel().getColumn(i);
// Set the cell renderer for the column headers
UITableHeaderRenderer headerRenderer = new UITableHeaderRenderer();
aColumn.setHeaderRenderer(headerRenderer);
// Set the cell renderer for column cells
CellRenderer cellRenderer = new CellRenderer();
aColumn.setCellRenderer(cellRenderer);
}
}
/**
* The helper class renderers the table cells.
*/
public class CellRenderer extends DefaultTableCellRenderer {
CellRenderer() {
super();
setHorizontalAlignment(SwingConstants.LEFT);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
setFont(table.getFont());
setBorder( isSelected ?UIManager.getBorder("List.focusCellHighlightBorder") : new EmptyBorder(1,1,1,1)); //$NON-NLS-1$
if (isSelected) {
setBackground(table.getSelectionBackground());
setForeground(table.getSelectionForeground());
}
else {
setBackground(table.getBackground());
setForeground(table.getForeground());
}
setToolTipText(LanguageProperties.getString(LanguageProperties.UI_GENERAL_BUNDLE, "UILinkedFilesTable.tip")); //$NON-NLS-1$
setValue(value);
return this;
}
protected void setValue(Object value) {
setText((value == null) ? "" : value.toString()); //$NON-NLS-1$
}
}
/**
* Return the JTable that holds the view list.
* @return JTable, the JTable that holds the view list.
*/
public JTable getTable() {
return table;
}
/**
* Deselect all selected rows.
*/
public void deselectAll() {
table.clearSelection();
}
/**
* Triggered when the data behind the table have changed.
*/
public void updateFileTable() {
model.updateFileTable();
table.clearSelection();
}
/**
* Triggered when the delete button is pressed, if resource not in use.
*/
public void onDelete() {
int[] selectedFiles = table.getSelectedRows();
// delete selected files
String sMessage = ""; //$NON-NLS-1$
for(int i = 0; i < selectedFiles.length; i++)
{
try {
Vector nodes = getUsage(selectedFiles[i]);
LinkedFile lf = (LinkedFile)model.getItemAt(sorter.getRealRow(selectedFiles[i]));
if (nodes.size() == 0) {
// delete file;
try {
lf.delete();
} catch (Exception e) {
sMessage += lf.getName()+" "+LanguageProperties.getString(LanguageProperties.UI_GENERAL_BUNDLE, "UILinkedFilesTable.errorDelete")+"\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
} else {
sMessage += lf.getName()+" "+LanguageProperties.getString(LanguageProperties.UI_GENERAL_BUNDLE, "UILinkedFilesTable.noDelete")+"\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
} catch (Exception ex) {
sMessage += LanguageProperties.getString(LanguageProperties.UI_GENERAL_BUNDLE, "UILinkedFilesTable.errorDelete2")+"\n"; //$NON-NLS-1$ //$NON-NLS-2$
log.error("Error...", ex);
}
}
if (!sMessage.equals("")) { //$NON-NLS-1$
ProjectCompendium.APP.displayError(LanguageProperties.getString(LanguageProperties.UI_GENERAL_BUNDLE, "UILinkedFilesTable.errorDeleting")+":"+"\n\n"+sMessage); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
updateFileTable();
}
/**
* Triggered when the extract button is pressed.
*
*/
public void onExtract(File chosenDir) {
int[] selectedFiles = table.getSelectedRows();
for(int i = 0; i < selectedFiles.length; i++) {
LinkedFile lf = (LinkedFile)model.getItemAt(sorter.getRealRow(selectedFiles[i]));
IModel oModel = ProjectCompendium.APP.getModel();
lf.initialize(oModel.getSession(), oModel);
// export the file to the chosen directory
try {
lf.exportFile(chosenDir);
} catch (Exception e) {
log.error("Error...", e);
}
}
}
/**
* Return the list of node for the given row of resource.
* @param row
* @return
*/
private Vector getUsage(int row) throws Exception {
int ind = sorter.getRealRow(row);
String source = (String)model.getSourceForRow(ind);
IModel model = ProjectCompendium.APP.getModel();
PCSession session = model.getSession();
NodeService ns = (NodeService)model.getNodeService();
Vector nodes = ns.getNodesForSource(session, source, model.getUserProfile().getId());
return nodes;
}
private void openUsageDialog(int row) {
int ind = sorter.getRealRow(row);
String source = (String)model.getSourceForRow(ind);
try {
Vector nodes = getUsage(row);
UILinkedFileUsageDialog dialog = new UILinkedFileUsageDialog(oParent, source, nodes);
dialog.setVisible(true);
} catch (Exception ex) {
log.error("Error...", ex);
}
}
}