/* * 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.forms; import static de.aidger.utils.Translation._; import java.awt.GridBagConstraints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.SpinnerDateModel; import javax.swing.SwingUtilities; import de.aidger.model.Runtime; import de.aidger.model.models.Assistant; import de.aidger.model.models.Contract; import de.aidger.model.models.CostUnit; import de.aidger.model.models.Course; import de.aidger.model.models.Employment; import de.aidger.view.UI; import de.aidger.view.forms.HourlyWageEditorForm.Qualification; import de.aidger.view.models.ComboBoxModel; import de.aidger.view.models.GenericListModel; import de.aidger.view.models.UIAssistant; import de.aidger.view.models.UIContract; import de.aidger.view.models.UICostUnit; import de.aidger.view.models.UICourse; import de.aidger.view.tabs.EditorTab; import de.aidger.view.tabs.Tab; import de.aidger.view.tabs.ViewerTab.DataType; import de.aidger.view.utils.AutoCompletion; import de.aidger.view.utils.InputPatternFilter; import de.aidger.view.utils.NumberFormat; import siena.SienaException; /** * A form used for editing / creating new employments. * * @author aidGer Team */ @SuppressWarnings("serial") public class EmploymentEditorForm extends JPanel { /** * A flag whether the form is in edit mode. */ private boolean editMode = false; /** * Constructs an employment editor form. * * @param employment * The employment that will be edited * @param listModels * the list models of the parent editor tab */ @SuppressWarnings("unchecked") public EmploymentEditorForm(Employment employment, List<GenericListModel> listModels) { if (employment != null) { editMode = true; } initComponents(); SwingUtilities.invokeLater(new Runnable() { public void run() { cmbAssistant.requestFocusInWindow(); } }); btnContractAdd.setIcon(new ImageIcon(getClass().getResource( "/de/aidger/res/icons/plus-small.png"))); btnContractAdd.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { Tab current = UI.getInstance().getCurrentTab(); EditorTab next = new EditorTab(DataType.Contract); if (cmbAssistant.getSelectedItem() != null) { ((ContractEditorForm) next.getEditorForm()) .setAssistant(((Assistant) cmbAssistant .getSelectedItem())); } current.markAsPredecessor(); next.markAsNoPredecessor(); UI.getInstance().replaceCurrentTab(next); current.markAsNoPredecessor(); } }); AutoCompletion.enable(cmbAssistant); AutoCompletion.enable(cmbCourse); AutoCompletion.enable(cmbContract); AutoCompletion.enable(cmbCostUnit); cmbAssistant.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { refreshQualification((Assistant) cmbAssistant.getSelectedItem()); } }); try { List<Assistant> assistants = (new Assistant()).getAll(); ComboBoxModel cmbAssistantModel = new ComboBoxModel( DataType.Assistant); for (Assistant a : assistants) { Assistant assistant = new UIAssistant(a); cmbAssistantModel.addElement(assistant); if (employment != null && assistant.getId() .equals(employment.getAssistantId())) { cmbAssistantModel.setSelectedItem(assistant); } } List<Course> courses = (new Course()).getAll(); ComboBoxModel cmbCourseModel = new ComboBoxModel(DataType.Course); for (Course c : courses) { Course course = new UICourse(c); cmbCourseModel.addElement(course); if (employment != null && course.getId().equals(employment.getCourseId())) { cmbCourseModel.setSelectedItem(course); } } ComboBoxModel cmbFundsModel = new ComboBoxModel( DataType.FinancialCategory); cmbAssistant.setModel(cmbAssistantModel); cmbCourse.setModel(cmbCourseModel); cmbCostUnit.setModel(cmbFundsModel); ComboBoxModel cmbCostUnitModel = new ComboBoxModel(DataType.CostUnit); List<CostUnit> costUnits = new CostUnit().getAll(); for(CostUnit costUnit : costUnits) { cmbCostUnitModel.addModel(costUnit); } cmbFunds.setModel(cmbCostUnitModel); listModels.add(cmbCostUnitModel); listModels.add(cmbAssistantModel); listModels.add(cmbCourseModel); if (cmbAssistant.getSelectedItem() != null) { refreshQualification((Assistant) cmbAssistant.getSelectedItem()); } addNewDate(); if (editMode) { CostUnit costUnit = (new CostUnit()).fromTokenDB(employment.getFunds()); cmbFunds.setSelectedItem(costUnit); cmbCostUnit.setSelectedItem(UICostUnit.valueOf(employment.getCostUnit())); cmbQualification.setSelectedItem(Qualification.valueOf(employment.getQualification())); txtRemark.setText(employment.getRemark()); DateLine dl = dateLines.get(0); Calendar cal = Calendar.getInstance(); cal.set(Calendar.MONTH, employment.getMonth() - 1); cal.set(Calendar.YEAR, employment.getYear()); dl.spDate.setValue(cal.getTime()); dl.txtHourCount.setText(NumberFormat.getInstance().format( employment.getHourCount())); } List<Contract> contracts; if (editMode) { contracts = (new Contract()) .getContracts((Assistant) cmbAssistant.getSelectedItem()); } else { List<Contract> tmpContracts = (new Contract()).getAll(); contracts = new ArrayList<Contract>(); for (Contract c : tmpContracts) { contracts.add(new Contract(c)); } } ComboBoxModel cmbContractModel = new ComboBoxModel( DataType.Contract); if (!editMode) { cmbContractModel.addElement(new UIContract()); } for (Contract c : contracts) { Contract contract = new UIContract(c); cmbContractModel.addElement(contract); if (employment != null && contract.getId() == employment.getContractId()) { cmbContractModel.setSelectedItem(contract); } } cmbAssistant.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { List<Contract> contracts = (new Contract()) .getContracts((Assistant) cmbAssistant .getSelectedItem()); ComboBoxModel cmbContractModel = (ComboBoxModel) cmbContract .getModel(); cmbContractModel.removeAllElements(); cmbContractModel.addElement(new UIContract()); for (Contract c : contracts) { Contract contract = new UIContract(c); cmbContractModel.addElement(contract); } } catch (SienaException e2) { //TODO: Handle } } }); cmbContract.setModel(cmbContractModel); listModels.add(cmbContractModel); } catch (SienaException e) { //TODO: Handle } cmbFunds.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { refreshCostUnit(); } }); refreshCostUnit(); } /** * Refreshs the cost unit field. */ private void refreshCostUnit() { CostUnit costUnit = (CostUnit) cmbFunds.getSelectedItem(); if(costUnit != null) { cmbCostUnit.setSelectedItem(costUnit.getCostUnit()); } } /** * Refreshs the qualification model. * * @param assistant * the new assistant */ private void refreshQualification(Assistant assistant) { if (assistant == null) { return; } cmbQualification.setSelectedItem(Qualification.valueOf(assistant .getQualification())); } /** * Get the id referencing the assistant. * * @return The id of the assistant */ public Assistant getAssistant() { return (Assistant) cmbAssistant.getSelectedItem(); } /** * Get the id referencing the contract. * * @return The id of the contract */ public Long getContractId() { if (cmbContract.getSelectedItem() != null) { return ((Contract) cmbContract.getSelectedItem()).getId(); } return null; } /** * Get the funds of the employment. * * @return The funds of the employment */ public String getFunds() { Object funds = cmbFunds.getSelectedItem(); return funds instanceof CostUnit ? ((CostUnit) funds).getTokenDB() : (String) funds; } /** * Get the id referencing the course. * * @return The id of the course */ public Course getCourse() { return (Course) cmbCourse.getSelectedItem(); } /** * Get the funds of the employment. * * @return The funds of the employment * @throws NumberFormatException */ public Integer getCostUnit() throws NumberFormatException { if(cmbCostUnit.getSelectedItem() == null) return null; return Integer.valueOf((String) cmbCostUnit.getSelectedItem()); } /** * Get the qualification of the employment. * * @return The qualification of the employment */ public String getQualification() { return ((Qualification) cmbQualification.getSelectedItem()).name(); } /** * Get the remarks regarding the employment. * * @return The remarks regarding the employment */ public String getRemark() { return txtRemark.getText(); } /** * Get the dates of the employment. * * @return The dates of the employment */ public List<Date> getDates() { List<Date> dates = new ArrayList<Date>(); for (DateLine dl : dateLines) { dates.add((Date) dl.spDate.getValue()); } return dates; } /** * Get the hour counts worked during the employment. * * @return The hour counts worked during the employment * @throws NumberFormatException */ public List<Double> getHourCounts() throws ParseException { List<Double> hcs = new ArrayList<Double>(); for (DateLine dl : dateLines) { hcs.add(NumberFormat.getInstance().parse(dl.txtHourCount.getText()) .doubleValue()); } return hcs; } /** * Removes all date lines from editor. */ private void clearDateLines() { for (DateLine dateLine : dateLines) { remove(dateLine.lblDate); remove(dateLine.spDate); remove(dateLine.lblHourCount); remove(dateLine.txtHourCount); remove(dateLine.btnPlusMinus); } dateLines.clear(); repaint(); revalidate(); } /** * Generates the employments months in concordance to the contract. */ private void generateEmploymentMonths() { Contract contract = (Contract) cmbContract.getSelectedItem(); if (contract == null || contract.getStartDate() == null) { return; } Calendar start = Calendar.getInstance(); start.setTime(contract.getStartDate()); start.set(Calendar.DAY_OF_MONTH, 1); Calendar end = Calendar.getInstance(); end.setTime(contract.getEndDate()); end.set(Calendar.DAY_OF_MONTH, 2); clearDateLines(); addNewDate(); dateLines.get(0).spDate.setValue(start.getTime()); start.add(Calendar.MONTH, 1); while (end.after(start)) { addNewDate(); start.add(Calendar.MONTH, 1); } } /** * Adds a new date line to the form. */ private void addNewDate() { GridBagConstraints gridBagConstraints; JLabel lblDate = new JLabel(); lblDate.setText(_("Date")); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = GridBagConstraints.RELATIVE; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); add(lblDate, gridBagConstraints); JSpinner spDate = new JSpinner(); spDate.setModel(new SpinnerDateModel()); spDate.setEditor(new JSpinner.DateEditor(spDate, "MM.yyyy")); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = GridBagConstraints.RELATIVE; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); add(spDate, gridBagConstraints); JLabel lblHourCount = new JLabel(); lblHourCount.setText(_("Hour count")); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = GridBagConstraints.RELATIVE; gridBagConstraints.anchor = GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(10, 35, 10, 10); add(lblHourCount, gridBagConstraints); JTextField txtHourCount = new JTextField(); txtHourCount.setMinimumSize(new java.awt.Dimension(200, 25)); txtHourCount.setPreferredSize(new java.awt.Dimension(200, 25)); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = GridBagConstraints.RELATIVE; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); add(txtHourCount, gridBagConstraints); InputPatternFilter.addDoubleFilter(txtHourCount); if (dateLines.isEmpty() && !editMode) { JLabel lblAutoGuess = new JLabel(); lblAutoGuess.setIcon(new javax.swing.ImageIcon(getClass() .getResource("/de/aidger/res/icons/wand.png"))); lblAutoGuess .setToolTipText(_("Generate employment months in concordance to the contract.")); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 4; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); add(lblAutoGuess, gridBagConstraints); lblAutoGuess.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mouseClicked(java.awt.event.MouseEvent evt) { generateEmploymentMonths(); } }); } JButton btnPlusMinus = new JButton(); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 5; DateLine dl = new DateLine(lblDate, spDate, lblHourCount, txtHourCount, btnPlusMinus); if (dateLines.isEmpty()) { EditorTab.setTimeToNow(spDate); btnPlusMinus.setIcon(new ImageIcon(getClass().getResource( "/de/aidger/res/icons/plus-small.png"))); gridBagConstraints.gridy = 4; btnPlusMinus.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { addNewDate(); } }); if (editMode) { btnPlusMinus.setVisible(false); } } else { gridBagConstraints.gridy = GridBagConstraints.RELATIVE; btnPlusMinus.setAction(new RemoveDateAction(dl)); Calendar cal = Calendar.getInstance(); cal.clear(); cal.setTime((Date) dateLines.get(dateLines.size() - 1).spDate .getValue()); cal.add(Calendar.MONTH, 1); spDate.setValue(cal.getTime()); txtHourCount .setText(dateLines.get(dateLines.size() - 1).txtHourCount .getText()); } add(btnPlusMinus, gridBagConstraints); dateLines.add(dl); } /** * 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() { java.awt.GridBagConstraints gridBagConstraints; lblAssistant = new javax.swing.JLabel(); lblCourse = new javax.swing.JLabel(); lblContract = new javax.swing.JLabel(); lblCostUnit = new javax.swing.JLabel(); lblFunds = new javax.swing.JLabel(); lblQualification = new javax.swing.JLabel(); lblRemark = new javax.swing.JLabel(); cmbAssistant = new javax.swing.JComboBox(); cmbCourse = new javax.swing.JComboBox(); cmbContract = new javax.swing.JComboBox(); btnContractAdd = new javax.swing.JButton(); cmbCostUnit = new javax.swing.JComboBox(); cmbFunds = new javax.swing.JComboBox(); cmbQualification = new javax.swing.JComboBox(); txtRemark = new javax.swing.JTextField(); filler = new javax.swing.JLabel(); setLayout(new java.awt.GridBagLayout()); lblAssistant.setText(_("Assistant")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); add(lblAssistant, gridBagConstraints); lblAssistant.getAccessibleContext().setAccessibleDescription("assistantId"); lblCourse.setText(_("Course")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); add(lblCourse, gridBagConstraints); lblCourse.getAccessibleContext().setAccessibleDescription("courseId"); lblContract.setText(_("Contract")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(10, 35, 10, 10); add(lblContract, gridBagConstraints); lblContract.getAccessibleContext().setAccessibleDescription("contractId"); lblCostUnit.setText(_("Cost unit")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(10, 35, 10, 10); add(lblCostUnit, gridBagConstraints); lblCostUnit.getAccessibleContext().setAccessibleDescription("costUnit"); lblFunds.setText(_("Funds")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); add(lblFunds, gridBagConstraints); lblFunds.getAccessibleContext().setAccessibleDescription("funds"); lblQualification.setText(_("Qualification")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(10, 35, 10, 10); add(lblQualification, gridBagConstraints); lblQualification.getAccessibleContext().setAccessibleDescription("qualification"); lblRemark.setText(_("Remark")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); add(lblRemark, gridBagConstraints); lblRemark.getAccessibleContext().setAccessibleDescription("remark"); cmbAssistant.setMinimumSize(new java.awt.Dimension(300, 25)); cmbAssistant.setPreferredSize(new java.awt.Dimension(300, 25)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); add(cmbAssistant, gridBagConstraints); cmbCourse.setMinimumSize(new java.awt.Dimension(300, 25)); cmbCourse.setPreferredSize(new java.awt.Dimension(300, 25)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); add(cmbCourse, gridBagConstraints); cmbContract.setMinimumSize(new java.awt.Dimension(300, 25)); cmbContract.setPreferredSize(new java.awt.Dimension(300, 25)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); add(cmbContract, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 5; gridBagConstraints.gridy = 1; add(btnContractAdd, gridBagConstraints); cmbCostUnit.setEnabled(false); cmbCostUnit.setMinimumSize(new java.awt.Dimension(300, 25)); cmbCostUnit.setPreferredSize(new java.awt.Dimension(300, 25)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); add(cmbCostUnit, gridBagConstraints); cmbFunds.setMinimumSize(new java.awt.Dimension(300, 25)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); add(cmbFunds, gridBagConstraints); cmbQualification.setModel(new javax.swing.DefaultComboBoxModel(Qualification.values())); cmbQualification.setEnabled(false); cmbQualification.setMinimumSize(new java.awt.Dimension(300, 25)); cmbQualification.setPreferredSize(new java.awt.Dimension(300, 25)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); add(cmbQualification, gridBagConstraints); txtRemark.setMinimumSize(new java.awt.Dimension(200, 25)); txtRemark.setPreferredSize(new java.awt.Dimension(200, 25)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10); add(txtRemark, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 4; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; add(filler, gridBagConstraints); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnContractAdd; private javax.swing.JComboBox cmbAssistant; private javax.swing.JComboBox cmbContract; private javax.swing.JComboBox cmbCostUnit; private javax.swing.JComboBox cmbCourse; private javax.swing.JComboBox cmbFunds; private javax.swing.JComboBox cmbQualification; private javax.swing.JLabel filler; private javax.swing.JLabel lblAssistant; private javax.swing.JLabel lblContract; private javax.swing.JLabel lblCostUnit; private javax.swing.JLabel lblCourse; private javax.swing.JLabel lblFunds; private javax.swing.JLabel lblQualification; private javax.swing.JLabel lblRemark; private javax.swing.JTextField txtRemark; // End of variables declaration//GEN-END:variables private final List<DateLine> dateLines = new ArrayList<DateLine>(); /** * This class represents a date line in the form. * * @author aidGer Team */ private class DateLine { public JLabel lblDate; public JSpinner spDate; public JLabel lblHourCount; public JTextField txtHourCount; public JButton btnPlusMinus; /** * Initializes a date line. * */ public DateLine(JLabel lblDate, JSpinner spDate, JLabel lblHourCount, JTextField txtHourCount, JButton btnPlusMinus) { this.lblDate = lblDate; this.spDate = spDate; this.lblHourCount = lblHourCount; this.txtHourCount = txtHourCount; this.btnPlusMinus = btnPlusMinus; } } /** * Removes a date line from the form by clicking on "-" button. * * @author aidGer Team */ private class RemoveDateAction extends AbstractAction { /** * The date line that will be removed. */ private final DateLine dateLine; /** * Initializes the action. */ public RemoveDateAction(DateLine dateLine) { putValue(Action.SMALL_ICON, new ImageIcon(getClass().getResource( "/de/aidger/res/icons/minus-small.png"))); this.dateLine = dateLine; } /* * (non-Javadoc) * * @see * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent * ) */ @Override public void actionPerformed(ActionEvent e) { remove(dateLine.lblDate); remove(dateLine.spDate); remove(dateLine.lblHourCount); remove(dateLine.txtHourCount); remove(dateLine.btnPlusMinus); dateLines.remove(dateLine); repaint(); revalidate(); } } }