Dépôt officiel du code source de l'ERP OpenConcerto
/trunk/Modules/Module Subscription/src/org/openconcerto/modules/subscription/panel/BonCommandeAboPanel.java |
---|
50,7 → 50,7 |
@Override |
protected List<RowAction> getAdditionnalRowActions() { |
return new MouseSheetXmlListeListener(CommandeClientXmlSheet.class).getRowActions(); |
return new MouseSheetXmlListeListener(this.eltCmd, CommandeClientXmlSheet.class).getRowActions(); |
} |
} |
/trunk/Modules/Module Subscription/src/org/openconcerto/modules/subscription/panel/FacturesAboPanel.java |
---|
134,7 → 134,7 |
@Override |
protected List<RowAction> getAdditionnalRowActions() { |
return new MouseSheetXmlListeListener(VenteFactureXmlSheet.class).getRowActions(); |
return new MouseSheetXmlListeListener(this.eltFact, VenteFactureXmlSheet.class).getRowActions(); |
} |
} |
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/CustomerSupportTicketSQLElement.java |
---|
92,7 → 92,7 |
addHistoriqueAction.setPredicate(IListeEvent.createSelectionCountPredicate(0, Integer.MAX_VALUE)); |
getRowActions().add(addHistoriqueAction); |
MouseSheetXmlListeListener l = new MouseSheetXmlListeListener(CustomerSupportTicketSheetXML.class); |
MouseSheetXmlListeListener l = new MouseSheetXmlListeListener(this, CustomerSupportTicketSheetXML.class); |
getRowActions().addAll(l.getRowActions()); |
} |
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/CustomerSupportTicketSQLComponent.java |
---|
49,7 → 49,7 |
} |
SQLRowValues rowValsHisto = new SQLRowValues(getTable().getTable(Module.TABLE_CUSTOMER_SUPPORT_TICKET_HISTORY)); |
rowValsHisto.put("INFORMATION", "Ouverture du ticket"); |
rowValsHisto.put("DATE", row.getObject("DATE")); |
// rowValsHisto.put("DATE", row.getObject("DATE")); |
rowValsHisto.put("ID_USER_COMMON", row.getForeignID("ID_USER_COMMON")); |
rowValsHisto.put("ID_" + getTable().getName(), createEmptyUpdateRow); |
createEmptyUpdateRow.commit(); |
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/CustomerSupportTicketSheetXML.java |
---|
10,7 → 10,7 |
public class CustomerSupportTicketSheetXML extends AbstractSheetXMLWithDate { |
public static String TEMPLATE_ID = "CustomerSupportTicket"; |
public static String TEMPLATE_ID = "TicketSupport"; |
public static String TEMPLATE_PROPERTY_NAME = "LocationCmd"; |
// private static final Tuple2<String, String> tuple = Tuple2.create("LocationDmd", |
22,7 → 22,7 |
@Override |
public String getReference() { |
return this.row.getString("NUMERO"); |
return this.row.getString("NUMBER"); |
} |
// FIXME Prefs printer location |
/trunk/Modules/Module Customer Support/src/org/openconcerto/modules/customersupport/SuiviTicketPanel.java |
---|
179,6 → 179,12 |
Collections.sort(histoRowsOrder, new Comparator<SQLRowAccessor>() { |
@Override |
public int compare(SQLRowAccessor o1, SQLRowAccessor o2) { |
if (o1.getObject("DATE") == null) { |
return -1; |
} |
if (o2.getObject("DATE") == null) { |
return 1; |
} |
return o2.getDate("DATE").compareTo(o1.getDate("DATE")); |
} |
}); |
/trunk/Modules/Module Operation/src/org/openconcerto/modules/operation/ModuleOperation.java |
---|
34,6 → 34,7 |
import org.openconcerto.sql.utils.SQLCreateTable; |
import org.openconcerto.sql.view.list.IListe; |
import org.openconcerto.sql.view.list.RowAction; |
import org.openconcerto.sql.view.list.action.ListEvent; |
import org.openconcerto.ui.FrameUtil; |
import org.openconcerto.utils.i18n.TranslationManager; |
112,7 → 113,7 |
} |
}, true) { |
@Override |
public boolean enabledFor(IListeEvent evt) { |
public boolean enabledFor(List<SQLRowValues> values) { |
return true; |
} |
/trunk/Modules/Module Project/src/org/openconcerto/modules/project/Module.java |
---|
86,6 → 86,7 |
import org.openconcerto.sql.view.list.BaseSQLTableModelColumn; |
import org.openconcerto.sql.view.list.IListe; |
import org.openconcerto.sql.view.list.RowAction; |
import org.openconcerto.sql.view.list.action.ListEvent; |
import org.openconcerto.ui.DefaultGridBagConstraints; |
import org.openconcerto.ui.FrameUtil; |
import org.openconcerto.ui.PanelFrame; |
243,7 → 244,7 |
RowAction cloneAction = eltDevis.getCloneAction(); |
eltDevis.getRowActions().add(cloneAction); |
MouseSheetXmlListeListener mouseSheetXmlListeListener = new MouseSheetXmlListeListener(DevisXmlSheet.class); |
MouseSheetXmlListeListener mouseSheetXmlListeListener = new MouseSheetXmlListeListener(eltDevis, DevisXmlSheet.class); |
mouseSheetXmlListeListener.setGenerateHeader(true); |
mouseSheetXmlListeListener.setShowHeader(true); |
eltDevis.getRowActions().addAll(mouseSheetXmlListeListener.getRowActions()); |
313,9 → 314,9 |
}, false) { |
@Override |
public boolean enabledFor(IListeEvent evt) { |
if (evt.getSelectedRows().size() == 1) { |
SQLRowAccessor r = evt.getSelectedRow(); |
public boolean enabledFor(List<SQLRowValues> evt) { |
if (evt.size() == 1) { |
SQLRowAccessor r = evt.get(0); |
return !r.isForeignEmpty("ID_AFFAIRE"); |
} |
return false; |
357,9 → 358,9 |
}, false) { |
@Override |
public boolean enabledFor(IListeEvent evt) { |
if (evt.getSelectedRows().size() == 1) { |
SQLRowAccessor r = evt.getSelectedRow(); |
public boolean enabledFor(List<SQLRowValues> evt) { |
if (evt.size() == 1) { |
SQLRowAccessor r = evt.get(0); |
Collection<? extends SQLRowAccessor> l = r.getReferentRows(r.getTable().getTable("AFFAIRE")); |
return l.size() > 0; |
} |
/trunk/Modules/Module Batch Processing/src/org/openconcerto/modules/common/batchprocessing/NumberProcessor.java |
---|
13,9 → 13,14 |
import javax.swing.JRadioButton; |
import javax.swing.JTextField; |
import org.openconcerto.erp.core.finance.tax.model.TaxeCache; |
import org.openconcerto.erp.utils.ConvertDevise; |
import org.openconcerto.sql.model.SQLField; |
import org.openconcerto.sql.model.SQLRow; |
import org.openconcerto.sql.model.SQLRowAccessor; |
import org.openconcerto.sql.model.SQLRowValues; |
import org.openconcerto.sql.model.Where; |
import org.openconcerto.sql.request.UpdateBuilder; |
import org.openconcerto.ui.DefaultGridBagConstraints; |
public class NumberProcessor extends JPanel implements BatchProcessor { |
106,25 → 111,57 |
} |
@Override |
public void process(List<SQLRowValues> r) throws SQLException { |
public void process(List<SQLRowAccessor> r) throws SQLException { |
if (bReplace.isSelected()) { |
BigDecimal v = new BigDecimal(this.tReplace.getText().trim()); |
for (SQLRowAccessor sqlRowAccessor : r) { |
final SQLField fieldToMatch = batchfield.getFieldToMatch(); |
if (fieldToMatch != null) { |
if (batchfield.getForeignLinkRow() != null) { |
UpdateBuilder build = new UpdateBuilder(fieldToMatch.getTable()); |
build.setObject(batchfield.getField().getName(), (BigDecimal) decimalToFieldType(v)); |
build.setWhere( |
Where.inValues(fieldToMatch.getTable().getField("ID_" + r.get(0).getTable().getName()), SQLRow.getIDs(r)).and(new Where(fieldToMatch, "=", batchfield.getMatchingValue()))); |
fieldToMatch.getTable().getDBSystemRoot().getDataSource().execute(build.asString()); |
final List<SQLRow> referentRow = batchfield.getReferentRows(sqlRowAccessor); |
for (SQLRow sqlRowT : referentRow) { |
SQLRowValues rowValues = sqlRowT.createEmptyUpdateRow(); |
} else { |
for (SQLRowAccessor sqlRowAccessor : r) { |
if (batchfield.getForeignLinkRow() != null) { |
final List<SQLRow> referentRow = batchfield.getReferentRows(sqlRowAccessor); |
if (referentRow.isEmpty()) { |
SQLRowValues rowVals = new SQLRowValues(batchfield.getField().getTable()); |
rowVals.put("ID_" + sqlRowAccessor.getTable().getName(), sqlRowAccessor.getID()); |
rowVals.put("ID_" + batchfield.getForeignLinkRow().getTable().getName(), batchfield.getForeignLinkRow().getID()); |
rowVals.put(batchfield.getField().getName(), decimalToFieldType(v)); |
final BigDecimal taux = BigDecimal.valueOf(TaxeCache.getCache().getTauxFromId(sqlRowAccessor.getForeignID("ID_TAXE"))); |
final BigDecimal ht = (BigDecimal) decimalToFieldType(v); |
final BigDecimal ttc = ConvertDevise.getTtcFromHt(ht, taux, rowVals.getTable().getField("PV_TTC").getType().getDecimalDigits()); |
rowVals.put("PV_TTC", ttc); |
rowVals.put("PRIX_METRIQUE_VT_1", decimalToFieldType(v)); |
rowVals.commit(); |
} else { |
for (SQLRow sqlRowT : referentRow) { |
SQLRowValues rowValues = sqlRowT.createEmptyUpdateRow(); |
rowValues.put(batchfield.getField().getName(), decimalToFieldType(v)); |
if (!batchfield.getField().getName().equals("QTE_MIN") && !batchfield.getField().getName().equals("POURCENT_REMISE")) { |
// processBeforeUpdate(sqlRowT, rowValues); |
final BigDecimal taux = sqlRowT.isForeignEmpty("ID_TAXE") ? BigDecimal.valueOf(TaxeCache.getCache().getTauxFromId(sqlRowAccessor.getForeignID("ID_TAXE"))) |
: BigDecimal.valueOf(TaxeCache.getCache().getTauxFromId(sqlRowT.getForeignID("ID_TAXE"))); |
final BigDecimal ht = rowValues.getBigDecimal("PV_HT"); |
final BigDecimal ttc = ConvertDevise.getTtcFromHt(ht, taux, rowValues.getTable().getField("PV_TTC").getType().getDecimalDigits()); |
rowValues.put("PV_TTC", ttc); |
rowValues.put("PRIX_METRIQUE_VT_1", ht); |
} |
rowValues.update(); |
} |
} |
} else { |
final SQLRowValues rowValues = sqlRowAccessor.createEmptyUpdateRow(); |
rowValues.put(batchfield.getField().getName(), decimalToFieldType(v)); |
processBeforeUpdate(sqlRowT, rowValues); |
processBeforeUpdate(sqlRowAccessor, rowValues); |
rowValues.update(); |
} |
} else { |
final SQLRowValues rowValues = sqlRowAccessor.createEmptyUpdateRow(); |
rowValues.put(batchfield.getField().getName(), decimalToFieldType(v)); |
processBeforeUpdate(sqlRowAccessor, rowValues); |
rowValues.update(); |
} |
} |
} else if (bAdd.isSelected()) { |
/trunk/Modules/Module Batch Processing/src/org/openconcerto/modules/common/batchprocessing/ReferenceProcessor.java |
---|
41,7 → 41,7 |
} |
@Override |
public void process(List<SQLRowValues> r) throws SQLException { |
public void process(List<SQLRowAccessor> r) throws SQLException { |
for (SQLRowAccessor sqlRowAccessor : r) { |
final SQLRowValues rowValues = sqlRowAccessor.createEmptyUpdateRow(); |
/trunk/Modules/Module Batch Processing/src/org/openconcerto/modules/common/batchprocessing/ForbiddenFieldName.java |
---|
4,6 → 4,6 |
public static boolean isAllowed(String field) { |
String f = field.toUpperCase(); |
return !(f.equals("ARCHIVE") || f.equals("ORDRE") || f.equals("ID_USER_CREATE") || f.equals("ID_USER_COMMON_CREATE") || f.equals("ID_USER_MODIFY") || f.equals("ID_USER_COMMON_MODIFY") |
|| f.equals("MODIFICATION_DATE") || f.equals("CREATION_DATE")); |
|| f.equals("MODIFICATION_DATE") || f.equals("CREATION_DATE")|| f.equals("QTE_MIN")); |
} |
} |
/trunk/Modules/Module Batch Processing/src/org/openconcerto/modules/common/batchprocessing/StringProcessor.java |
---|
134,7 → 134,7 |
} |
@Override |
public void process(List<SQLRowValues> r) throws SQLException { |
public void process(List<SQLRowAccessor> r) throws SQLException { |
if (bReplace.isSelected()) { |
final String t = ensureSize(tReplace.getText()); |
for (SQLRowAccessor sqlRowAccessor : r) { |
/trunk/Modules/Module Batch Processing/src/org/openconcerto/modules/common/batchprocessing/BatchEditorPanel.java |
---|
8,9 → 8,11 |
import java.awt.event.ActionListener; |
import java.awt.event.ItemEvent; |
import java.awt.event.ItemListener; |
import java.math.BigDecimal; |
import java.util.ArrayList; |
import java.util.Collections; |
import java.util.Comparator; |
import java.util.HashSet; |
import java.util.List; |
import java.util.Set; |
27,10 → 29,11 |
import org.openconcerto.sql.element.SQLElementDirectory; |
import org.openconcerto.sql.model.SQLField; |
import org.openconcerto.sql.model.SQLRow; |
import org.openconcerto.sql.model.SQLRowAccessor; |
import org.openconcerto.sql.model.SQLRowListRSH; |
import org.openconcerto.sql.model.SQLRowValues; |
import org.openconcerto.sql.model.SQLSelect; |
import org.openconcerto.sql.model.SQLTable; |
import org.openconcerto.sql.model.Where; |
import org.openconcerto.sql.request.SQLFieldTranslator; |
import org.openconcerto.ui.DefaultGridBagConstraints; |
import org.openconcerto.ui.JLabelBold; |
39,7 → 42,7 |
public class BatchEditorPanel extends JPanel { |
public BatchEditorPanel(final SQLElementDirectory dir, final List<SQLRowValues> rows, FieldFilter filter) { |
public BatchEditorPanel(final SQLElementDirectory dir, final List<SQLRowAccessor> rows, FieldFilter filter) { |
SQLFieldTranslator translator = dir.getTranslator(); |
Set<SQLField> fields = rows.get(0).getTable().getFields(); |
List<BatchField> f = new ArrayList<BatchField>(); |
50,6 → 53,8 |
} |
} |
} |
// Tarif |
SQLTable tableTarif = rows.get(0).getTable().getTable("TARIF"); |
SQLTable tableArticleTarif = rows.get(0).getTable().getTable("ARTICLE_TARIF"); |
SQLSelect sel = new SQLSelect(); |
62,6 → 67,47 |
} |
} |
// Tarif Promo |
SQLTable tableTarifPromo = rows.get(0).getTable().getTable("TARIF_PROMOTION"); |
SQLTable tableArticleTarifPromo = rows.get(0).getTable().getTable("ARTICLE_TARIF_PROMOTION"); |
SQLSelect selT = new SQLSelect(); |
selT.addSelectStar(tableTarifPromo); |
List<SQLRow> rowTarifP = SQLRowListRSH.execute(selT); |
for (SQLRow sqlRow : rowTarifP) { |
f.add(new BatchField(dir, tableArticleTarifPromo.getField("PV_HT"), sqlRow)); |
} |
// Tarif quantite |
SQLTable tableTarifQte = rows.get(0).getTable().getTable("TARIF_QUANTITE"); |
SQLSelect selQ = new SQLSelect(); |
selQ.addSelectStar(tableTarifQte); |
Where w = Where.inValues(tableTarifQte.getField("ID_" + rows.get(0).getTable().getName()), SQLRow.getIDs(rows)); |
selQ.setWhere(w); |
List<SQLRow> rowTarifQ = SQLRowListRSH.execute(selQ); |
Set<BigDecimal> qtes = new HashSet<>(); |
for (SQLRow sqlRow : rowTarifQ) { |
final BigDecimal qte = sqlRow.getBigDecimal("QUANTITE"); |
if (!qtes.contains(qte)) { |
qtes.add(qte); |
final BatchField batchFieldQte = new BatchField(dir, sqlRow.getTable().getField("PRIX_METRIQUE_VT_1"), null); |
batchFieldQte.setDefaultMatchingValue(sqlRow.getTable().getField("QUANTITE"), qte); |
f.add(batchFieldQte); |
final BatchField batchFieldRemise = new BatchField(dir, sqlRow.getTable().getField("POURCENT_REMISE"), null); |
batchFieldRemise.setDefaultMatchingValue(sqlRow.getTable().getField("QUANTITE"), qte); |
f.add(batchFieldRemise); |
} |
} |
// Stock |
SQLTable tableDepotStock = rows.get(0).getTable().getTable("DEPOT_STOCK"); |
SQLTable tableStock = tableDepotStock.getTable("STOCK"); |
SQLSelect selDepot = new SQLSelect(); |
selDepot.addSelectStar(tableDepotStock); |
List<SQLRow> rowDepot = SQLRowListRSH.execute(selDepot); |
for (SQLRow sqlRow : rowDepot) { |
f.add(new BatchField(dir, tableStock.getField("QTE_MIN"), sqlRow)); |
} |
Collections.sort(f, new Comparator<BatchField>() { |
@Override |
/trunk/Modules/Module Batch Processing/src/org/openconcerto/modules/common/batchprocessing/DateProcessor.java |
---|
26,7 → 26,7 |
} |
@Override |
public void process(List<SQLRowValues> r) throws SQLException { |
public void process(List<SQLRowAccessor> r) throws SQLException { |
final Date date = d.getDate(); |
for (SQLRowAccessor sqlRowAccessor : r) { |
final SQLRowValues rowValues = sqlRowAccessor.createEmptyUpdateRow(); |
/trunk/Modules/Module Batch Processing/src/org/openconcerto/modules/common/batchprocessing/BooleanProcessor.java |
---|
37,7 → 37,7 |
} |
@Override |
public void process(List<SQLRowValues> r) throws SQLException { |
public void process(List<SQLRowAccessor> r) throws SQLException { |
if (bTrue.isSelected()) { |
for (SQLRowAccessor sqlRowAccessor : r) { |
final SQLRowValues rowValues = sqlRowAccessor.createEmptyUpdateRow(); |
/trunk/Modules/Module Batch Processing/src/org/openconcerto/modules/common/batchprocessing/BatchProcessor.java |
---|
10,7 → 10,7 |
boolean checkParameters(); |
void process(List<SQLRowValues> r) throws SQLException; |
void process(List<SQLRowAccessor> r) throws SQLException; |
void processBeforeUpdate(SQLRowAccessor from, SQLRowValues to); |
/trunk/Modules/Module Batch Processing/src/org/openconcerto/modules/common/batchprocessing/BatchField.java |
---|
18,9 → 18,11 |
private final SQLRowAccessor foreignLinkRow; |
private final SQLFieldTranslator translator; |
private final SQLElement elementLink; |
private final SQLElementDirectory dir; |
public BatchField(SQLElementDirectory dir, SQLField field, SQLRowAccessor foreignLinkRow) { |
this.field = field; |
this.dir = dir; |
this.foreignLinkRow = foreignLinkRow; |
this.translator = dir.getTranslator(); |
31,6 → 33,14 |
} |
} |
private SQLField fieldToMatch; |
private Object matchingValue; |
public void setDefaultMatchingValue(SQLField fieldToMatch, Object value) { |
this.fieldToMatch = fieldToMatch; |
this.matchingValue = value; |
} |
public SQLField getField() { |
return field; |
} |
38,9 → 48,19 |
public SQLRowAccessor getForeignLinkRow() { |
return foreignLinkRow; |
} |
public SQLField getFieldToMatch() { |
return fieldToMatch; |
} |
public Object getMatchingValue() { |
return matchingValue; |
} |
public String getComboName() { |
if (this.foreignLinkRow == null) { |
if (this.fieldToMatch != null) { |
return this.dir.getElement(this.fieldToMatch.getTable()).getPluralName() + " " + this.translator.getLabelFor(this.field) + " " + this.matchingValue; |
} else if (this.foreignLinkRow == null) { |
return this.translator.getLabelFor(this.field); |
} else { |
return this.elementLink.getPluralName() + " " + this.foreignLinkRow.getString("NOM") + " " + this.translator.getLabelFor(this.field); |
/trunk/Modules/Module Batch Processing/src/org/openconcerto/modules/common/batchprocessing/Module.java |
---|
13,6 → 13,7 |
import org.openconcerto.erp.modules.ModuleFactory; |
import org.openconcerto.sql.element.SQLElement; |
import org.openconcerto.sql.model.SQLField; |
import org.openconcerto.sql.model.SQLRowAccessor; |
import org.openconcerto.sql.model.SQLRowValues; |
import org.openconcerto.sql.view.list.IListe; |
import org.openconcerto.sql.view.list.IListeAction.IListeEvent; |
21,58 → 22,60 |
public final class Module extends AbstractModule { |
public Module(ModuleFactory f) throws IOException { |
super(f); |
} |
public Module(ModuleFactory f) throws IOException { |
super(f); |
} |
@Override |
protected void setupComponents(final ComponentsContext ctxt) { |
@Override |
protected void setupComponents(final ComponentsContext ctxt) { |
super.setupComponents(ctxt); |
final SQLElement element = ctxt.getElement("ARTICLE"); |
final RowAction.PredicateRowAction editAction = new RowAction.PredicateRowAction(new AbstractAction("Traitement par lot...") { |
super.setupComponents(ctxt); |
final SQLElement element = ctxt.getElement("ARTICLE"); |
final RowAction.PredicateRowAction editAction = new RowAction.PredicateRowAction( |
new AbstractAction("Traitement par lot...") { |
@Override |
public void actionPerformed(ActionEvent e) { |
final List<SQLRowValues> rows = IListe.get(e).getSelectedRows(); |
final int size = rows.size(); |
if (size > 0) { |
final JFrame f = new JFrame(); |
if (size > 1) { |
f.setTitle("Traitement des " + size + " " + element.getPluralName()); |
} else { |
f.setTitle("Traitement d'" + element.getSingularName()); |
} |
FieldFilter filter = new FieldFilter() { |
@Override |
public void actionPerformed(ActionEvent e) { |
final List<SQLRowAccessor> rows = IListe.get(e).getSelectedRowAccessors(); |
final int size = rows.size(); |
if (size > 0) { |
final JFrame f = new JFrame(); |
if (size > 1) { |
f.setTitle("Traitement des " + size + " " + element.getPluralName()); |
} else { |
f.setTitle("Traitement d'" + element.getSingularName()); |
} |
FieldFilter filter = new FieldFilter() { |
@Override |
public boolean isFiltered(SQLField f) { |
final String fieldName = f.getName(); |
return fieldName.contains("METRIQUE") || fieldName.equals("ID_STOCK"); |
} |
@Override |
public boolean isFiltered(SQLField f) { |
final String fieldName = f.getName(); |
return fieldName.contains("METRIQUE") || fieldName.equals("ID_STOCK"); |
} |
}; |
}; |
f.setContentPane(new BatchEditorPanel(ctxt.getElement("ARTICLE").getDirectory(), rows, filter)); |
f.pack(); |
f.setMinimumSize(new Dimension(400, 300)); |
f.setLocationRelativeTo(IListe.get(e)); |
FrameUtil.show(f); |
} |
} |
}, false) { |
}; |
editAction.setPredicate(IListeEvent.getNonEmptySelectionPredicate()); |
element.getRowActions().add(editAction); |
f.setContentPane( |
new BatchEditorPanel(ctxt.getElement("ARTICLE").getDirectory(), rows, filter)); |
f.pack(); |
f.setMinimumSize(new Dimension(400, 300)); |
f.setLocationRelativeTo(IListe.get(e)); |
FrameUtil.show(f); |
} |
} |
}, false) { |
}; |
editAction.setPredicate(IListeEvent.getNonEmptySelectionPredicate()); |
element.getRowActions().add(editAction); |
} |
} |
@Override |
protected void start() { |
} |
@Override |
protected void start() { |
} |
@Override |
protected void stop() { |
} |
@Override |
protected void stop() { |
} |
} |
/trunk/Modules/Module Label/src/org/openconcerto/modules/label/ImagePrintable.java |
---|
New file |
0,0 → 1,46 |
package org.openconcerto.modules.label; |
import java.awt.Graphics; |
import java.awt.image.BufferedImage; |
import java.awt.print.PageFormat; |
import java.awt.print.Printable; |
import java.awt.print.PrinterException; |
import java.awt.print.PrinterJob; |
public class ImagePrintable implements Printable { |
private double x, y, width; |
private int orientation; |
private BufferedImage image; |
public ImagePrintable(PrinterJob printJob, BufferedImage image) { |
PageFormat pageFormat = printJob.defaultPage(); |
this.x = pageFormat.getImageableX(); |
this.y = pageFormat.getImageableY(); |
this.width = pageFormat.getImageableWidth(); |
this.orientation = pageFormat.getOrientation(); |
this.image = image; |
} |
@Override |
public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws PrinterException { |
if (pageIndex == 0) { |
int pWidth = 0; |
int pHeight = 0; |
if (orientation == PageFormat.PORTRAIT) { |
pWidth = (int) Math.min(width, (double) image.getWidth()); |
pHeight = pWidth * image.getHeight() / image.getWidth(); |
} else { |
pHeight = (int) Math.min(width, (double) image.getHeight()); |
pWidth = pHeight * image.getWidth() / image.getHeight(); |
} |
g.drawImage(image, (int) x, (int) y, pWidth, pHeight, null); |
return PAGE_EXISTS; |
} else { |
return NO_SUCH_PAGE; |
} |
} |
} |
/trunk/Modules/Module Label/src/org/openconcerto/modules/label/ModuleLabel.java |
---|
8,8 → 8,10 |
import java.io.IOException; |
import java.nio.charset.StandardCharsets; |
import java.util.ArrayList; |
import java.util.HashMap; |
import java.util.LinkedHashMap; |
import java.util.List; |
import java.util.Map; |
import java.util.Map.Entry; |
import java.util.TreeMap; |
21,6 → 23,7 |
import org.openconcerto.erp.modules.AbstractModule; |
import org.openconcerto.erp.modules.ComponentsContext; |
import org.openconcerto.erp.modules.ModuleFactory; |
import org.openconcerto.sql.model.SQLField; |
import org.openconcerto.sql.model.SQLRow; |
import org.openconcerto.sql.model.SQLRowAccessor; |
import org.openconcerto.sql.model.SQLRowValues; |
37,6 → 40,8 |
public final class ModuleLabel extends AbstractModule { |
final LinkedHashMap<String, String> zplTemplates = new LinkedHashMap<String, String>(); |
final LinkedHashMap<String, String> gplTemplates = new LinkedHashMap<String, String>(); |
private Map<String, File> dirMap = new HashMap<>(); |
public ModuleLabel(ModuleFactory f) throws IOException { |
super(f); |
54,7 → 59,7 |
public void actionPerformed(ActionEvent arg0) { |
final IListe list = IListe.get(arg0); |
final List<Integer> selectedIDs = list.getSelection().getSelectedIDs(); |
final SQLTable tArticle = list.getSelectedRows().get(0).getTable(); |
final SQLTable tArticle = list.getSelectedRowAccessors().get(0).getTable(); |
final SwingWorker<List<RowValuesLabel>, String> wworker = new SwingWorker<List<RowValuesLabel>, String>() { |
@Override |
214,12 → 219,68 |
final JFrame f = new JFrame(); |
final IListe list = IListe.get(arg0); |
final int idProduct = list.getSelection().getSelectedID(); |
final SQLTable tArticle = list.getSelectedRows().get(0).getTable(); |
final SQLTable tArticle = list.getSelectedRowAccessors().get(0).getTable(); |
final SwingWorker<SQLRowValues, String> wworker = new SwingWorker<SQLRowValues, String>() { |
@Override |
protected SQLRowValues doInBackground() throws Exception { |
SQLRowValues rArticle = new SQLRowValues(tArticle); |
rArticle.putNulls(tArticle.getFieldsName()); |
for (SQLField f : tArticle.getFields()) { |
if (f.getName().startsWith("ID_ARTICLE_DECLINAISON_")) { |
SQLRowValues rowValsDecl = rArticle.putRowValues(f.getName()); |
rowValsDecl.putNulls(f.getForeignTable().getFieldsName()); |
} |
} |
final List<SQLRowValues> fetchRow = SQLRowValuesListFetcher.create(rArticle).fetch(new Where(tArticle.getKey(), "=", idProduct)); |
return fetchRow.get(0); |
} |
@Override |
protected void done() { |
try { |
final SQLRowValues values = get(); |
p.initUI(values); |
f.setTitle(entry.getKey()); |
f.setContentPane(p); |
f.pack(); |
f.setLocationRelativeTo(null); |
f.setVisible(true); |
} catch (Exception e) { |
ExceptionHandler.handle("Erreur d'impression", e); |
} |
} |
}; |
wworker.execute(); |
} |
}, true, false); |
action.setPredicate(IListeEvent.createSelectionCountPredicate(1, 1)); |
ctxt.getElement("ARTICLE").getRowActions().add(action); |
} |
} |
if (!gplTemplates.isEmpty()) { |
for (final Entry<String, String> entry : gplTemplates.entrySet()) { |
final String gpl = entry.getValue(); |
final PredicateRowAction action = new PredicateRowAction(new AbstractAction("Imprimer l'étiquette " + entry.getKey()) { |
@Override |
public void actionPerformed(ActionEvent arg0) { |
final GPLPrinterPanel p = new GPLPrinterPanel(gpl, getDir(entry.getKey())); |
final JFrame f = new JFrame(); |
final IListe list = IListe.get(arg0); |
final int idProduct = list.getSelection().getSelectedID(); |
final SQLTable tArticle = list.getSelectedRowAccessors().get(0).getTable(); |
final SwingWorker<SQLRowValues, String> wworker = new SwingWorker<SQLRowValues, String>() { |
@Override |
protected SQLRowValues doInBackground() throws Exception { |
final SQLRow row = tArticle.getRow(idProduct); |
row.fetchValues(); |
return row.asRowValues(); |
253,6 → 314,10 |
} |
protected File getDir(String value) { |
return dirMap.get(value); |
} |
@Override |
protected void start() { |
264,23 → 329,44 |
System.err.println("ModuleLabel.readTemplates() " + templatesDir.getAbsolutePath()); |
File[] files = templatesDir.listFiles(); |
if (files != null) { |
LinkedHashMap<String, String> map = new LinkedHashMap<>(); |
LinkedHashMap<String, String> zmap = new LinkedHashMap<>(); |
LinkedHashMap<String, String> gmap = new LinkedHashMap<>(); |
for (File f : files) { |
if (f.getName().endsWith(".zpl")) { |
try { |
String zpl = FileUtils.read(f, StandardCharsets.UTF_8); |
String name = f.getName().substring(0, f.getName().length() - 4).trim(); |
map.put(name, zpl); |
zmap.put(name, zpl); |
dirMap.put(name, templatesDir); |
System.err.println("ModuleLabel.readTemplates() add " + name); |
} catch (Exception e) { |
System.err.println(this.getClass().getCanonicalName() + "start() cannot read zpl template : " + f.getAbsolutePath() + " : " + e.getMessage()); |
} |
} else if (f.getName().endsWith(".graphicspl")) { |
try { |
String zpl = FileUtils.read(f, StandardCharsets.UTF_8); |
String name = f.getName().substring(0, f.getName().length() - ".graphicspl".length()).trim(); |
gmap.put(name, zpl); |
dirMap.put(name, templatesDir); |
} catch (Exception e) { |
System.err.println(this.getClass().getCanonicalName() + "start() cannot read graphicspl template : " + f.getAbsolutePath() + " : " + e.getMessage()); |
} |
} |
} |
// Tri de la map par clef |
final TreeMap<String, String> copy = new TreeMap<>(map); |
this.zplTemplates.clear(); |
this.zplTemplates.putAll(copy); |
final TreeMap<String, String> copy1 = new TreeMap<>(zmap); |
zplTemplates.clear(); |
zplTemplates.putAll(copy1); |
final TreeMap<String, String> copy2 = new TreeMap<>(gmap); |
gplTemplates.clear(); |
gplTemplates.putAll(copy2); |
} |
} else { |
/trunk/Modules/Module Label/src/org/openconcerto/modules/label/ZPLPrinterPanel.java |
---|
13,6 → 13,7 |
import java.io.FileOutputStream; |
import java.io.IOException; |
import java.io.StringReader; |
import java.math.BigDecimal; |
import java.net.Socket; |
import java.nio.charset.StandardCharsets; |
import java.text.DecimalFormat; |
89,25 → 90,26 |
public ZPLPrinterPanel(String zpl) { |
this.zpl = zpl; |
this.variables = getVariables(zpl); |
knownVariables.add("product.code"); |
knownVariables.add("product.name"); |
knownVariables.add("product.material"); |
knownVariables.add("product.ean13"); |
knownVariables.add("product.price"); |
knownVariables.add("product.pricewithtax"); |
this.knownVariables.add("product.code"); |
this.knownVariables.add("product.name"); |
this.knownVariables.add("product.material"); |
this.knownVariables.add("product.color"); |
this.knownVariables.add("product.size"); |
this.knownVariables.add("product.ean13"); |
this.knownVariables.add("product.price"); |
this.knownVariables.add("product.pricewithtax"); |
// |
mapName.put("product.name", "Nom"); |
mapName.put("product.code", "Code"); |
mapName.put("product.ean13", "Code à barres"); |
mapName.put("product.price", "Prix HT"); |
mapName.put("product.pricewithtax", "Prix TTC"); |
mapName.put("product.treatment", "Traitement"); |
mapName.put("product.origin", "Origine"); |
mapName.put("product.batch", "Lot"); |
mapName.put("product.size", "Taille"); |
mapName.put("product.color", "Couleur"); |
mapName.put("product.material", "Matière"); |
this.mapName.put("product.name", "Nom"); |
this.mapName.put("product.code", "Code"); |
this.mapName.put("product.ean13", "Code à barres"); |
this.mapName.put("product.price", "Prix HT"); |
this.mapName.put("product.pricewithtax", "Prix TTC"); |
this.mapName.put("product.treatment", "Traitement"); |
this.mapName.put("product.origin", "Origine"); |
this.mapName.put("product.batch", "Lot"); |
this.mapName.put("product.size", "Taille"); |
this.mapName.put("product.color", "Couleur"); |
this.mapName.put("product.material", "Matière"); |
} |
private final File getPrefFile() { |
128,7 → 130,7 |
System.out.println(file.getAbsolutePath()); |
if (file.exists()) { |
try { |
properties.load(new FileInputStream(file)); |
this.properties.load(new FileInputStream(file)); |
} catch (IOException e) { |
e.printStackTrace(); |
} |
143,7 → 145,7 |
Set<String> added = new HashSet<>(); |
for (String v : this.knownVariables) { |
if (variables.contains(v)) { |
if (this.variables.contains(v)) { |
// Non editable |
String label = getName(v); |
c.gridx = 0; |
158,7 → 160,7 |
txt.setText(value); |
txt.setEditable(false); |
} |
editorMap.put(v, txt); |
this.editorMap.put(v, txt); |
this.add(txt, c); |
added.add(v); |
c.gridy++; |
174,7 → 176,7 |
c.gridx++; |
c.weightx = 1; |
JTextField txt = new JTextField(20); |
editorMap.put(v, txt); |
this.editorMap.put(v, txt); |
this.add(txt, c); |
added.add(v); |
c.gridy++; |
233,15 → 235,15 |
c.anchor = GridBagConstraints.SOUTHEAST; |
// Restore state from properties |
if (properties.getOrDefault("printerType", "local").equals("local")) { |
if (this.properties.getOrDefault("printerType", "local").equals("local")) { |
radioLocalPrinter.setSelected(true); |
} else { |
radioNetworkPrinter.setSelected(true); |
} |
textPrinterIP.setText(properties.getOrDefault("printerIp", "").toString()); |
portZPL.setValue(Long.parseLong(properties.getOrDefault("printerPort", "9100").toString())); |
nbLabels.setValue(Long.parseLong(properties.getOrDefault("nbLabels", "1").toString())); |
delayLabels.setValue(Long.parseLong(properties.getOrDefault("delay", "800").toString())); |
textPrinterIP.setText(this.properties.getOrDefault("printerIp", "").toString()); |
portZPL.setValue(Long.parseLong(this.properties.getOrDefault("printerPort", "9100").toString())); |
nbLabels.setValue(Long.parseLong(this.properties.getOrDefault("nbLabels", "1").toString())); |
delayLabels.setValue(Long.parseLong(this.properties.getOrDefault("delay", "800").toString())); |
JButton printButton = new JButton("Imprimer"); |
252,16 → 254,16 |
public void actionPerformed(ActionEvent e) { |
try { |
if (radioLocalPrinter.isSelected()) { |
properties.put("printerType", "local"); |
ZPLPrinterPanel.this.properties.put("printerType", "local"); |
} else { |
properties.put("printerType", "network"); |
properties.put("printerIp", textPrinterIP.getText()); |
properties.put("printerPort", portZPL.getValue().toString()); |
ZPLPrinterPanel.this.properties.put("printerType", "network"); |
ZPLPrinterPanel.this.properties.put("printerIp", textPrinterIP.getText()); |
ZPLPrinterPanel.this.properties.put("printerPort", portZPL.getValue().toString()); |
} |
properties.put("nbLabels", nbLabels.getValue().toString()); |
properties.put("delay", delayLabels.getValue().toString()); |
ZPLPrinterPanel.this.properties.put("nbLabels", nbLabels.getValue().toString()); |
ZPLPrinterPanel.this.properties.put("delay", delayLabels.getValue().toString()); |
// Save Prefs |
properties.store(new FileOutputStream(getPrefFile()), ""); |
ZPLPrinterPanel.this.properties.store(new FileOutputStream(getPrefFile()), ""); |
} catch (Exception e1) { |
ExceptionHandler.handle("Erreur de sauvegarde de " + getPrefFile().getAbsolutePath(), e1); |
} |
296,10 → 298,10 |
final PrinterJob pj1 = PrinterJob.getPrinterJob(); |
if (pj1.printDialog()) { |
final PrintService ps = pj1.getPrintService(); |
final DocPrintJob pj = ps.createPrintJob(); |
final SimpleDoc doc = new SimpleDoc(data, DocFlavor.BYTE_ARRAY.AUTOSENSE, null); |
final int nb = ((Number) nbLabels.getValue()).intValue(); |
for (int i = 0; i < nb; i++) { |
final DocPrintJob pj = ps.createPrintJob(); |
final SimpleDoc doc = new SimpleDoc(data, DocFlavor.BYTE_ARRAY.AUTOSENSE, null); |
pj.print(doc, null); |
Thread.sleep(((Number) delayLabels.getValue()).intValue()); |
} |
357,6 → 359,7 |
if (row == null) { |
return null; |
} |
System.err.println("ZPLPrinterPanel.getValueAsString()" + variableName + " : " + row); |
if (variableName.equals("product.code")) { |
return row.getString("CODE"); |
} else if (variableName.equals("product.name")) { |
364,17 → 367,31 |
} else if (variableName.equals("product.ean13")) { |
return row.getString("CODE_BARRE"); |
} else if (variableName.equals("product.price")) { |
return new DecimalFormat("#0.00").format(row.getBigDecimal("PV_HT")); |
final BigDecimal bigDecimal = row.getBigDecimal("PV_HT"); |
return new DecimalFormat("#0.00").format(bigDecimal); |
} else if (variableName.equals("product.pricewithtax")) { |
return new DecimalFormat("#0.00").format(row.getBigDecimal("PV_TTC")); |
final BigDecimal bigDecimal = row.getBigDecimal("PV_TTC"); |
return new DecimalFormat("#0.00").format(bigDecimal); |
} else if (variableName.equals("product.material")) { |
return row.getString("MATIERE"); |
} else if (variableName.equals("product.color")) { |
if (row.getTable().contains("ID_ARTICLE_DECLINAISON_COULEUR")) { |
if (row.getObject("ID_ARTICLE_DECLINAISON_COULEUR") != null && !row.isForeignEmpty("ID_ARTICLE_DECLINAISON_COULEUR")) { |
return row.getForeign("ID_ARTICLE_DECLINAISON_COULEUR").getString("NOM"); |
} |
} |
} else if (variableName.equals("product.size")) { |
if (row.getTable().contains("ID_ARTICLE_DECLINAISON_TAILLE")) { |
if (row.getObject("ID_ARTICLE_DECLINAISON_TAILLE") != null && !row.isForeignEmpty("ID_ARTICLE_DECLINAISON_TAILLE")) { |
return row.getForeign("ID_ARTICLE_DECLINAISON_TAILLE").getString("NOM"); |
} |
} |
} |
return ""; |
} |
public String getName(String variableName) { |
String n = mapName.get(variableName); |
String n = this.mapName.get(variableName); |
if (n == null) { |
return variableName; |
} |
/trunk/Modules/Module Label/src/org/openconcerto/modules/label/GPLPrinterPanel.java |
---|
New file |
0,0 → 1,454 |
package org.openconcerto.modules.label; |
import java.awt.Desktop; |
import java.awt.FlowLayout; |
import java.awt.GridBagConstraints; |
import java.awt.GridBagLayout; |
import java.awt.event.ActionEvent; |
import java.awt.event.ActionListener; |
import java.awt.image.BufferedImage; |
import java.awt.print.PrinterJob; |
import java.io.BufferedReader; |
import java.io.DataOutputStream; |
import java.io.File; |
import java.io.FileInputStream; |
import java.io.FileOutputStream; |
import java.io.IOException; |
import java.io.StringReader; |
import java.net.Socket; |
import java.nio.charset.StandardCharsets; |
import java.text.DecimalFormat; |
import java.util.ArrayList; |
import java.util.HashMap; |
import java.util.HashSet; |
import java.util.List; |
import java.util.Map; |
import java.util.Properties; |
import java.util.Set; |
import javax.imageio.ImageIO; |
import javax.swing.ButtonGroup; |
import javax.swing.JButton; |
import javax.swing.JFileChooser; |
import javax.swing.JFrame; |
import javax.swing.JLabel; |
import javax.swing.JOptionPane; |
import javax.swing.JPanel; |
import javax.swing.JRadioButton; |
import javax.swing.JSpinner; |
import javax.swing.JTextField; |
import javax.swing.SpinnerNumberModel; |
import javax.swing.SwingConstants; |
import javax.swing.SwingUtilities; |
import javax.swing.UIManager; |
import javax.swing.UnsupportedLookAndFeelException; |
import javax.xml.parsers.ParserConfigurationException; |
import org.openconcerto.modules.label.graphicspl.GraphicsPL; |
import org.openconcerto.sql.model.SQLRowAccessor; |
import org.openconcerto.ui.DefaultGridBagConstraints; |
import org.openconcerto.ui.JLabelBold; |
import org.openconcerto.utils.BaseDirs; |
import org.openconcerto.utils.ExceptionHandler; |
import org.openconcerto.utils.FileUtils; |
import org.openconcerto.utils.ProductInfo; |
import org.xml.sax.SAXException; |
public class GPLPrinterPanel extends JPanel { |
private final HashMap<String, String> mapName = new HashMap<>(); |
private final List<String> variables; |
private final List<String> knownVariables = new ArrayList<>(); |
private Map<String, JTextField> editorMap = new HashMap<>(); |
private String gpl; |
private final Properties properties = new Properties(); |
private File imageDir; |
public static void main(String[] args) throws IOException { |
// final File f = new File("Templates/Labels", "50x50.zpl"); |
final File file = new File("Template/Labels", "rouquette.graphicspl"); |
String gpl = FileUtils.read(file); |
SwingUtilities.invokeLater(new Runnable() { |
@Override |
public void run() { |
try { |
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); |
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { |
e.printStackTrace(); |
} |
GPLPrinterPanel p = new GPLPrinterPanel(gpl, file.getParentFile()); |
p.initUI(null); |
JFrame f = new JFrame(); |
f.setTitle(file.getName()); |
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
f.setContentPane(p); |
f.pack(); |
f.setLocationRelativeTo(null); |
f.setVisible(true); |
} |
}); |
} |
public GPLPrinterPanel(String gpl, File imageDir) { |
this.gpl = gpl; |
this.imageDir = imageDir; |
this.variables = getVariables(gpl); |
knownVariables.add("product.code"); |
knownVariables.add("product.name"); |
knownVariables.add("product.material"); |
knownVariables.add("product.ean13"); |
knownVariables.add("product.price"); |
knownVariables.add("product.pricewithtax"); |
// |
mapName.put("product.name", "Nom"); |
mapName.put("product.code", "Code"); |
mapName.put("product.ean13", "Code à barres"); |
mapName.put("product.price", "Prix HT"); |
mapName.put("product.pricewithtax", "Prix TTC"); |
mapName.put("product.treatment", "Traitement"); |
mapName.put("product.origin", "Origine"); |
mapName.put("product.batch", "Lot"); |
mapName.put("product.size", "Taille"); |
mapName.put("product.color", "Couleur"); |
mapName.put("product.material", "Matière"); |
} |
private final File getPrefFile() { |
final File prefsFolder = BaseDirs.create(ProductInfo.getInstance()).getPreferencesFolder(); |
if (!prefsFolder.exists()) { |
prefsFolder.mkdirs(); |
} |
return new File(prefsFolder, "labels.properties"); |
} |
protected void initUI(SQLRowAccessor row) { |
final File prefsFolder = BaseDirs.create(ProductInfo.getInstance()).getPreferencesFolder(); |
if (!prefsFolder.exists()) { |
prefsFolder.mkdirs(); |
} |
final File file = getPrefFile(); |
System.out.println(file.getAbsolutePath()); |
if (file.exists()) { |
try { |
properties.load(new FileInputStream(file)); |
} catch (IOException e) { |
e.printStackTrace(); |
} |
} |
this.setLayout(new GridBagLayout()); |
GridBagConstraints c = new DefaultGridBagConstraints(); |
c.fill = GridBagConstraints.HORIZONTAL; |
this.removeAll(); |
// Fields |
Set<String> added = new HashSet<>(); |
for (String v : this.knownVariables) { |
if (variables.contains(v)) { |
// Non editable |
String label = getName(v); |
c.gridx = 0; |
c.weightx = 0; |
this.add(new JLabel(label, SwingConstants.RIGHT), c); |
c.gridx++; |
c.weightx = 1; |
String value = getValueAsString(row, v); |
JTextField txt = new JTextField(20); |
if (value != null) { |
txt.setText(value); |
txt.setEditable(false); |
} |
editorMap.put(v, txt); |
this.add(txt, c); |
added.add(v); |
c.gridy++; |
} |
} |
for (String v : this.variables) { |
if (!added.contains(v)) { |
// Editable |
String label = getName(v); |
c.gridx = 0; |
c.weightx = 0; |
this.add(new JLabel(label, SwingConstants.RIGHT), c); |
c.gridx++; |
c.weightx = 1; |
JTextField txt = new JTextField(20); |
editorMap.put(v, txt); |
this.add(txt, c); |
added.add(v); |
c.gridy++; |
} |
} |
c.gridwidth = 2; |
c.gridx = 0; |
this.add(new JLabelBold("Paramètres d'impression"), c); |
// Printer selector |
c.gridx = 0; |
c.gridy++; |
final JPanel l1 = new JPanel(); |
l1.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 0)); |
l1.add(new JLabel("Nombre d'étiquettes")); |
final JSpinner nbLabels = new JSpinner(new SpinnerNumberModel(1, 1, 1000, 10)); |
l1.add(nbLabels); |
this.add(l1, c); |
// Delay |
l1.add(new JLabel(" Pause entre chaque impression")); |
final JSpinner delayLabels = new JSpinner(new SpinnerNumberModel(800, 100, 10000, 100)); |
l1.add(delayLabels); |
this.add(l1, c); |
l1.add(new JLabel("ms")); |
c.gridy++; |
final JPanel lPrintNetwork = new JPanel(); |
lPrintNetwork.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 0)); |
JRadioButton radioNetworkPrinter = new JRadioButton("imprimante réseau ZPL IP :"); |
lPrintNetwork.add(radioNetworkPrinter); |
JTextField textPrinterIP = new JTextField(16); |
lPrintNetwork.add(textPrinterIP); |
lPrintNetwork.add(new JLabel(" Port :")); |
JSpinner portZPL = new JSpinner(new SpinnerNumberModel(9100, 24, 10000, 1)); |
lPrintNetwork.add(portZPL); |
this.add(lPrintNetwork, c); |
c.gridy++; |
final JPanel lPrintLocal = new JPanel(); |
lPrintLocal.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 0)); |
JRadioButton radioLocalPrinter = new JRadioButton("imprimante locale"); |
lPrintLocal.add(radioLocalPrinter); |
radioLocalPrinter.setSelected(true); |
this.add(lPrintLocal, c); |
final ButtonGroup gr = new ButtonGroup(); |
gr.add(radioLocalPrinter); |
gr.add(radioNetworkPrinter); |
c.gridy++; |
c.weighty = 1; |
c.gridx = 1; |
c.fill = GridBagConstraints.NONE; |
c.anchor = GridBagConstraints.SOUTHEAST; |
// Restore state from properties |
if (properties.getOrDefault("printerType", "local").equals("local")) { |
radioLocalPrinter.setSelected(true); |
} else { |
radioNetworkPrinter.setSelected(true); |
} |
textPrinterIP.setText(properties.getOrDefault("printerIp", "").toString()); |
portZPL.setValue(Long.parseLong(properties.getOrDefault("printerPort", "9100").toString())); |
nbLabels.setValue(Long.parseLong(properties.getOrDefault("nbLabels", "1").toString())); |
delayLabels.setValue(Long.parseLong(properties.getOrDefault("delay", "800").toString())); |
JPanel actions = new JPanel(); |
actions.setLayout(new FlowLayout(FlowLayout.LEFT)); |
this.add(actions, c); |
JButton exportButton = new JButton("Export PNG"); |
actions.add(exportButton); |
JButton printButton = new JButton("Imprimer"); |
actions.add(printButton); |
exportButton.addActionListener(new ActionListener() { |
@Override |
public void actionPerformed(ActionEvent e) { |
final String code = createFilledCode(); |
GraphicsPL g = new GraphicsPL(); |
try { |
g.load(code, GPLPrinterPanel.this.imageDir); |
BufferedImage img = g.createImage(1); |
JFileChooser fileChooser = new JFileChooser(); |
fileChooser.setDialogTitle("Export de l'etiquette"); |
final File dir = new File(System.getProperties().getProperty("user.home")); |
fileChooser.setCurrentDirectory(dir); |
fileChooser.setSelectedFile(new File(dir, "etiquette.png")); |
int userSelection = fileChooser.showSaveDialog(GPLPrinterPanel.this); |
if (userSelection == JFileChooser.APPROVE_OPTION) { |
File fileToSave = fileChooser.getSelectedFile(); |
System.out.println("Save as file: " + fileToSave.getAbsolutePath()); |
ImageIO.write(img, "png", fileToSave); |
Desktop.getDesktop().open(fileToSave); |
} |
} catch (ParserConfigurationException | SAXException | IOException e1) { |
e1.printStackTrace(); |
JOptionPane.showMessageDialog(GPLPrinterPanel.this, "Erreur lors de l'export\n" + e1.getMessage()); |
} |
} |
}); |
printButton.addActionListener(new ActionListener() { |
@Override |
public void actionPerformed(ActionEvent e) { |
try { |
if (radioLocalPrinter.isSelected()) { |
properties.put("printerType", "local"); |
} else { |
properties.put("printerType", "network"); |
properties.put("printerIp", textPrinterIP.getText()); |
properties.put("printerPort", portZPL.getValue().toString()); |
} |
properties.put("nbLabels", nbLabels.getValue().toString()); |
properties.put("delay", delayLabels.getValue().toString()); |
// Save Prefs |
properties.store(new FileOutputStream(getPrefFile()), ""); |
} catch (Exception e1) { |
ExceptionHandler.handle("Erreur de sauvegarde de " + getPrefFile().getAbsolutePath(), e1); |
} |
final String code = createFilledCode(); |
System.out.println("GraphicsPL:"); |
System.out.println(code); |
if (radioNetworkPrinter.isSelected()) { |
Socket socket = null; |
try { |
GraphicsPL g = new GraphicsPL(); |
g.load(code, imageDir); |
String zpl = g.getZPL(); |
byte[] data = zpl.getBytes(StandardCharsets.UTF_8); |
socket = new Socket(textPrinterIP.getText(), ((Number) portZPL.getValue()).intValue()); |
final DataOutputStream out = new DataOutputStream(socket.getOutputStream()); |
final int nb = ((Number) nbLabels.getValue()).intValue(); |
for (int i = 0; i < nb; i++) { |
out.write(data); |
} |
} catch (Exception ex) { |
ex.printStackTrace(); |
JOptionPane.showMessageDialog(printButton, "Erreur d'impression réseau : " + ex.getMessage()); |
} finally { |
if (socket != null) { |
try { |
socket.close(); |
} catch (IOException e1) { |
e1.printStackTrace(); |
} |
} |
} |
} else { |
try { |
final PrinterJob pj1 = PrinterJob.getPrinterJob(); |
GraphicsPL g = new GraphicsPL(); |
g.load(code, imageDir); |
if (pj1.printDialog()) { |
final int nb = ((Number) nbLabels.getValue()).intValue(); |
for (int i = 0; i < nb; i++) { |
pj1.setPrintable(g.createPrintable()); |
pj1.print(); |
Thread.sleep(((Number) delayLabels.getValue()).intValue()); |
} |
} |
} catch (Exception ex) { |
ex.printStackTrace(); |
JOptionPane.showMessageDialog(printButton, "Erreur d'impression locale : " + ex.getMessage()); |
} |
} |
} |
}); |
} |
private String createFilledCode() { |
final BufferedReader reader = new BufferedReader(new StringReader(this.gpl)); |
final StringBuilder builder = new StringBuilder(); |
try { |
String line = reader.readLine(); |
while (line != null) { |
if (line.contains("${")) { |
for (String v : this.editorMap.keySet()) { |
if (line.contains("${" + v + "}")) { |
final String value = this.editorMap.get(v).getText(); |
line = line.replace("${" + v + "}", value); |
} |
} |
} |
builder.append(line); |
builder.append("\n"); |
line = reader.readLine(); |
} |
} catch (Exception e) { |
e.printStackTrace(); |
} |
return builder.toString(); |
} |
public String getValueAsString(SQLRowAccessor row, String variableName) { |
if (row == null) { |
return null; |
} |
if (variableName.equals("product.code")) { |
return row.getString("CODE"); |
} else if (variableName.equals("product.name")) { |
return row.getString("NOM"); |
} else if (variableName.equals("product.ean13")) { |
return row.getString("CODE_BARRE"); |
} else if (variableName.equals("product.price")) { |
return new DecimalFormat("#0.00").format(row.getBigDecimal("PV_HT")); |
} else if (variableName.equals("product.pricewithtax")) { |
return new DecimalFormat("#0.00").format(row.getBigDecimal("PV_TTC")); |
} else if (variableName.equals("product.material")) { |
return row.getString("MATIERE"); |
} |
return ""; |
} |
public String getName(String variableName) { |
String n = mapName.get(variableName); |
if (n == null) { |
return variableName; |
} |
return n; |
} |
public List<String> getVariables(String str) { |
final List<String> result = new ArrayList<>(); |
if (str == null || str.length() < 4) { |
return result; |
} |
final int l = str.length() - 1; |
int start = 0; |
boolean inName = false; |
for (int i = 0; i < l; i++) { |
char c1 = str.charAt(i); |
char c2 = str.charAt(i + 1); |
if (!inName) { |
if (c1 == '$' && c2 == '{') { |
start = i + 2; |
inName = true; |
} |
} else if (c2 == '}') { |
final int stop = i + 1; |
String v = str.substring(start, stop); |
result.add(v); |
inName = false; |
} |
} |
return result; |
} |
} |
/trunk/Modules/Module Label/src/org/openconcerto/modules/label/gs1/GS1Util.java |
---|
21,6 → 21,7 |
// character. |
// ]d2 : GS1 DataMatrix : Standard AI element strings |
private static final String GS1_DATAMATRIX_SCANNER_PREFIX = "]d2"; |
private static final String GS1_DATAMATRIX_SCANNER_PREFIX_2 = "]D2"; |
// ]Q3 : GS1 QR Code : Standard AI element strings |
private static final String GS1_QRCODE_SCANNER_PREFIX = "]Q3"; |
// ]J1 : GS1 DotCode : Standard AI element strings |
51,7 → 52,8 |
} |
public GS1AIElements parseFromScanner(String scan) throws GS1ParseException { |
if (scan.startsWith(GS1_DATAMATRIX_SCANNER_PREFIX) || scan.startsWith(GS1_128_SCANNER_PREFIX) || scan.startsWith(GS1_DATABAR_SCANNER_PREFIX) || scan.startsWith(GS1_QRCODE_SCANNER_PREFIX)) { |
if (scan.startsWith(GS1_DATAMATRIX_SCANNER_PREFIX) || scan.startsWith(GS1_DATAMATRIX_SCANNER_PREFIX_2) || scan.startsWith(GS1_128_SCANNER_PREFIX) || scan.startsWith(GS1_DATABAR_SCANNER_PREFIX) |
|| scan.startsWith(GS1_QRCODE_SCANNER_PREFIX)) { |
return parse(scan.substring(3)); |
} |
return parse(scan); |
/trunk/Modules/Module Label/src/org/openconcerto/modules/label/graphicspl/GPLRenderer.java |
---|
46,7 → 46,7 |
for (int i = 0; i < size; i++) { |
if (nodeList.item(i).getNodeType() == Node.ELEMENT_NODE) { |
Element element = (Element) nodeList.item(i); |
Element element = (Element) nodeList.item(i); |
String name = element.getNodeName(); |
if (name.equals("text")) { |
int x = Math.round(ratio * Integer.parseInt(element.getAttribute("x"))); |
96,16 → 96,21 |
String fileName = element.getAttribute("file"); |
int x = Math.round(ratio * Integer.parseInt(element.getAttribute("x"))); |
int y = Math.round(ratio * Integer.parseInt(element.getAttribute("y"))); |
BufferedImage img = ImageIO.read(new File(graphicsPL.getImageDir(), fileName)); |
int w = Math.round(ratio * img.getWidth()); |
int h = Math.round(ratio * img.getHeight()); |
if (element.hasAttribute("width")) { |
w = Math.round(ratio * Integer.parseInt(element.getAttribute("width"))); |
final File input = new File(graphicsPL.getImageDir(), fileName); |
if (input.exists()) { |
BufferedImage img = ImageIO.read(input); |
int w = Math.round(ratio * img.getWidth()); |
int h = Math.round(ratio * img.getHeight()); |
if (element.hasAttribute("width")) { |
w = Math.round(ratio * Integer.parseInt(element.getAttribute("width"))); |
} |
if (element.hasAttribute("height")) { |
h = Math.round(ratio * Integer.parseInt(element.getAttribute("height"))); |
} |
drawImage(x, y, w, h, img); |
} else { |
throw new IllegalStateException(input.getAbsolutePath() + " not found"); |
} |
if (element.hasAttribute("height")) { |
h = Math.round(ratio * Integer.parseInt(element.getAttribute("height"))); |
} |
drawImage(x, y, w, h, img); |
} else if (name.equals("barcode")) { |
int x = Math.round(ratio * Integer.parseInt(element.getAttribute("x"))); |
/trunk/Modules/Module Label/src/org/openconcerto/modules/label/graphicspl/GraphicsPL.java |
---|
24,8 → 24,8 |
import org.xml.sax.SAXException; |
public class GraphicsPL { |
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><graphicspl height=\"400\" width=\"600\"/>"; |
Document doc; |
private String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><graphicspl height=\"400\" width=\"600\"/>"; |
private Document doc; |
private File imgDir; |
public static void main(String[] args) throws Exception { |
75,6 → 75,7 |
final BufferedImage img = createImage(ratio); |
g2d.drawImage(img, (int) Math.round(pf.getImageableX()), (int) Math.round(pf.getImageableY()), width, height, null); |
} catch (ParserConfigurationException | SAXException | IOException e) { |
e.printStackTrace(); |
throw new PrinterException(e.getMessage()); |
} |
return PAGE_EXISTS; |
82,13 → 83,13 |
}; |
} |
private String getZPL() throws IOException { |
public String getZPL() throws IOException { |
final ZPLRenderer renderer = new ZPLRenderer(); |
renderer.render(this); |
return renderer.getZPL(); |
} |
private BufferedImage createImage(float ratio) throws ParserConfigurationException, SAXException, IOException { |
public BufferedImage createImage(float ratio) throws ParserConfigurationException, SAXException, IOException { |
final Element root = this.doc.getDocumentElement(); |
final int width = Math.round(ratio * Integer.parseInt(root.getAttribute("width"))); |
final int height = Math.round(ratio * Integer.parseInt(root.getAttribute("height"))); |
106,7 → 107,7 |
return this.doc; |
} |
private void load(File file) throws ParserConfigurationException, SAXException, IOException { |
public void load(File file) throws ParserConfigurationException, SAXException, IOException { |
this.xml = new String(Files.readAllBytes(file.toPath())); |
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); |
// factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); |
117,6 → 118,17 |
this.imgDir = file.getParentFile(); |
} |
public void load(String str, File imageDir) throws ParserConfigurationException, SAXException, IOException { |
this.xml = str; |
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); |
// factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); |
final DocumentBuilder builder = factory.newDocumentBuilder(); |
final ByteArrayInputStream input = new ByteArrayInputStream(this.xml.getBytes(StandardCharsets.UTF_8)); |
this.doc = builder.parse(input); |
this.doc.getDocumentElement().normalize(); |
this.imgDir = imageDir; |
} |
public File getImageDir() { |
return this.imgDir; |
} |
/trunk/Modules/Module Label/src/org/openconcerto/modules/label/graphicspl/GPLDemoFrame.java |
---|
New file |
0,0 → 1,140 |
package org.openconcerto.modules.label.graphicspl; |
import java.awt.Dimension; |
import java.awt.Graphics; |
import java.awt.datatransfer.DataFlavor; |
import java.awt.dnd.DnDConstants; |
import java.awt.dnd.DropTarget; |
import java.awt.dnd.DropTargetDropEvent; |
import java.awt.event.ActionEvent; |
import java.awt.event.ActionListener; |
import java.awt.image.BufferedImage; |
import java.io.File; |
import java.io.IOException; |
import java.util.List; |
import javax.imageio.ImageIO; |
import javax.swing.JFrame; |
import javax.swing.JLabel; |
import javax.swing.JPanel; |
import javax.swing.SwingUtilities; |
import javax.swing.Timer; |
import javax.swing.UIManager; |
import javax.xml.parsers.ParserConfigurationException; |
import org.xml.sax.SAXException; |
public class GPLDemoFrame extends JFrame { |
public GPLDemoFrame() { |
JPanel p = new JPanel(); |
p.add(new JLabel("Drop your graphicspl file here")); |
p.setDropTarget(new DropTarget() { |
public synchronized void drop(DropTargetDropEvent evt) { |
try { |
evt.acceptDrop(DnDConstants.ACTION_COPY); |
List<File> droppedFiles = (List<File>) evt.getTransferable().getTransferData(DataFlavor.javaFileListFlavor); |
for (File file : droppedFiles) { |
System.out.println("GPLDemoFrame.GPLDemoFrame().new DropTarget() {...}.drop()" + file.getAbsolutePath()); |
if (file.getName().endsWith(".graphicspl")) { |
open(file); |
break; |
} |
} |
} catch (Exception ex) { |
ex.printStackTrace(); |
} |
} |
}); |
this.setContentPane(p); |
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
} |
long last; |
protected void open(File file) throws Exception { |
loadFile(file); |
last = file.lastModified(); |
Timer timer = new Timer(1000, new ActionListener() { |
@Override |
public void actionPerformed(ActionEvent e) { |
System.out.println("check"); |
long l = file.lastModified(); |
if (l != last) { |
last = l; |
// reload |
System.out.println("check reload"); |
try { |
loadFile(file); |
} catch (ParserConfigurationException | SAXException | IOException e1) { |
e1.printStackTrace(); |
} |
} |
} |
}); |
timer.setRepeats(true); |
timer.start(); |
} |
public void loadFile(File file) throws ParserConfigurationException, SAXException, IOException { |
GraphicsPL g = new GraphicsPL(); |
g.load(file); |
BufferedImage img = g.createImage(1); |
ImageIO.write(img, "png", new File(file.getParent(), file.getName() + ".png")); |
System.out.println("GPLDemoFrame.loadFile() " + img.getWidth() + " x " + img.getHeight()); |
final Dimension dimension = new Dimension(img.getWidth(), img.getHeight()); |
JPanel iPanel = new JPanel() { |
@Override |
public Dimension getMinimumSize() { |
return dimension; |
} |
@Override |
public Dimension getPreferredSize() { |
return new Dimension(img.getWidth(), img.getHeight()); |
} |
@Override |
public Dimension getMaximumSize() { |
return new Dimension(img.getWidth(), img.getHeight()); |
} |
@Override |
public void paint(Graphics g) { |
g.drawImage(img, 0, 0, null); |
} |
}; |
this.invalidate(); |
this.setContentPane(iPanel); |
this.setSize(dimension); |
this.revalidate(); |
this.repaint(); |
} |
public static void main(String[] args) { |
SwingUtilities.invokeLater(new Runnable() { |
@Override |
public void run() { |
try { |
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); |
} catch (Exception e) { |
e.printStackTrace(); |
} |
GPLDemoFrame f = new GPLDemoFrame(); |
f.setSize(300, 200); |
f.setVisible(true); |
f.setLocationRelativeTo(null); |
} |
}); |
} |
} |