/* * This file is part of the aidGer project. * * Copyright (C) 2010-2013 The aidGer 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, see <http://www.gnu.org/licenses/>. */ package de.aidger.view.tabs; import static de.aidger.utils.Translation._; import java.awt.Color; import java.awt.Component; import java.util.ArrayList; import java.util.List; import javax.swing.ImageIcon; import javax.swing.JPanel; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import de.aidger.controller.ActionNotFoundException; import de.aidger.controller.ActionRegistry; import de.aidger.controller.actions.BudgetExportAction; import de.aidger.controller.actions.BudgetGenerateAction; import de.aidger.model.budgets.BudgetFilter; import de.aidger.model.budgets.BudgetFilter.Comparison; import de.aidger.model.models.Course; import de.aidger.utils.reports.BalanceHelper; import de.aidger.view.UI; import de.aidger.view.reports.BalanceFilterPanel; import siena.SienaException; /** * This class displays a table of all the course budgets. * * @author aidGer Team */ @SuppressWarnings("serial") public class BudgetViewerTab extends ReportTab { /** * The budget filter of this budget check. */ private BudgetFilter budgetFilter = null; /** * The filter panels of this budget check. */ private ArrayList<BalanceFilterPanel> filterPanels = null; /** * The table model of the content table. */ private final DefaultTableModel contentTableModel = new DefaultTableModel( null, new String[] { _("Course"), _("Semester"), _("Lecturer"), _("Booked budgets"), _("Remaining budgets"), _("Available budgets") }) { @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } }; /** * Initializes a new BudgetViewerTab with the available filters. */ public BudgetViewerTab() { initComponents(); budgetFilter = new BudgetFilter(); filterPanels = new ArrayList<BalanceFilterPanel>(); budgetFilterText.setVisible(false); try { generateButton.setAction(ActionRegistry.getInstance().get( BudgetGenerateAction.class.getName())); exportButton.setAction(ActionRegistry.getInstance().get( BudgetExportAction.class.getName())); } catch (ActionNotFoundException ex) { ex.printStackTrace(); UI.displayError(ex.getMessage()); } String[] filterNames = { _("Lecturer"), _("Semester"), _("Remaining budgets"), _("Booked budgets"), _("Available budgets") }; for (int i = 0; i < filterNames.length; i++) { filterNameComboBox.addItem(filterNames[i]); } } /** * Returns the budget filter of this budget report. * * @return The budget filter */ public BudgetFilter getBudgetFilter() { return budgetFilter; } /** * Removes all rows of the table. */ public void clearTable() { while (contentTableModel.getRowCount() > 0) { contentTableModel.removeRow(0); } } /** * Adds a row, with a budget course, to the table of budget courses. * * @param objectArray * The budget course to add. */ public void addRow(Object[] objectArray) { contentTableModel.addRow(objectArray); contentTable.setVisible(false); contentTable.setVisible(true); } /** * Removes the given panel from the filter panel. * * @param panel * The panel to remove */ @Override public void removeFilterPanel(JPanel panel) { filterContentPanel.remove(panel); filterContentPanel.setVisible(false); filterContentPanel.setVisible(true); } /** * Removes the specified filter from the filters list. * * @param name * The name of filter. * @param value * The value of the filter. */ @Override public void removeFilter(String name, String value) { if (name.equals(_("Lecturer"))) { /* * The filter is a filter for lecturers. Check if it is contained in * the filter list and then remove it. */ if (budgetFilter.getLecturers().contains(value)) { budgetFilter.removeLecturer(value); } } else if (name.equals(_("Semester"))) { /* * The filter is a filter for semesters. Check if it is contained in * teh filter list and the remove it. */ if (budgetFilter.getSemesters().contains(value)) { budgetFilter.removeSemester(value); } } else { /* * The filter is a filter for a specific budget. Remove the filter * panel of that filter and set its comparison method to none. */ for (BalanceFilterPanel filterPanel : filterPanels) { if (filterPanel.getName().equals(name)) { filterPanels.remove(filterPanel); break; } } if (name.equals(_("Remaining budgets"))) { budgetFilter.setAvailableComparison(Comparison.NONE); } else if (name.equals(_("Booked budgets"))) { budgetFilter.setBookedComparison(Comparison.NONE); } else if (name.equals(_("Available budgets"))) { budgetFilter.setTotalComparison(Comparison.NONE); } } } /** * 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. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jToolBar1 = new javax.swing.JToolBar(); jSeparator3 = new javax.swing.JToolBar.Separator(); generateButton = new javax.swing.JButton(); jSeparator1 = new javax.swing.JToolBar.Separator(); exportButton = new javax.swing.JButton(); jSeparator2 = new javax.swing.JToolBar.Separator(); jPanel1 = new javax.swing.JPanel(); filtersPanel = new javax.swing.JPanel(); filterCreationPanel = new javax.swing.JPanel(); filtersLabel = new javax.swing.JLabel(); filterNameComboBox = new javax.swing.JComboBox(); filterComboBox = new javax.swing.JComboBox(); budgetFilterText = new javax.swing.JTextField(); addFilterButton = new javax.swing.JButton(); filterContentPanel = new javax.swing.JPanel(); contentPanel = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); contentTable = new javax.swing.JTable() { @Override public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component returnComp = super.prepareRenderer(renderer, row, column); Color alternateColor = new Color(252, 200, 150); Color alternateModColor = new Color(239, 187, 137); Color grey = new Color(242, 242, 242); Color white = new Color(255, 255, 255); if (row % 2 == 0) { if (Double.parseDouble(this.getValueAt(row, 4).toString()) == 0 && !this.getValueAt(row, 3).equals( this.getValueAt(row, 5))) { returnComp.setBackground(alternateModColor); } else { returnComp.setBackground(grey); } } else { if (Double.parseDouble(this.getValueAt(row, 4).toString()) == 0 && !this.getValueAt(row, 3).equals( this.getValueAt(row, 5))) { returnComp.setBackground(alternateColor); } else { returnComp.setBackground(white); } } returnComp.setForeground(Color.black); return returnComp; } }; setLayout(new java.awt.BorderLayout()); jToolBar1.setFloatable(false); jToolBar1.setRollover(true); jToolBar1.add(jSeparator3); generateButton.setText(_("Generate")); generateButton.setFocusable(false); generateButton .setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); generateButton .setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); jToolBar1.add(generateButton); jToolBar1.add(jSeparator1); exportButton.setText(_("Export")); exportButton.setFocusable(false); exportButton .setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); exportButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); jToolBar1.add(exportButton); jToolBar1.add(jSeparator2); add(jToolBar1, java.awt.BorderLayout.PAGE_START); jPanel1.setLayout(new java.awt.BorderLayout()); filtersPanel.setLayout(new java.awt.BorderLayout()); filterCreationPanel.setLayout(new java.awt.FlowLayout( java.awt.FlowLayout.LEFT)); filtersLabel.setText(_("Filters") + ":"); filterCreationPanel.add(filtersLabel); filterNameComboBox.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { filterNameComboBoxItemStateChanged(evt); } }); filterCreationPanel.add(filterNameComboBox); filterCreationPanel.add(filterComboBox); budgetFilterText.setMinimumSize(new java.awt.Dimension(40, 25)); budgetFilterText.setPreferredSize(new java.awt.Dimension(40, 25)); filterCreationPanel.add(budgetFilterText); addFilterButton.setIcon(new ImageIcon(getClass().getResource( "/de/aidger/res/icons/plus-small.png"))); addFilterButton.setFocusable(false); addFilterButton .setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); addFilterButton .setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); addFilterButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addFilterButtonActionPerformed(evt); } }); filterCreationPanel.add(addFilterButton); filtersPanel.add(filterCreationPanel, java.awt.BorderLayout.PAGE_START); filterContentPanel.setLayout(new java.awt.GridLayout(0, 1)); filtersPanel.add(filterContentPanel, java.awt.BorderLayout.CENTER); jPanel1.add(filtersPanel, java.awt.BorderLayout.PAGE_START); contentPanel.setLayout(new java.awt.GridLayout(0, 1)); contentTable.setModel(contentTableModel); jScrollPane1.setViewportView(contentTable); contentPanel.add(jScrollPane1); jPanel1.add(contentPanel, java.awt.BorderLayout.CENTER); add(jPanel1, java.awt.BorderLayout.CENTER); }// </editor-fold>//GEN-END:initComponents private void filterNameComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_filterNameComboBoxItemStateChanged switch (filterNameComboBox.getSelectedIndex()) { /* * Clear the filter combo box and add all entries of the selected filter * type. */ case 0: filterComboBox.removeAllItems(); budgetFilterText.setVisible(false); budgetFilterText.setText(""); List<Course> courses = null; try { courses = (new Course()).getAll(); } catch (SienaException e) { UI.displayError(e.toString()); } ArrayList<String> courseLecturers = new ArrayList<String>(); for (Course course : courses) { if (!courseLecturers.contains(course.getLecturer())) { courseLecturers.add(course.getLecturer()); filterComboBox.addItem(course.getLecturer()); } } break; /* * Clear the filter combo box and add all entries of the selected filter * type. */ case 1: filterComboBox.removeAllItems(); budgetFilterText.setVisible(false); budgetFilterText.setText(""); try { courses = (new Course()).getAll(); ArrayList<String> courseSemesters = new BalanceHelper() .getSemesters(); for (String semester : courseSemesters) { filterComboBox.addItem(semester); } } catch (SienaException e) { UI.displayError(e.toString()); } break; /* * Clear the filter combo box and add all entries of the selected filter * type. Cases 2-4 are the same, as they compare numbers. */ case 2: case 3: case 4: filterComboBox.removeAllItems(); filterComboBox.addItem(Comparison.LESS); filterComboBox.addItem(Comparison.LESSEQUAL); filterComboBox.addItem(Comparison.EQUAL); filterComboBox.addItem(Comparison.GREATEREQUAL); filterComboBox.addItem(Comparison.GREATER); budgetFilterText.setText(""); budgetFilterText.setVisible(true); break; } }//GEN-LAST:event_filterNameComboBoxItemStateChanged private void addFilterButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addFilterButtonActionPerformed switch (filterNameComboBox.getSelectedIndex()) { /* * Add the filter to the filter list if it doesn't exist yet and create * a new panel that displays the filter. */ case 0: if (!budgetFilter.getLecturers().contains( filterComboBox.getSelectedItem().toString()) && filterComboBox.getItemCount() > 0) { budgetFilter.addLecturer((String) filterComboBox .getSelectedItem()); filterContentPanel.add(new BalanceFilterPanel( filterNameComboBox.getItemAt(0).toString(), (String) filterComboBox.getSelectedItem(), this)); } break; /* * Add the filter to the filter list if it doesn't exist yet and create * a new panel that displays the filter. */ case 1: if (!budgetFilter.getSemesters().contains( filterComboBox.getSelectedItem().toString()) && filterComboBox.getItemCount() > 0) { budgetFilter.addSemester((String) filterComboBox .getSelectedItem()); filterContentPanel.add(new BalanceFilterPanel( filterNameComboBox.getItemAt(1).toString(), (String) filterComboBox.getSelectedItem(), this)); } break; /* * Change the value and comparison method of the budget filter to the * ones given. If there already is a panel containing a filter of this * type, update it. Otherwise create one. */ case 2: if (!budgetFilterText.getText().equals("")) { budgetFilter.setAvailableBudget(Double .parseDouble(budgetFilterText.getText())); budgetFilter.setAvailableComparison((Comparison) filterComboBox .getSelectedItem()); int i = 0; boolean filterPanelFound = false; for (BalanceFilterPanel filterPanel : filterPanels) { if (filterPanel.getName().equals( filterNameComboBox.getSelectedItem())) { filterPanelFound = true; break; } i++; } if (i == filterPanels.size() || !filterPanelFound) { BalanceFilterPanel filterPanel = new BalanceFilterPanel( filterNameComboBox.getItemAt(2).toString(), filterComboBox.getSelectedItem().toString(), this); filterPanel.setBudgetLabel(budgetFilterText.getText()); filterPanels.add(filterPanel); filterContentPanel.add(filterPanel); } else { BalanceFilterPanel filterPanel = filterPanels.get(i); filterPanel.setFilterLabel(filterComboBox.getSelectedItem() .toString()); filterPanel.setBudgetLabel(budgetFilterText.getText()); } } break; /* * Change the value and comparison method of the budget filter to the * ones given. If there already is a panel containing a filter of this * type, update it. Otherwise create one. */ case 3: if (!budgetFilterText.getText().equals("")) { budgetFilter.setBookedBudget(Double .parseDouble(budgetFilterText.getText())); budgetFilter.setBookedComparison((Comparison) filterComboBox .getSelectedItem()); int i = 0; boolean filterPanelFound = false; for (BalanceFilterPanel filterPanel : filterPanels) { if (filterPanel.getName().equals( filterNameComboBox.getSelectedItem())) { filterPanelFound = true; break; } i++; } if (i == filterPanels.size() || !filterPanelFound) { BalanceFilterPanel filterPanel = new BalanceFilterPanel( filterNameComboBox.getItemAt(3).toString(), filterComboBox.getSelectedItem().toString(), this); filterPanel.setBudgetLabel(budgetFilterText.getText()); filterPanels.add(filterPanel); filterContentPanel.add(filterPanel); } else { BalanceFilterPanel filterPanel = filterPanels.get(i); filterPanel.setFilterLabel(filterComboBox.getSelectedItem() .toString()); filterPanel.setBudgetLabel(budgetFilterText.getText()); } } break; /* * Change the value and comparison method of the budget filter to the * ones given. If there already is a panel containing a filter of this * type, update it. Otherwise create one. */ case 4: if (!budgetFilterText.getText().equals("")) { budgetFilter.setTotalBudget(Double.parseDouble(budgetFilterText .getText())); budgetFilter.setTotalComparison((Comparison) filterComboBox .getSelectedItem()); int i = 0; boolean filterPanelFound = false; for (BalanceFilterPanel filterPanel : filterPanels) { if (filterPanel.getName().equals( filterNameComboBox.getSelectedItem())) { filterPanelFound = true; break; } i++; } if (i == filterPanels.size() || !filterPanelFound) { BalanceFilterPanel filterPanel = new BalanceFilterPanel( filterNameComboBox.getItemAt(4).toString(), filterComboBox.getSelectedItem().toString(), this); filterPanel.setBudgetLabel(budgetFilterText.getText()); filterPanels.add(filterPanel); filterContentPanel.add(filterPanel); } else { BalanceFilterPanel filterPanel = filterPanels.get(i); filterPanel.setFilterLabel(filterComboBox.getSelectedItem() .toString()); filterPanel.setBudgetLabel(budgetFilterText.getText()); } } break; } filterContentPanel.setVisible(false); filterContentPanel.setVisible(true); }//GEN-LAST:event_addFilterButtonActionPerformed /* * (non-Javadoc) * * @see de.aidger.view.tabs.Tab#getTabName() */ @Override public String getTabName() { return _("Course Controlling"); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addFilterButton; private javax.swing.JTextField budgetFilterText; private javax.swing.JPanel contentPanel; private javax.swing.JTable contentTable; private javax.swing.JButton exportButton; private javax.swing.JComboBox filterComboBox; private javax.swing.JPanel filterContentPanel; private javax.swing.JPanel filterCreationPanel; private javax.swing.JComboBox filterNameComboBox; private javax.swing.JLabel filtersLabel; private javax.swing.JPanel filtersPanel; private javax.swing.JButton generateButton; private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JToolBar.Separator jSeparator1; private javax.swing.JToolBar.Separator jSeparator2; private javax.swing.JToolBar.Separator jSeparator3; private javax.swing.JToolBar jToolBar1; // End of variables declaration//GEN-END:variables }