/*
* Copyright (C) 2014 GG-Net GmbH - Oliver Günther
*
* 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, see <http://www.gnu.org/licenses/>.
*/
package eu.ggnet.dwoss.redtape.dossiertable;
import java.awt.Dialog;
import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.RowFilter.Entry;
import javax.swing.table.TableRowSorter;
import eu.ggnet.saft.core.Client;
import eu.ggnet.dwoss.redtape.api.LegacyBridge;
import eu.ggnet.dwoss.redtape.entity.Document;
import eu.ggnet.dwoss.redtape.entity.Dossier;
import eu.ggnet.dwoss.redtape.format.DossierFormater;
import eu.ggnet.dwoss.redtape.RedTapeUiUtil;
import eu.ggnet.dwoss.util.HtmlDialog;
import eu.ggnet.dwoss.util.table.TableColumnChooserPopup;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import static eu.ggnet.dwoss.redtape.dossiertable.DossierTableView.FilterType.LEGACY;
/**
* A JPanel for listings of Dossiers
* <p/>
* @author pascal.perau
*/
public class DossierTableView extends javax.swing.JPanel {
private static final FilterType INIT_FILTER = FilterType.ACCOUNTANCY_OPEN;
@RequiredArgsConstructor
public static enum FilterType {
ALL("Alle Vorgänge"),
SALES_OPEN("Verk. offen"),
SALES_CLOSED("Verk. geschlossen"),
ACCOUNTANCY_OPEN("Buchh. offen"),
ACCOUNTANCY_CLOSED("Buchh. geschlossen"),
LEGACY("Legacy");
@Getter
private final String name;
}
private DossierTableModel model;
private TableRowSorter<DossierTableModel> sorter;
private DossierTableController controller;
private FilterType type;
private int customerId;
private final JPopupMenu dossierPopup;
private JPopupMenu colomnPopup;
private final List<JRadioButton> filterButtonList;
private final JPopupMenu filterPopup;
private final ButtonGroup filterGroup;
/** Creates new form DossierTableView */
public DossierTableView() {
initComponents();
filterGroup = new ButtonGroup();
filterPopup = new JPopupMenu();
colomnPopup = new JPopupMenu();
filterButtonList = new ArrayList<>();
table.setRowHeight(25);
progressBar.setStringPainted(true);
dossierPopup = buildDossierPopup();
}
private JPopupMenu buildDossierPopup() {
JPopupMenu menu = new JPopupMenu();
JMenuItem detailsItem = new JMenuItem(new AbstractAction("Details") {
@Override
public void actionPerformed(ActionEvent e) {
Dossier dos = model.getDossier(table.convertRowIndexToModel(table.getSelectedRow()));
new HtmlDialog(SwingUtilities.getWindowAncestor(DossierTableView.this), Dialog.ModalityType.MODELESS)
.setText(RedTapeUiUtil.toHtmlDetailed(dos)).setVisible(true);
}
});
detailsItem.setText("Details");
JMenuItem historyItem = new JMenuItem(new AbstractAction("Verlauf") {
@Override
public void actionPerformed(ActionEvent e) {
HtmlDialog dialog = new HtmlDialog(SwingUtilities.getWindowAncestor(DossierTableView.this), ModalityType.MODELESS);
dialog.setText(DossierFormater.toHtmlHistory(model.getDossier(table.convertRowIndexToModel(table.getSelectedRow()))));
dialog.setVisible(true);
}
});
historyItem.setText("Verlauf");
menu.add(detailsItem);
menu.add(historyItem);
return menu;
}
private RowFilter setDependantRowFilter(final FilterType type) {
RowFilter<DossierTableModel, Integer> filter = new RowFilter<DossierTableModel, Integer>() {
@Override
public boolean include(Entry<? extends DossierTableModel, ? extends Integer> entry) {
Dossier dos = entry.getModel().getDossier(entry.getIdentifier());
switch (type) {
case SALES_CLOSED:
return !dos.isLegacy() && dos.getCrucialDirective() == Document.Directive.NONE;
case SALES_OPEN:
return !dos.isLegacy() && dos.getId() > 0 && dos.getCrucialDirective() != Document.Directive.NONE;
case ACCOUNTANCY_CLOSED:
return !dos.isLegacy() && dos.getId() > 0 && dos.isClosed();
case ACCOUNTANCY_OPEN:
return !dos.isLegacy() && dos.getId() > 0 && !dos.isClosed();
case ALL:
return true;
case LEGACY:
return dos.isLegacy();
default:
return true;
}
}
};
return filter;
}
public DossierTableController getController() {
return controller;
}
public void setController(DossierTableController controller) {
this.controller = controller;
}
public DossierTableModel getModel() {
return model;
}
public void setModel(DossierTableModel model) {
this.model = model;
table.setModel(model);
sorter = new TableRowSorter<>();
table.setRowSorter(sorter);
sorter.setModel(model);
table.setDefaultRenderer(Dossier.class, new DossierIconPanelRenderer());
colomnPopup = new TableColumnChooserPopup(table);
//initColumnCheckBoxes(table.getColumnModel().getColumns());
initFilterButtons();
}
public JTable getTable() {
return table;
}
private void initFilterButtons() {
for (FilterType t : FilterType.values()) {
final FilterType filterType = t;
if ( filterType == LEGACY && !Client.hasFound(LegacyBridge.class) ) continue;
JRadioButton button = new JRadioButton(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
type = filterType;
sorter.setRowFilter(setDependantRowFilter(filterType));
if ( type == INIT_FILTER ) {
// Do nothing
} else if ( type == LEGACY ) {
controller.loadLegacyDossiers(customerId);
} else {
controller.loadClosedDossiers(customerId);
}
filterPopup.setVisible(false);
}
});
String label = filterType.getName();
if ( filterType == LEGACY ) {
label = filterType.getName() + " (" + Client.lookup(LegacyBridge.class).name() + ")";
}
button.setName(label);
button.setText(label);
filterGroup.add(button);
filterPopup.add(button);
filterButtonList.add(button);
}
}
public void resetTableData(int customerId) {
controller.resetLoader();
if ( model.getRowCount() > 0 ) model.clear();
for (JRadioButton filterButton : filterButtonList) {
if ( filterButton.getName().equals(INIT_FILTER.getName()) ) {
filterButton.setSelected(true);
this.customerId = customerId;
type = INIT_FILTER;
sorter.setRowFilter(setDependantRowFilter(type));
controller.loadOpenDossiers(customerId);
}
}
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
table = new javax.swing.JTable();
jToolBar1 = new javax.swing.JToolBar();
tableFilterButton = new javax.swing.JButton();
columnChooserButton = new javax.swing.JButton();
progressBar = new javax.swing.JProgressBar();
helpButton = new javax.swing.JButton();
table.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null}
},
new String [] {
"Title 1", "Title 2", "Title 3", "Title 4"
}
));
table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
table.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
tableMouseClicked(evt);
}
});
table.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
tableKeyReleased(evt);
}
});
jScrollPane1.setViewportView(table);
jToolBar1.setFloatable(false);
jToolBar1.setRollover(true);
tableFilterButton.setText("Filter");
tableFilterButton.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
tableFilterButton.setFocusable(false);
tableFilterButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
tableFilterButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
tableFilterButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent evt) {
tableFilterButtonMousePressed(evt);
}
});
jToolBar1.add(tableFilterButton);
columnChooserButton.setText("Tabelle Konfigurieren");
columnChooserButton.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
columnChooserButton.setFocusable(false);
columnChooserButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
columnChooserButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
columnChooserButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent evt) {
columnChooserButtonMousePressed(evt);
}
});
jToolBar1.add(columnChooserButton);
progressBar.setBorder(javax.swing.BorderFactory.createEtchedBorder());
progressBar.setPreferredSize(new java.awt.Dimension(200, 20));
progressBar.setString("---");
jToolBar1.add(progressBar);
helpButton.setText("Hilfe");
helpButton.setFocusable(false);
helpButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
helpButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
helpButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
helpButtonActionPerformed(evt);
}
});
jToolBar1.add(helpButton);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 731, Short.MAX_VALUE)
.addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 461, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
private void tableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tableMouseClicked
if ( model == null || controller == null ) return;
int row = table.rowAtPoint(evt.getPoint());
table.setRowSelectionInterval(row, row);
Dossier selectedDos = model.getDossier(table.convertRowIndexToModel(table.getSelectedRow()));
controller.selectionChanged(selectedDos);
if ( evt.getClickCount() == 2 && table.getSelectedRow() != -1 && model != null ) {
Dossier dos = model.getDossier(table.convertRowIndexToModel(table.getSelectedRow()));
new HtmlDialog(SwingUtilities.getWindowAncestor(this), Dialog.ModalityType.MODELESS).setText(RedTapeUiUtil.toHtmlDetailed(dos)).setVisible(true);
}
if ( SwingUtilities.isRightMouseButton(evt) ) {
dossierPopup.show(evt.getComponent(), evt.getX(), evt.getY());
}
}//GEN-LAST:event_tableMouseClicked
private void columnChooserButtonMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_columnChooserButtonMousePressed
colomnPopup.show(evt.getComponent(), evt.getComponent().getBounds().x, evt.getComponent().getBounds().height);
}//GEN-LAST:event_columnChooserButtonMousePressed
private void tableFilterButtonMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tableFilterButtonMousePressed
filterPopup.show(evt.getComponent(), evt.getComponent().getBounds().x, evt.getComponent().getBounds().height);
}//GEN-LAST:event_tableFilterButtonMousePressed
private void tableKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tableKeyReleased
if ( evt.getKeyCode() == KeyEvent.VK_UP || evt.getKeyCode() == KeyEvent.VK_DOWN ) {
Dossier selectedDos = model.getDossier(table.convertRowIndexToModel(table.getSelectedRow()));
controller.selectionChanged(selectedDos);
}
}//GEN-LAST:event_tableKeyReleased
private void helpButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpButtonActionPerformed
if ( controller == null ) return;
HtmlDialog dialog = new HtmlDialog();
dialog.setText(controller.generateHelp());
dialog.setVisible(true);
}//GEN-LAST:event_helpButtonActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton columnChooserButton;
private javax.swing.JButton helpButton;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JToolBar jToolBar1;
public javax.swing.JProgressBar progressBar;
private javax.swing.JTable table;
private javax.swing.JButton tableFilterButton;
// End of variables declaration//GEN-END:variables
}