eu.ggnet.dwoss.receipt.unit.UnitView.java Source code

Java tutorial

Introduction

Here is the source code for eu.ggnet.dwoss.receipt.unit.UnitView.java

Source

/*
 * Copyright (C) 2014 GG-Net GmbH - Oliver Gnther
 *
 * 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.receipt.unit;

import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.*;

import javax.swing.*;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;

import eu.ggnet.dwoss.common.DwOssCore;
import eu.ggnet.dwoss.receipt.CheckBoxTableNoteModel;
import eu.ggnet.dwoss.receipt.UiUtil;
import eu.ggnet.dwoss.receipt.unit.UnitModel.Survey;
import eu.ggnet.dwoss.rules.TradeName;
import eu.ggnet.dwoss.rules.Warranty;
import eu.ggnet.dwoss.stock.entity.Shipment;
import eu.ggnet.dwoss.uniqueunit.entity.UniqueUnit;
import eu.ggnet.dwoss.uniqueunit.entity.UniqueUnit.Equipment;
import eu.ggnet.dwoss.uniqueunit.entity.UniqueUnit.StaticComment;
import eu.ggnet.dwoss.uniqueunit.entity.UniqueUnit.StaticInternalComment;
import eu.ggnet.dwoss.util.*;
import eu.ggnet.saft.core.Client;
import eu.ggnet.saft.core.UserPreferences;

import lombok.Getter;
import lombok.Setter;

import static eu.ggnet.dwoss.uniqueunit.entity.UniqueUnit.Identifier.REFURBISHED_ID;
import static eu.ggnet.dwoss.uniqueunit.entity.UniqueUnit.Identifier.SERIAL;

/**
 *
 * @author bastian.venz, oliver.guenther
 */
public class UnitView extends javax.swing.JDialog {

    CheckBoxTableNoteModel<Equipment> equipmentModel = new CheckBoxTableNoteModel(
            Arrays.asList(Equipment.class.getEnumConstants()), "Ausstattung");

    CheckBoxTableNoteModel<StaticComment> commentModel = new CheckBoxTableNoteModel(
            Arrays.asList(StaticComment.class.getEnumConstants()), "Bemerkungen");

    CheckBoxTableNoteModel<StaticInternalComment> internalCommentModel = new CheckBoxTableNoteModel(
            Arrays.asList(StaticInternalComment.class.getEnumConstants()), "Interne Bemerkungen");

    private ComboBoxController<UniqueUnit.Condition> conditionController;

    private ComboBoxController<Warranty> warrantyController;

    private UniqueUnit unit;

    @Getter
    @Setter
    private UnitModel model;

    @Getter
    @Setter
    private UnitController controller;

    private boolean cancel = true;

    private String lastMessage = "";

    PropertyChangeListener mfgProperty = new PropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            // HINT: If a date was set and is switched back to null, it is ignored.
            if (!evt.getPropertyName().equals("date"))
                return;
            // ShortCut
            if (Objects.equals(model.getMetaUnit().getMfgDate().getValue(), mfgDateChooser.getDate()))
                return;
            model.getMetaUnit().getMfgDate().setValue(mfgDateChooser.getDate());
            controller.validateMfgDate();
        }
    };

    PropertyChangeListener warrantyProperty = new PropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            // HINT: If a date was set and is switched back to null, it is ignored.
            if (!evt.getPropertyName().equals("date"))
                return;
            // ShortCut
            if (Objects.equals(model.getMetaUnit().getWarrentyTill(), warrantyTillChooser.getDate()))
                return;
            model.getMetaUnit().setWarrentyTillSetted(
                    ((Warranty) warrantyTypeChooser.getSelectedItem()) == Warranty.WARRANTY_TILL_DATE);
            model.getMetaUnit().setWarrentyTill(warrantyTillChooser.getDate());
            controller.updateActions();
        }
    };

    public UnitView(Window window) {
        super(window);
        initComponents();
        setModalityType(ModalityType.APPLICATION_MODAL);
        setLocationRelativeTo(window);
        Client.lookup(UserPreferences.class).loadLocation(this);
        // Setting the change also in the subcomponent. FocusListener does not work completely.
        mfgDateChooser.addPropertyChangeListener(mfgProperty);
        mfgDateChooser.getDateEditor().getUiComponent().addPropertyChangeListener(mfgProperty);

        warrantyTillChooser.addPropertyChangeListener(warrantyProperty);
        warrantyTillChooser.getDateEditor().getUiComponent().addPropertyChangeListener(warrantyProperty);

        editRefurbishedIdButton.setEnabled(false);
        equipmentTable.setModel(equipmentModel);
        equipmentModel.setTable(equipmentTable);
        commentTable.setModel(commentModel);
        commentModel.setTable(commentTable);
        internalCommentTable.setModel(internalCommentModel);
        internalCommentModel.setTable(internalCommentTable);

        conditionController = new ComboBoxController<>(unitStateBox, UniqueUnit.Condition.values());
        warrantyController = new ComboBoxController<>(warrantyTypeChooser, Warranty.values());
        warrantyTypeChooser.setRenderer(new NamedEnumCellRenderer());
        unitStateBox.setRenderer(new NamedEnumCellRenderer());
        unitStateBox.setModel(new DefaultComboBoxModel(UniqueUnit.Condition.values()));

        refurbishedIdField.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, new HashSet<>(
                Arrays.asList(KeyStroke.getKeyStroke("pressed ENTER"), KeyStroke.getKeyStroke("pressed TAB"))));
        serialField.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, new HashSet<>(
                Arrays.asList(KeyStroke.getKeyStroke("pressed ENTER"), KeyStroke.getKeyStroke("pressed TAB"))));

        UiUtil.forwardTab(partNoField, unitStateBox, internalCommentArea, commentArea);
        UiUtil.backwardTab(refurbishedIdField, serialField, partNoField, unitStateBox);

        UiUtil.spaceSelection(equipmentTable);
        UiUtil.spaceSelection(internalCommentTable);
        UiUtil.spaceSelection(commentTable);

        refurbishedIdField.requestFocus();
        contractorBox.setRenderer(new NamedEnumCellRenderer());
        contractorBox.setModel(new DefaultComboBoxModel(TradeName.getManufacturers().toArray()));
    }

    public void setShipment(Shipment shipment) {
        unitShipField.setText(shipment.getShipmentId());
        unitOwnerField.setText(shipment.getContractor().toString());
        model.setContractor(shipment.getContractor());
        model.setMode(shipment.getDefaultManufacturer());
        contractorBox.setSelectedItem(shipment.getDefaultManufacturer());
        controller.updateChains();
    }

    // TODO: set to model or at lest update the unitMetaModel
    public void setUnit(UniqueUnit unit) {
        if (unit == null)
            return;
        this.unit = unit;
        refurbishedIdField.setEditable(false);
        model.getMetaUnit().loadFrom(unit);
        model.setProduct(unit.getProduct());
        updateMetaUnit();
        equipmentModel.setMarked(unit.getEquipments());
        commentModel.setMarked(unit.getComments());
        internalCommentModel.setMarked(unit.getInternalComments());
        conditionController.setSelected(unit.getCondition());
        warrantyController.setSelected(unit.getWarranty());
        commentArea.setText(unit.getComment());
        internalCommentArea.setText(unit.getInternalComment());
        unitOwnerField.setText(unit.getContractor().toString());
        model.setContractor(unit.getContractor());

        if (StringUtils.isNotBlank(unit.getShipmentLabel()))
            unitShipField.setText(unit.getShipmentLabel());
        if (unit.getWarranty().equals(Warranty.WARRANTY_TILL_DATE))
            warrantyTillChooser.setDate(unit.getWarrentyValid());
    }

    public UniqueUnit getUnit() {
        if (unit == null) {
            unit = new UniqueUnit();
        }
        model.getMetaUnit().loadTo(unit);
        unit.setCondition(conditionController.getSelected());
        unit.setWarranty(warrantyController.getSelected());
        unit.setEquipments(equipmentModel.getMarked());
        unit.setComments(commentModel.getMarked());
        unit.setInternalComments(internalCommentModel.getMarked());
        unit.setContractor(model.getContractor());

        if (!StringUtils.isBlank(commentArea.getText())) {
            unit.setComment(
                    commentArea.getText().replaceAll(SystemUtils.LINE_SEPARATOR, " ").replaceAll("\\t", " "));
        } else {
            unit.setComment(commentArea.getText());
        }
        if (!StringUtils.isBlank(internalCommentArea.getText())) {
            unit.setInternalComment(internalCommentArea.getText().replaceAll(SystemUtils.LINE_SEPARATOR, " ")
                    .replaceAll("\\t", " "));
        } else {
            unit.setInternalComment(internalCommentArea.getText());
        }
        if (warrantyController.getSelected().equals(Warranty.WARRANTY_TILL_DATE)) {
            unit.setWarrentyValid(warrantyTillChooser.getDate());
        }
        return unit;
    }

    public void setPartNo(String partNo) {
        partNoField.setText(partNo);
        model.getMetaUnit().getPartNo().setValue(partNo);
        controller.validatePartNoAndLoadDetails();
    }

    void addOperationAction(Action action) {
        operationButtonPanel.add(new JButton(action));
    }

    public boolean isCancel() {
        return cancel;
    }

    /**
     * Reloads the validation statuses of refurbishId, serial, partNo and mfg date from the model.
     */
    void updateValidationStatus() {
        StringBuilder sb = new StringBuilder("Last Update:\n");
        UnitModel.MetaUnit mu = model.getMetaUnit();
        updateValidationStatus(refurbishedIdField, mu.getRefurbishId().getSurvey(), sb);
        updateValidationStatus(partNoField, mu.getPartNo().getSurvey(), sb);
        updateValidationStatus(mfgDateChooser, mu.getMfgDate().getSurvey(), sb);
        updateValidationStatus(serialField, mu.getSerial().getSurvey(), sb);
        lastMessage = sb.toString();
    }

    private void updateValidationStatus(JComponent component, Survey vs, StringBuilder sb) {
        EventQueue.invokeLater(() -> {
            component.setToolTipText(vs.getMessage());
            component.setForeground(vs.getStatus().getColor());
        });
        sb.append("- ").append(component.getName()).append(": ").append(vs.getStatus()).append(" : ")
                .append(vs.getMessage()).append("\n");
    }

    /**
     * Reloads the values of refurbishId, serial, partNo and mfg date from the model.
     */
    void updateMetaUnit() {
        if (!Objects.equals(refurbishedIdField.getText(), model.getMetaUnit().getRefurbishId().getValue()))
            refurbishedIdField.setText(model.getMetaUnit().getRefurbishId().getValue());

        if (!Objects.equals(serialField.getText(), model.getMetaUnit().getSerial().getValue()))
            serialField.setText(model.getMetaUnit().getSerial().getValue());

        if (!Objects.equals(partNoField.getText(), model.getMetaUnit().getPartNo().getValue()))
            partNoField.setText(model.getMetaUnit().getPartNo().getValue());

        if (!Objects.equals(mfgDateChooser.getDate(), model.getMetaUnit().getMfgDate().getValue()))
            mfgDateChooser.setDate(model.getMetaUnit().getMfgDate().getValue());

        if (!Objects.equals(warrantyTillChooser.getDate(), model.getMetaUnit().getWarrentyTill()))
            warrantyTillChooser.setDate(model.getMetaUnit().getWarrentyTill());
    }

    void setCancel(boolean cancel) {
        this.cancel = cancel;
    }

    /**
     * Updates the Product and the Description from the Model;
     */
    void updateProduct() {
        Set<UniqueUnit.Equipment> equipment = UniqueUnit.Equipment.getEquipments();
        if (model.getProduct() != null)
            equipment.retainAll(UniqueUnit.Equipment.getEquipments(model.getProduct().getGroup()));
        if (unit != null)
            equipment.addAll(unit.getEquipments());
        equipmentModel.setFiltered(equipment);
        detailArea.setText(model.getProductSpecDescription());
    }

    void updateMode() {
        contractorBox.setSelectedItem(model.getMode());
    }

    /**
     * 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() {
        java.awt.GridBagConstraints gridBagConstraints;

        manufacturerButtonGroup = new javax.swing.ButtonGroup();
        jPanel1 = new javax.swing.JPanel();
        unitSplitPane = new javax.swing.JSplitPane();
        unitWritePanel = new javax.swing.JPanel();
        internalCommentAreaScrollPane = new javax.swing.JScrollPane();
        internalCommentArea = new javax.swing.JTextArea();
        commentAreaScrollPane = new javax.swing.JScrollPane();
        commentArea = new javax.swing.JTextArea();
        unitItemLabel = new javax.swing.JLabel();
        unitStatusLabel = new javax.swing.JLabel();
        unitStateBox = new javax.swing.JComboBox();
        editProductButton = new javax.swing.JButton();
        partNoField = new javax.swing.JTextField();
        refurbishedIdField = new javax.swing.JTextField();
        unitSnLabel = new javax.swing.JLabel();
        unitNumberLabel = new javax.swing.JLabel();
        serialField = new javax.swing.JTextField();
        editRefurbishedIdButton = new javax.swing.JButton();
        mfgLabel = new javax.swing.JLabel();
        mfgDateChooser = new com.toedter.calendar.JDateChooser();
        jLabel3 = new javax.swing.JLabel();
        warrantyTillChooser = new com.toedter.calendar.JDateChooser();
        jLabel4 = new javax.swing.JLabel();
        warrantyTypeChooser = new javax.swing.JComboBox();
        manufacturerPanel = new javax.swing.JPanel();
        contractorBox = new javax.swing.JComboBox();
        jScrollPane3 = new javax.swing.JScrollPane();
        equipmentTable = new javax.swing.JTable();
        jScrollPane4 = new javax.swing.JScrollPane();
        commentTable = new javax.swing.JTable();
        jScrollPane5 = new javax.swing.JScrollPane();
        internalCommentTable = new javax.swing.JTable();
        unitReadPanel = new javax.swing.JPanel();
        unitShipLabel = new javax.swing.JLabel();
        unitShipField = new javax.swing.JTextField();
        unitOwnerLabel = new javax.swing.JLabel();
        unitOwnerField = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        detailArea = new javax.swing.JEditorPane();
        messagesButton = new javax.swing.JButton();
        operationButtonPanel = new javax.swing.JPanel();
        cancelButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Gert bearbeiten/aufnehmen");
        setMinimumSize(new java.awt.Dimension(1080, 700));
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        unitSplitPane.setDividerLocation(600);
        unitSplitPane.setResizeWeight(1.0);
        unitSplitPane.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        unitSplitPane.setDoubleBuffered(true);

        unitWritePanel.setBorder(javax.swing.BorderFactory.createTitledBorder(
                javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED,
                        new java.awt.Color(204, 204, 255), new java.awt.Color(51, 51, 51))));
        unitWritePanel.setMinimumSize(new java.awt.Dimension(500, 400));
        unitWritePanel.setPreferredSize(new java.awt.Dimension(500, 400));
        unitWritePanel.setLayout(new java.awt.GridBagLayout());

        internalCommentArea.setColumns(20);
        internalCommentArea.setLineWrap(true);
        internalCommentArea.setRows(5);
        internalCommentArea.setWrapStyleWord(true);
        internalCommentAreaScrollPane.setViewportView(internalCommentArea);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 3;
        gridBagConstraints.gridy = 10;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
        gridBagConstraints.weighty = 0.1;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        unitWritePanel.add(internalCommentAreaScrollPane, gridBagConstraints);

        commentArea.setColumns(20);
        commentArea.setLineWrap(true);
        commentArea.setRows(5);
        commentArea.setWrapStyleWord(true);
        commentAreaScrollPane.setViewportView(commentArea);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 10;
        gridBagConstraints.gridwidth = 3;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
        gridBagConstraints.weighty = 0.1;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        unitWritePanel.add(commentAreaScrollPane, gridBagConstraints);

        unitItemLabel.setText("ArtikelNr:");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        unitWritePanel.add(unitItemLabel, gridBagConstraints);

        unitStatusLabel.setText("Zustand:");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 5;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        unitWritePanel.add(unitStatusLabel, gridBagConstraints);

        unitStateBox.setNextFocusableComponent(warrantyTillChooser);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 5;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        unitWritePanel.add(unitStateBox, gridBagConstraints);

        editProductButton.setText("Edit");
        editProductButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                editProductButtonActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 2;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        unitWritePanel.add(editProductButton, gridBagConstraints);

        partNoField.setName("partNo"); // NOI18N
        partNoField.setNextFocusableComponent(unitStateBox);
        partNoField.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                partNoFieldFocusLost(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        unitWritePanel.add(partNoField, gridBagConstraints);

        refurbishedIdField.setName("refurbishId"); // NOI18N
        refurbishedIdField.setNextFocusableComponent(serialField);
        refurbishedIdField.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                refurbishedIdFieldFocusLost(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 0.1;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        unitWritePanel.add(refurbishedIdField, gridBagConstraints);

        unitSnLabel.setText("SerienNr:");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END;
        gridBagConstraints.insets = new java.awt.Insets(5, 2, 2, 2);
        unitWritePanel.add(unitSnLabel, gridBagConstraints);

        unitNumberLabel.setText("SopoNr:");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        unitWritePanel.add(unitNumberLabel, gridBagConstraints);

        serialField.setName("serial"); // NOI18N
        serialField.setNextFocusableComponent(partNoField);
        serialField.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                serialFieldFocusLost(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        unitWritePanel.add(serialField, gridBagConstraints);

        editRefurbishedIdButton.setText("Edit");
        editRefurbishedIdButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                editRefurbishedIdButtonActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 2;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        unitWritePanel.add(editRefurbishedIdButton, gridBagConstraints);

        mfgLabel.setText("MFG Date:");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 4;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END;
        unitWritePanel.add(mfgLabel, gridBagConstraints);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 4;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        unitWritePanel.add(mfgDateChooser, gridBagConstraints);

        jLabel3.setText("Garantie bis:");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 7;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_END;
        gridBagConstraints.insets = new java.awt.Insets(8, 0, 0, 0);
        unitWritePanel.add(jLabel3, gridBagConstraints);

        warrantyTillChooser.setEnabled(false);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 7;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.PAGE_START;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        unitWritePanel.add(warrantyTillChooser, gridBagConstraints);

        jLabel4.setText("Garantietyp:");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 6;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END;
        unitWritePanel.add(jLabel4, gridBagConstraints);

        warrantyTypeChooser.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                warrantyTypeChooserActionPerformed(evt);
            }
        });
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 6;
        gridBagConstraints.gridwidth = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        unitWritePanel.add(warrantyTypeChooser, gridBagConstraints);

        manufacturerPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Hersteller Support"));

        contractorBox.setModel(
                new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        contractorBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                contractorBoxActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout manufacturerPanelLayout = new javax.swing.GroupLayout(manufacturerPanel);
        manufacturerPanel.setLayout(manufacturerPanelLayout);
        manufacturerPanelLayout.setHorizontalGroup(
                manufacturerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(
                        contractorBox, javax.swing.GroupLayout.Alignment.TRAILING, 0, 333, Short.MAX_VALUE));
        manufacturerPanelLayout.setVerticalGroup(
                manufacturerPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(contractorBox, javax.swing.GroupLayout.Alignment.TRAILING));

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridwidth = 3;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        unitWritePanel.add(manufacturerPanel, gridBagConstraints);

        equipmentTable
                .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" }));
        jScrollPane3.setViewportView(equipmentTable);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 3;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.gridheight = 9;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 0.1;
        gridBagConstraints.weighty = 0.2;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        unitWritePanel.add(jScrollPane3, gridBagConstraints);

        commentTable
                .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" }));
        jScrollPane4.setViewportView(commentTable);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 8;
        gridBagConstraints.gridwidth = 3;
        gridBagConstraints.gridheight = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weighty = 0.2;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        unitWritePanel.add(jScrollPane4, gridBagConstraints);

        internalCommentTable
                .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" }));
        jScrollPane5.setViewportView(internalCommentTable);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 3;
        gridBagConstraints.gridy = 9;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 0.1;
        gridBagConstraints.weighty = 0.2;
        gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
        unitWritePanel.add(jScrollPane5, gridBagConstraints);

        unitSplitPane.setLeftComponent(unitWritePanel);

        unitReadPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(
                javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED,
                        new java.awt.Color(204, 204, 255), java.awt.Color.black)));

        unitShipLabel.setText("Shipment ID:");

        unitShipField.setEditable(false);
        unitShipField.setFocusable(false);

        unitOwnerLabel.setText("Besitzer:");

        unitOwnerField.setEditable(false);
        unitOwnerField.setFocusable(false);

        jLabel1.setText("Details:");

        jScrollPane2.setFocusable(false);

        detailArea.setContentType("text/html"); // NOI18N
        detailArea.setFocusable(false);
        jScrollPane2.setViewportView(detailArea);

        messagesButton.setText("Meldungen");
        messagesButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                messagesButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout unitReadPanelLayout = new javax.swing.GroupLayout(unitReadPanel);
        unitReadPanel.setLayout(unitReadPanelLayout);
        unitReadPanelLayout.setHorizontalGroup(unitReadPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 393, Short.MAX_VALUE)
                .addGroup(unitReadPanelLayout.createSequentialGroup()
                        .addGroup(unitReadPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(unitShipLabel).addComponent(unitOwnerLabel))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(unitReadPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(unitShipField, javax.swing.GroupLayout.DEFAULT_SIZE, 308,
                                        Short.MAX_VALUE)
                                .addComponent(unitOwnerField, javax.swing.GroupLayout.DEFAULT_SIZE, 308,
                                        Short.MAX_VALUE)))
                .addGroup(unitReadPanelLayout.createSequentialGroup().addComponent(jLabel1).addGap(0, 346,
                        Short.MAX_VALUE))
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, unitReadPanelLayout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE).addComponent(messagesButton)));
        unitReadPanelLayout.setVerticalGroup(unitReadPanelLayout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(unitReadPanelLayout.createSequentialGroup().addGroup(unitReadPanelLayout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(unitShipLabel)
                        .addComponent(unitShipField, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(
                                unitReadPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                        .addComponent(unitOwnerLabel).addComponent(unitOwnerField,
                                                javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 414, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(messagesButton)));

        unitSplitPane.setRightComponent(unitReadPanel);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(jPanel1Layout
                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel1Layout.createSequentialGroup().addContainerGap()
                        .addComponent(unitSplitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 1008, Short.MAX_VALUE)
                        .addContainerGap()));
        jPanel1Layout.setVerticalGroup(
                jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel1Layout
                        .createSequentialGroup().addContainerGap().addComponent(unitSplitPane).addContainerGap()));

        operationButtonPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        operationButtonPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT));

        cancelButton.setText("Abbrechen");
        cancelButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cancelButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
                        Short.MAX_VALUE)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
                        layout.createSequentialGroup().addContainerGap().addComponent(cancelButton)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(operationButtonPanel, javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(operationButtonPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 45,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
                                        layout.createSequentialGroup()
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addComponent(cancelButton).addContainerGap()))));

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
        this.setVisible(false);
    }//GEN-LAST:event_cancelButtonActionPerformed

    private void editProductButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editProductButtonActionPerformed
        try {
            controller.createOrEditPart(partNoField.getText());
        } catch (UserInfoException ex) {
            DwOssCore.show(this, ex);
        }
        controller.validateRefurbishedId();
    }//GEN-LAST:event_editProductButtonActionPerformed

    private void refurbishedIdFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_refurbishedIdFieldFocusLost
        String refurbishedId = refurbishedIdField.getText();
        // Shortcut. Rethink if ok. Better pick from model
        if (unit != null && refurbishedId.equals(unit.getIdentifier(REFURBISHED_ID)))
            return;
        model.getMetaUnit().getRefurbishId().setValue(refurbishedId);
        controller.validateRefurbishedId();
    }//GEN-LAST:event_refurbishedIdFieldFocusLost

    private void serialFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_serialFieldFocusLost
        final String serial = serialField.getText();
        // Shortcut. Rethink if ok. Better pick from model
        if (unit != null && serial.equals(unit.getIdentifier(SERIAL)))
            return;
        model.getMetaUnit().getSerial().setValue(serial);
        controller.validateSerial();
    }//GEN-LAST:event_serialFieldFocusLost

    private void partNoFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_partNoFieldFocusLost
        final String partNo = partNoField.getText();
        model.getMetaUnit().getPartNo().setValue(partNo);
        controller.validatePartNoAndLoadDetails();
    }//GEN-LAST:event_partNoFieldFocusLost

    private void editRefurbishedIdButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editRefurbishedIdButtonActionPerformed
        controller.editRefurbishedId(refurbishedIdField.getText());
    }//GEN-LAST:event_editRefurbishedIdButtonActionPerformed

    private void warrantyTypeChooserActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_warrantyTypeChooserActionPerformed
        if (warrantyTypeChooser.getSelectedItem() != null
                && warrantyTypeChooser.getSelectedItem().equals(Warranty.WARRANTY_TILL_DATE)) {
            warrantyTillChooser.setEnabled(true);
            model.getMetaUnit().setWarrentyTillSetted(true);
            controller.updateActions();
        } else {
            warrantyTillChooser.setEnabled(false);
            model.getMetaUnit().setWarrentyTillSetted(false);
            controller.updateActions();
        }
    }//GEN-LAST:event_warrantyTypeChooserActionPerformed

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        Client.lookup(UserPreferences.class).storeLocation(this);
    }//GEN-LAST:event_formWindowClosing

    private void messagesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_messagesButtonActionPerformed
        JOptionPane.showMessageDialog(this, lastMessage);
    }//GEN-LAST:event_messagesButtonActionPerformed

    private void contractorBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_contractorBoxActionPerformed
        model.setMode((TradeName) contractorBox.getSelectedItem());
        controller.updateChains();
        controller.validateAll();
    }//GEN-LAST:event_contractorBoxActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton cancelButton;
    private javax.swing.JTextArea commentArea;
    private javax.swing.JScrollPane commentAreaScrollPane;
    private javax.swing.JTable commentTable;
    private javax.swing.JComboBox contractorBox;
    private javax.swing.JEditorPane detailArea;
    private javax.swing.JButton editProductButton;
    private javax.swing.JButton editRefurbishedIdButton;
    private javax.swing.JTable equipmentTable;
    private javax.swing.JTextArea internalCommentArea;
    private javax.swing.JScrollPane internalCommentAreaScrollPane;
    private javax.swing.JTable internalCommentTable;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JScrollPane jScrollPane5;
    private javax.swing.ButtonGroup manufacturerButtonGroup;
    private javax.swing.JPanel manufacturerPanel;
    private javax.swing.JButton messagesButton;
    private com.toedter.calendar.JDateChooser mfgDateChooser;
    private javax.swing.JLabel mfgLabel;
    private javax.swing.JPanel operationButtonPanel;
    private javax.swing.JTextField partNoField;
    private javax.swing.JTextField refurbishedIdField;
    private javax.swing.JTextField serialField;
    private javax.swing.JLabel unitItemLabel;
    private javax.swing.JLabel unitNumberLabel;
    private javax.swing.JTextField unitOwnerField;
    private javax.swing.JLabel unitOwnerLabel;
    private javax.swing.JPanel unitReadPanel;
    private javax.swing.JTextField unitShipField;
    private javax.swing.JLabel unitShipLabel;
    private javax.swing.JLabel unitSnLabel;
    private javax.swing.JSplitPane unitSplitPane;
    private javax.swing.JComboBox unitStateBox;
    private javax.swing.JLabel unitStatusLabel;
    private javax.swing.JPanel unitWritePanel;
    com.toedter.calendar.JDateChooser warrantyTillChooser;
    javax.swing.JComboBox warrantyTypeChooser;
    // End of variables declaration//GEN-END:variables
}