/*
* 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.document;
import java.awt.*;
import java.net.URL;
import java.util.*;
import java.util.concurrent.ForkJoinPool;
import javax.swing.*;
import javax.swing.text.*;
import javafx.application.Platform;
import javafx.collections.*;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.*;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import org.apache.commons.lang3.StringUtils;
import org.openide.util.Lookup;
import eu.ggnet.dwoss.common.DwOssCore;
import eu.ggnet.dwoss.customer.api.CustomerService;
import eu.ggnet.dwoss.mandator.api.service.ShippingCostService;
import eu.ggnet.dwoss.redtape.SwingInteraction;
import eu.ggnet.dwoss.redtape.api.RedTapeHookService;
import eu.ggnet.dwoss.redtape.entity.Document;
import eu.ggnet.dwoss.redtape.entity.Position;
import eu.ggnet.dwoss.redtape.renderer.PositionListCell;
import eu.ggnet.dwoss.rules.*;
import eu.ggnet.dwoss.util.*;
import eu.ggnet.dwoss.util.validation.ValidationUtil;
import eu.ggnet.saft.core.Alert;
import eu.ggnet.saft.core.Client;
import eu.ggnet.saft.core.authorisation.Guardian;
import lombok.Getter;
import static eu.ggnet.dwoss.rights.api.AtomicRight.UPDATE_PRICE_INVOICES;
import static eu.ggnet.saft.core.Client.lookup;
/**
*
* @author pascal.perau
*/
public class DocumentUpdateView extends javax.swing.JPanel implements IPreClose {
static URL loadPlus() {
return DocumentUpdateView.class.getResource("plus.png");
}
static URL loadMinus() {
return DocumentUpdateView.class.getResource("minus.png");
}
static URL loadUp() {
return DocumentUpdateView.class.getResource("up.png");
}
static URL loadDown() {
return DocumentUpdateView.class.getResource("down.png");
}
static URL loadAddProductBatch() {
return DocumentUpdateView.class.getResource("addProductBatch.png");
}
static URL loadAddCoin() {
return DocumentUpdateView.class.getResource("add-coin-icon.png");
}
@Getter
private long customerId;
private DocumentUpdateController controller;
private final Document document;
private final Guardian accessCos;
private final ObservableList<Position> positions = FXCollections.observableArrayList();
private ListView<Position> positionsFxList;
public DocumentUpdateView(Document document) {
initComponents();
addUnitButton.setIcon(new ImageIcon(loadPlus()));
addProductBatchButton.setIcon(new ImageIcon(loadAddProductBatch()));
moveUpButton.setIcon(new ImageIcon(loadUp()));
moveDownButton.setIcon(new ImageIcon(loadDown()));
removePositionButton.setIcon(new ImageIcon(loadMinus()));
convertToWarrantyPositionButton.setIcon(new ImageIcon(loadAddCoin()));
initFxComponents();
this.document = document;
positions.addAll(document.getPositions().values());
this.accessCos = Lookup.getDefault().lookup(Guardian.class);
refreshAddressArea();
if ( !Client.hasFound(RedTapeHookService.class) ) convertToWarrantyPositionButton.setVisible(false);
if ( document.isClosed() || EnumSet.of(DocumentType.COMPLAINT, DocumentType.CREDIT_MEMO, DocumentType.ANNULATION_INVOICE).contains(document.getType()) ) {
disableComponents(addProductBatchButton, addUnitButton, unitInputField, addServiceButton, shippingCostButton);
} else if ( document.getType() == DocumentType.INVOICE ) {
accessCos.add(addProductBatchButton, UPDATE_PRICE_INVOICES);
accessCos.add(addUnitButton, UPDATE_PRICE_INVOICES);
accessCos.add(unitInputField, UPDATE_PRICE_INVOICES);
accessCos.add(addServiceButton, UPDATE_PRICE_INVOICES);
accessCos.add(shippingCostButton, UPDATE_PRICE_INVOICES);
accessCos.add(moveDownButton, UPDATE_PRICE_INVOICES);
accessCos.add(moveUpButton, UPDATE_PRICE_INVOICES);
} else if ( document.getType() == DocumentType.RETURNS || document.getType() == DocumentType.CAPITAL_ASSET )
disableComponents(addProductBatchButton, addServiceButton, shippingCostButton);
}
private void initFxComponents() {
final JFXPanel jfxp = new JFXPanel();
positionPanelFx.add(jfxp, BorderLayout.CENTER);
Platform.runLater(() -> {
BorderPane pane = new BorderPane();
Scene scene = new Scene(pane, Color.ALICEBLUE);
positionsFxList = new ListView<>();
positionsFxList.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
positionsFxList.setCellFactory(new PositionListCell.Factory());
positionsFxList.setItems(positions);
positionsFxList.setOnMouseClicked((mouseEvent) -> {
if ( mouseEvent.getButton().equals(MouseButton.PRIMARY) && mouseEvent.getClickCount() == 2 ) {
if ( isChangeAllowed() ) {
// TODO: We need some handling of a callback in the future. For now we ignore the result.
ForkJoinPool.commonPool().execute(() -> controller.editPosition(positionsFxList.getSelectionModel().getSelectedItem()));
} else {
Alert.show("Änderung an Positionen ist nicht erlaubt.");
}
}
});
pane.setCenter(positionsFxList);
jfxp.setScene(scene);
});
}
public void setController(DocumentUpdateController controller) {
this.controller = controller;
}
/**
* Display customer values in UI.
* <p/>
* @param customerId id of the current customer
*/
public void setCustomerValues(long customerId) {
this.customerId = customerId;
String labelText = lookup(CustomerService.class).asUiCustomer(customerId).getSimpleHtml();
recentCustomerLabel.setText("<html><div align=\"center\" width=\"120px\"><i>" + labelText + "</i></div></html>");
recentCustomerLabel.setToolTipText("<html>" + labelText + "</html>");
paymentMethodLabel.setText(paymentMethodLabel.getText() + " " + lookup(CustomerService.class).asCustomerMetaData(customerId).getPaymentMethod().getNote());
}
public Document getDocument() {
return document;
}
/**
* Refreshes the Areas contant if changes occur.
*/
public final void refreshAddressArea() {
addressesArea.setText("");
StyledDocument doc = addressesArea.getStyledDocument();
Style boldStyle = addressesArea.addStyle("bold", null);
StyleConstants.setBold(boldStyle, true);
try {
if ( document.getInvoiceAddress().getDescription().equals(document.getShippingAddress().getDescription()) ) {
doc.insertString(doc.getLength(), "Rechnungs und Lieferadresse:\n", boldStyle);
doc.insertString(doc.getLength(), document.getInvoiceAddress().getDescription(), null);
} else {
doc.insertString(doc.getLength(), "Rechnungsadresse:\n", boldStyle);
doc.insertString(doc.getLength(), document.getInvoiceAddress().getDescription(), null);
doc.insertString(doc.getLength(), "\n\nLieferadresse:\n", boldStyle);
doc.insertString(doc.getLength(), document.getShippingAddress().getDescription(), null);
}
} catch (BadLocationException ex) {
addressesArea.setText("Rechnungsadresse:\n"
+ document.getInvoiceAddress().getDescription()
+ "\n\nLieferAdresse:\n"
+ document.getShippingAddress().getDescription());
}
}
/**
* Cause the Position does not have any Bindable parameters, we use a workaround.
* <p>
* @param p the position to refresh
*/
public void refresh(Position p) {
int index = positions.indexOf(p);
int selectedIndex = positionsFxList.getSelectionModel().getSelectedIndex();
positions.remove(p);
positions.add(index, p);
positionsFxList.getSelectionModel().select(selectedIndex);
}
@Override
public boolean pre(CloseType type) {
if ( type == CloseType.CANCEL ) return true;
if ( controller == null ) return true;
if ( customerId == 0 ) {
JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(this), "Bitte Kunden wählen");
return false;
}
if ( document.getPositions().isEmpty() ) {
JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(this), "Ein Dokument muss mindestens eine Position enthalten.");
return false;
}
if ( document.getPositions(PositionType.SHIPPING_COST).size() > 1 ) {
JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(this), "Es sind mehr als eine Position des Types Versandkosten enthalten.");
return false;
}
if ( !ValidationUtil.isValidOrShow(SwingUtilities.getWindowAncestor(this), document) ) return false;
if ( accessCos != null ) {
for (Component component : this.getComponents()) {
accessCos.remove(component);
}
}
if ( Client.hasFound(ShippingCostService.class) ) return controller.optionalRecalcShippingCost();
else return true;
}
/** 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;
jLabel1 = new javax.swing.JLabel();
unitInputField = new javax.swing.JTextField();
addUnitButton = new javax.swing.JButton();
recentCustomerLabel = new javax.swing.JLabel();
addProductBatchButton = new javax.swing.JButton();
addServiceButton = new javax.swing.JButton();
jSeparator1 = new javax.swing.JSeparator();
moveUpButton = new javax.swing.JButton();
moveDownButton = new javax.swing.JButton();
removePositionButton = new javax.swing.JButton();
addCommentButton = new javax.swing.JButton();
jLabel3 = new javax.swing.JLabel();
shippingCostButton = new javax.swing.JButton();
paymentMethodLabel = new javax.swing.JLabel();
editInvoiceAddressButton = new javax.swing.JButton();
editShippingAddress = new javax.swing.JButton();
resetAddressesButton = new javax.swing.JButton();
jScrollPane3 = new javax.swing.JScrollPane();
addressesArea = new javax.swing.JTextPane();
jSeparator2 = new javax.swing.JSeparator();
positionPanelFx = new javax.swing.JPanel();
convertToWarrantyPositionButton = new javax.swing.JButton();
setPreferredSize(new java.awt.Dimension(800, 600));
setLayout(new java.awt.GridBagLayout());
jLabel1.setText("Aktueller Kunde:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START;
add(jLabel1, gridBagConstraints);
unitInputField.setToolTipText("<html>SopoNr. eingeben<br />-Enter für schnelle eingabe verwenden</html>");
unitInputField.setMinimumSize(new java.awt.Dimension(100, 25));
unitInputField.setPreferredSize(new java.awt.Dimension(100, 25));
unitInputField.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addUnitAction(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 6;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 0.3;
add(unitInputField, gridBagConstraints);
addUnitButton.setToolTipText("Sopo Gerät hinzufügen");
addUnitButton.setMaximumSize(new java.awt.Dimension(2147483647, 46));
addUnitButton.setMinimumSize(new java.awt.Dimension(40, 40));
addUnitButton.setPreferredSize(new java.awt.Dimension(40, 40));
addUnitButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addUnitAction(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 6;
gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END;
add(addUnitButton, gridBagConstraints);
recentCustomerLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
recentCustomerLabel.setText("Derzeit kein Kunde gewählt.");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START;
add(recentCustomerLabel, gridBagConstraints);
addProductBatchButton.setText("<html>Neuware<br>hinzufügen</html>");
addProductBatchButton.setMaximumSize(new java.awt.Dimension(120, 45));
addProductBatchButton.setMinimumSize(new java.awt.Dimension(120, 45));
addProductBatchButton.setPreferredSize(new java.awt.Dimension(120, 45));
addProductBatchButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addNonUnitPosition(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 7;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
add(addProductBatchButton, gridBagConstraints);
addServiceButton.setText("<html>Dienstleistung<br />Kleinteil, Gebühr");
addServiceButton.setRolloverEnabled(false);
addServiceButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addNonUnitPosition(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 8;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
add(addServiceButton, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(20, 0, 5, 0);
add(jSeparator1, gridBagConstraints);
moveUpButton.setToolTipText("Position hoch schieben");
moveUpButton.setMaximumSize(new java.awt.Dimension(40, 28));
moveUpButton.setMinimumSize(new java.awt.Dimension(40, 28));
moveUpButton.setPreferredSize(new java.awt.Dimension(40, 28));
moveUpButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
changePositionOrderAction(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 7;
gridBagConstraints.anchor = java.awt.GridBagConstraints.LAST_LINE_END;
add(moveUpButton, gridBagConstraints);
moveDownButton.setToolTipText("Position runter schieben");
moveDownButton.setMaximumSize(new java.awt.Dimension(40, 28));
moveDownButton.setMinimumSize(new java.awt.Dimension(40, 28));
moveDownButton.setPreferredSize(new java.awt.Dimension(40, 28));
moveDownButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
changePositionOrderAction(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 8;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_END;
add(moveDownButton, gridBagConstraints);
removePositionButton.setToolTipText("Position entfernen");
removePositionButton.setMaximumSize(new java.awt.Dimension(40, 40));
removePositionButton.setMinimumSize(new java.awt.Dimension(40, 40));
removePositionButton.setPreferredSize(new java.awt.Dimension(40, 40));
removePositionButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
removePositionAction(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 9;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
add(removePositionButton, gridBagConstraints);
addCommentButton.setText("Kommentar");
addCommentButton.setPreferredSize(new java.awt.Dimension(99, 42));
addCommentButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addNonUnitPosition(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 9;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
add(addCommentButton, gridBagConstraints);
jLabel3.setText("SopoNr:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 4;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START;
add(jLabel3, gridBagConstraints);
shippingCostButton.setText("Versandkosten");
shippingCostButton.setPreferredSize(new java.awt.Dimension(123, 42));
shippingCostButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addNonUnitPosition(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 10;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
add(shippingCostButton, gridBagConstraints);
paymentMethodLabel.setText("Zahlungsmodalität:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START;
add(paymentMethodLabel, gridBagConstraints);
editInvoiceAddressButton.setText("<html>Rechnungsadresse<br />bearbeiten</html>");
editInvoiceAddressButton.setToolTipText("");
editInvoiceAddressButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
editInvoiceAddressButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
editInvoiceAddressButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 12;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
add(editInvoiceAddressButton, gridBagConstraints);
editShippingAddress.setText("<html>Lieferungsadresse<br />bearbeiten</html>");
editShippingAddress.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
editShippingAddressActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 13;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
add(editShippingAddress, gridBagConstraints);
resetAddressesButton.setText("Adressen zurücksetzen");
resetAddressesButton.setPreferredSize(new java.awt.Dimension(180, 42));
resetAddressesButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
resetAddressesButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 14;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
add(resetAddressesButton, gridBagConstraints);
addressesArea.setEditable(false);
addressesArea.setPreferredSize(new java.awt.Dimension(12, 80));
jScrollPane3.setViewportView(addressesArea);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 15;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.1;
gridBagConstraints.weighty = 0.1;
add(jScrollPane3, gridBagConstraints);
jSeparator2.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 11;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(20, 0, 5, 0);
add(jSeparator2, gridBagConstraints);
positionPanelFx.setLayout(new java.awt.BorderLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridheight = 16;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 3.0;
add(positionPanelFx, gridBagConstraints);
convertToWarrantyPositionButton.setToolTipText("Garantie manuell erweitern");
convertToWarrantyPositionButton.setMaximumSize(new java.awt.Dimension(40, 40));
convertToWarrantyPositionButton.setMinimumSize(new java.awt.Dimension(40, 40));
convertToWarrantyPositionButton.setPreferredSize(new java.awt.Dimension(40, 40));
convertToWarrantyPositionButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
convertToWarrantyPositionButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 10;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
add(convertToWarrantyPositionButton, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
private void changePositionOrderAction(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_changePositionOrderAction
final MultipleSelectionModel<Position> selection = positionsFxList.getSelectionModel();
final int index = selection.getSelectedIndex();
Position selectedItem = selection.getSelectedItem();
if ( index < 0 ) return;
if ( evt.getSource() == moveUpButton ) {
if ( index == 0 ) return; // Don't move at the beginning
document.moveUp(selectedItem);
Platform.runLater(new Runnable() {
@Override
public void run() {
Position removed = positions.remove(index);
positions.add(index - 1, removed);
selection.select(index - 1);
}
});
} else {
if ( index == positions.size() - 1 ) return; // Don't move at the end
document.moveDown(selectedItem);
Platform.runLater(new Runnable() {
@Override
public void run() {
Position removed = positions.remove(index);
positions.add(index + 1, removed);
selection.select(index + 1);
}
});
}
}//GEN-LAST:event_changePositionOrderAction
private void addUnitAction(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addUnitAction
if ( unitInputField.getText().isEmpty() ) return;
if ( document.isClosed() ) {
JOptionPane.showMessageDialog(this, "Hinzufügen von Sopo Ware nicht erlaubt.", "Abgeschlossenes Dokument", JOptionPane.INFORMATION_MESSAGE);
return;
}
for (String sopo : unitInputField.getText().trim().split("(\\s*,\\s*|\\s+)")) {
if ( StringUtils.isBlank(sopo) ) continue;
try {
controller.addPosition(document.getDossier().getId(), PositionType.UNIT, sopo, false);
} catch (Exception ex) {
DwOssCore.show(SwingUtilities.getWindowAncestor(this), ex);
}
}
Platform.runLater(new Runnable() {
@Override
public void run() {
positions.clear();
positions.addAll(document.getPositions().values());
}
});
unitInputField.setText("");
}//GEN-LAST:event_addUnitAction
private void addNonUnitPosition(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addNonUnitPosition
PositionType type;
if ( ((JButton)evt.getSource()) == addProductBatchButton ) {
type = PositionType.PRODUCT_BATCH;
} else if ( ((JButton)evt.getSource()) == addServiceButton ) {
type = PositionType.SERVICE;
} else if ( ((JButton)evt.getSource()) == addCommentButton ) {
type = PositionType.COMMENT;
} else {
type = PositionType.SHIPPING_COST;
}
try {
controller.addPosition(document.getDossier().getId(), type, null, false);
Platform.runLater(() -> {
positions.clear();
positions.addAll(document.getPositions().values());
});
} catch (UserInfoException ex) {
DwOssCore.show(SwingUtilities.getWindowAncestor(this), ex);
}
}//GEN-LAST:event_addNonUnitPosition
private void removePositionAction(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removePositionAction
final MultipleSelectionModel<Position> selection = positionsFxList.getSelectionModel();
final int index = selection.getSelectedIndex();
Position selectedItem = selection.getSelectedItem();
if ( index == -1 ) return;
if ( isChangeAllowed() ) {
document.removeAt(selectedItem.getId());
Platform.runLater(() -> {
positions.clear();
positions.addAll(document.getPositions().values());
});
} else {
JOptionPane.showMessageDialog(this, "Änderungen am Dokument sind nicht erlaubt.");
}
}//GEN-LAST:event_removePositionAction
private void editInvoiceAddressButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editInvoiceAddressButtonActionPerformed
if ( controller == null ) return;
controller.editDocumentInvoiceAddress();
}//GEN-LAST:event_editInvoiceAddressButtonActionPerformed
private void editShippingAddressActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editShippingAddressActionPerformed
if ( controller == null ) return;
controller.editDocumentShippingAddress();
}//GEN-LAST:event_editShippingAddressActionPerformed
private void resetAddressesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_resetAddressesButtonActionPerformed
if ( customerId <= 0 ) return;
controller.resetAddressesToCustomerData();
}//GEN-LAST:event_resetAddressesButtonActionPerformed
private void convertToWarrantyPositionButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_convertToWarrantyPositionButtonActionPerformed
if ( !positionsFxList.getSelectionModel().isEmpty() ) {
Platform.runLater(() -> {
try {
//constructore makes sure the service is present
document.appendAll(
lookup(RedTapeHookService.class)
.addWarrantyForUnitPosition(positionsFxList.getSelectionModel().getSelectedItem(), document.getId())
.request(new SwingInteraction(this)));
positions.clear();
positions.addAll(document.getPositions().values());
} catch (UserInfoException ex) {
DwOssCore.show(null, ex);
}
});
}
}//GEN-LAST:event_convertToWarrantyPositionButtonActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addCommentButton;
private javax.swing.JButton addProductBatchButton;
private javax.swing.JButton addServiceButton;
private javax.swing.JButton addUnitButton;
private javax.swing.JTextPane addressesArea;
private javax.swing.JButton convertToWarrantyPositionButton;
private javax.swing.JButton editInvoiceAddressButton;
private javax.swing.JButton editShippingAddress;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel3;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JSeparator jSeparator2;
private javax.swing.JButton moveDownButton;
private javax.swing.JButton moveUpButton;
private javax.swing.JLabel paymentMethodLabel;
private javax.swing.JPanel positionPanelFx;
private javax.swing.JLabel recentCustomerLabel;
private javax.swing.JButton removePositionButton;
private javax.swing.JButton resetAddressesButton;
private javax.swing.JButton shippingCostButton;
private javax.swing.JTextField unitInputField;
// End of variables declaration//GEN-END:variables
private void disableComponents(Component... components) {
for (Component component : components) {
component.setEnabled(false);
}
}
private boolean isChangeAllowed() {
if ( positionsFxList.getSelectionModel().getSelectedItem().getType() != PositionType.COMMENT ) {
if ( document.isClosed() ) {
return false;
} else if ( document.getType() == DocumentType.INVOICE && !accessCos.hasRight(UPDATE_PRICE_INVOICES) ) {
return false;
} else if ( EnumSet.of(DocumentType.COMPLAINT, DocumentType.CREDIT_MEMO, DocumentType.ANNULATION_INVOICE).contains(document.getType()) ) {
return false;
}
}
return true;
}
}