blob: 79dc6d1a1069c0d83da81d867452d87eba211cce [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*******************************************************************************/
package org.ofbiz.pos.component;
import java.awt.Color;
import java.util.Locale;
import javax.swing.ListSelectionModel;
import net.xoetrope.swing.XScrollPane;
import net.xoetrope.swing.XTable;
import net.xoetrope.xui.XProject;
import net.xoetrope.xui.XProjectManager;
import net.xoetrope.xui.data.XModel;
import net.xoetrope.xui.style.XStyle;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilProperties;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.pos.PosTransaction;
import org.ofbiz.pos.screen.PosScreen;
public class Journal {
public static final String module = Journal.class.getName();
protected XProject currentProject = XProjectManager.getCurrentProject();
private static String[] field = { "sku", "desc", "qty", "price" };
private static String[] name = { "PosSku", "PosItem", "PosQty", "PosAmt" };
private static int[] width = { 100, 170, 50, 90};
private Locale defaultLocale = Locale.getDefault();
protected XScrollPane jpanel = null;
protected XTable jtable = null;
protected String style = null;
public Journal(PosScreen page) {
jpanel = (XScrollPane) page.findComponent("journal_panel");
jpanel.setVisible(false);
this.jtable = (XTable) page.findComponent("jtable");
// set the table as selectable
jtable.setInteractiveTable(true);
jtable.setFocusable(false);
jtable.setDragEnabled(false);
jtable.setColumnSelectionAllowed(false);
jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// set the styles
jtable.setBorderStyle("journalBorder");
jtable.setHeaderStyle("journalHeader");
jtable.setStyle("journalData");
jtable.setSelectedStyle("journalSelected");
// some settings needed for XUI 3.2rc2b update
jtable.setRowHeight(30); // Better to catch the line on a touch screen (minimal height I think)
XStyle style = currentProject.getStyleManager().getStyle("journalBorder");
Color borderColor = style.getStyleAsColor(XStyle.COLOR_FORE);
jtable.setGridColor(borderColor); // jtable.setBorderStyle("journalBorder"); above is not working anymore
style = currentProject.getStyleManager().getStyle("journalData");
Color backgoundColor = style.getStyleAsColor(XStyle.COLOR_BACK);
jtable.setBackground(backgoundColor); // TODO This line is not working
jpanel.setBorder(jtable.getBorder()); // TODO there is a small shift between the vertical header grid lines and the other vertical grid lines. This line is not working
// initialize the journal table header
XModel jmodel = createModel();
if (jmodel != null) {
this.appendEmpty(jmodel);
jtable.setModel(jmodel);
for (int i = 0; i < width.length; i++) {
if (defaultLocale.getLanguage().equals("ar")) {
jtable.setColWidth(width.length - i - 1, width[i]);
} else {
jtable.setColWidth(i, width[i]);
}
}
}
jtable.setSelectedRow(0);
}
public String getSelectedSku() {
XModel jmodel = jtable.getXModel();
XModel model = jmodel.get(jtable.getSelectedRow() + 1);
return model.getValueAsString("sku");
}
public String getSelectedIdx() {
XModel jmodel = jtable.getXModel();
XModel model = jmodel.get(jtable.getSelectedRow() + 1);
return model.getId();
}
public void selectNext() {
jtable.next();
}
public void selectPrevious() {
jtable.prev();
}
public void focus() {
if (jtable.isEnabled()) {
jtable.requestFocus();
}
}
public void setLock(boolean lock) {
jtable.setInteractiveTable(!lock);
jtable.setFocusable(!lock);
jtable.setVisible(!lock);
jtable.setEnabled(!lock);
this.jpanel.setVisible(!lock);
}
public synchronized void refresh(PosScreen pos) {
if (!jtable.isEnabled()) {
// no point in refreshing when we are locked;
// we will auto-refresh when unlocked
return;
}
PosTransaction tx = PosTransaction.getCurrentTx(pos.getSession());
XModel jmodel = this.createModel();
if (UtilValidate.isNotEmpty(tx)) {
tx.appendItemDataModel(jmodel);
this.appendEmpty(jmodel);
tx.appendTotalDataModel(jmodel);
if (tx.selectedPayments() > 0) {
this.appendEmpty(jmodel);
tx.appendPaymentDataModel(jmodel);
}
if (pos.getInput().isFunctionSet("PAID")) {
tx.appendChangeDataModel(jmodel);
}
} else {
this.appendEmpty(jmodel);
}
// make sure we are at the last item in the journal
jtable.setSelectedRow(0);
try {
jtable.update();
} catch (ArrayIndexOutOfBoundsException e) {
Debug.logError(e, "Unable to repaint the Journal", module);
}
//Debug.logInfo(getModelText(jmodel), module);
}
private XModel createModel() {
XModel jmodel = (XModel)currentProject.getModel().get("table/items");
// clear the list
jmodel.clear();
if (field.length == 0) {
return null;
}
jmodel.setTagName("table");
// create the header
XModel headerNode = appendNode(new JournalLineParams(jmodel, "th", "header", ""));
if (defaultLocale.getLanguage().equals("ar")) {
for (int i = field.length - 1; i >= 0; i--) {
appendNode(new JournalLineParams(headerNode, "td", field[i], UtilProperties.getMessage(PosTransaction.resource, name[i], defaultLocale)));
}
} else {
for (int i = 0 ; i < field.length; i++) {
appendNode(new JournalLineParams(headerNode, "td", field[i], UtilProperties.getMessage(PosTransaction.resource, name[i], defaultLocale)));
}
}
return jmodel;
}
private void appendEmpty(XModel jmodel) {
XModel headerNode = appendNode(new JournalLineParams(jmodel, "tr", "emptyrow", ""));
for (int i = 0 ; i < field.length; i++) {
appendNode(new JournalLineParams(headerNode, "td", field[i], ""));
}
}
public static XModel appendNode(JournalLineParams journalLineParams) {
XModel newNode = (XModel) journalLineParams.getNode().append(journalLineParams.getName());
newNode.setTagName(journalLineParams.getTag());
if (journalLineParams.getValue() != null) {
newNode.set(journalLineParams.getValue());
}
return newNode;
}
}