merge with 81f5fd4a0e55

This commit is contained in:
Thomas Bayen 2013-02-02 14:25:09 +01:00
commit 9c7234f3d1
2 changed files with 198 additions and 17 deletions

View File

@ -19,8 +19,12 @@ package org.compiere.apps;
import static org.compiere.model.SystemIDs.PROCESS_AD_CHANGELOG_REDO;
import static org.compiere.model.SystemIDs.PROCESS_AD_CHANGELOG_UNDO;
import static org.compiere.model.SystemIDs.REFERENCE_DOCUMENTACTION;
import static org.compiere.model.SystemIDs.REFERENCE_PAYMENTRULE;
import static org.compiere.model.SystemIDs.REFERENCE_POSTED;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
@ -33,6 +37,9 @@ import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@ -46,13 +53,16 @@ import java.util.logging.Level;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
@ -62,6 +72,8 @@ import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import org.adempiere.util.Callback;
import org.adempiere.util.IProcessUI;
@ -87,6 +99,7 @@ import org.compiere.model.GridWindow;
import org.compiere.model.GridWindowVO;
import org.compiere.model.GridWorkbench;
import org.compiere.model.Lookup;
import org.compiere.model.MLookup;
import org.compiere.model.MLookupFactory;
import org.compiere.model.MProcess;
import org.compiere.model.MQuery;
@ -104,9 +117,11 @@ import org.compiere.swing.CPanel;
import org.compiere.util.CLogMgt;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.DisplayType;
import org.compiere.util.Env;
import org.compiere.util.Language;
import org.compiere.util.Msg;
import org.compiere.util.NamePair;
import org.compiere.util.Util;
/**
@ -308,7 +323,8 @@ public final class APanel extends CPanel
aNew, aCopy, aDelete, aPrint, aPrintPreview,
aExport = null,
aRefresh, aHistory, aAttachment, aChat, aMulti, aFind,
aWorkflow, aZoomAcross, aRequest, aWinSize, aArchive;
aWorkflow, aZoomAcross, aRequest, aWinSize, aArchive,
aProcess;
/** Ignore Button */
public AppsAction aIgnore;
/** Save Button */
@ -483,6 +499,9 @@ public final class APanel extends CPanel
aMailSupport = addAction("EMailSupport", mHelp, null, false);
aAbout = addAction("About", mHelp, null, false);
//
aProcess=addAction("Process",null,null,false);
/**
* ToolBar
*/
@ -495,6 +514,7 @@ public final class APanel extends CPanel
toolBar.add(aDeleteSelection.getButton());
toolBar.add(aSave.getButton());
toolBar.add(aSaveAndCreate.getButton());
toolBar.add(aProcess.getButton());
toolBar.addSeparator();
toolBar.add(aRefresh.getButton()); // F5
toolBar.add(aFind.getButton());
@ -1573,7 +1593,20 @@ public final class APanel extends CPanel
aRefresh.setEnabled(true);
aAttachment.setEnabled(true);
aChat.setEnabled(true);
// IDEMPIERE-587 - Swing: Toolbar Button to start Process from button fields
// tbayen - 2013-01-22
GridField[] fields = m_curGC.getMTab().getFields();
boolean processEnabled=false;
for(GridField field:fields){
if (field.isToolbarButton() && field.isDisplayed()){
processEnabled=true;
break;
}
}
aProcess.setEnabled(processEnabled);
}
//
m_curWinTab.requestFocusInWindow();
setBusy(false, true);
@ -1725,6 +1758,8 @@ public final class APanel extends CPanel
cmd_find();
else if (m_isPersonalLock && cmd.equals(aLock.getName()))
cmd_lock();
else if (cmd.equals(aProcess.getName()))
cmd_process();
// View
else if (cmd.equals(aAttachment.getName()))
cmd_attachment();
@ -2088,6 +2123,143 @@ public final class APanel extends CPanel
return retValue;
}
private long m_popup_closingtime=0;
/**
* opens a pulldown menu to start processes from "Button" type fields.
*/
// IDEMPIERE-587 - Swing: Toolbar Button to start Process from button fields
// tbayen - 2013-01-22
public void cmd_process() {
if(System.currentTimeMillis()-m_popup_closingtime<200)
return; // closed through the same click - user has clicked to close the menu
GridField[] fields = m_curGC.getMTab().getFields();
final ArrayList<GridField> processFields = new ArrayList<GridField>();
for (GridField field : fields) {
if (field.isToolbarButton() && field.isDisplayed()) {
processFields.add(field);
}
}
JPopupMenu popup = new JPopupMenu();
popup.addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
m_popup_closingtime=System.currentTimeMillis();
}
@Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
@Override public void popupMenuCanceled(PopupMenuEvent e) {}
});
for (GridField field : processFields) {
if (field.isDisplayed(true)) {
ImageIcon icon = Env.getImageIcon2("Process16");
String text = field.getHeader();
Color color = null;
// preparing data like lookup tables
// code to find the text and icons to display is shameless
// stolen from org.compiere.grid.ed.VButton
MLookup m_lookup = null;
// Record_ID for Zoom Buttons (see
// http://www.adempiere.com/Entering_Data_-_Fields_and_Buttons#Button)
if (field.getColumnName().endsWith("_ID")
&& !field.getColumnName().equals("Record_ID")) {
m_lookup = MLookupFactory.get(Env.getCtx(),
field.getWindowNo(), 0, field.getAD_Column_ID(),
DisplayType.Search);
} else if (field.getAD_Reference_Value_ID() != 0) {
// Assuming List
m_lookup = MLookupFactory.get(Env.getCtx(),
field.getWindowNo(), 0, field.getAD_Column_ID(),
DisplayType.List);
}
// Special Buttons
int AD_Reference_ID = -1;
String columnName = field.getColumnName();
if (columnName.equals("PaymentRule")) {
AD_Reference_ID = REFERENCE_PAYMENTRULE;
color = Color.blue;
icon = Env.getImageIcon("Payment16.gif"); // 29*14
} else if (columnName.equals("DocAction")) {
AD_Reference_ID = REFERENCE_DOCUMENTACTION;
color = Color.blue;
icon = Env.getImageIcon("Process16.gif"); // 16*16
} else if (columnName.equals("CreateFrom")) {
icon = Env.getImageIcon("Copy16.gif"); // 16*16
} else if (columnName.equals("Record_ID")) {
icon = Env.getImageIcon("Zoom16.gif"); // 16*16
text = Msg.getMsg(Env.getCtx(), "ZoomDocument");
} else if (columnName.equals("Posted")) {
AD_Reference_ID = REFERENCE_POSTED;
color = Color.magenta;
icon = Env.getImageIcon("InfoAccount16.gif"); // 16*16
}
Map<String, String> values = null;
if (AD_Reference_ID > 0) {
values = new HashMap<String, String>();
String SQL;
if (Env.isBaseLanguage(Env.getCtx(), "AD_Ref_List"))
SQL = "SELECT Value, Name FROM AD_Ref_List WHERE AD_Reference_ID=?";
else
SQL = "SELECT l.Value, t.Name FROM AD_Ref_List l, AD_Ref_List_Trl t "
+ "WHERE l.AD_Ref_List_ID=t.AD_Ref_List_ID"
+ " AND t.AD_Language='"
+ Env.getAD_Language(Env.getCtx())
+ "'"
+ " AND l.AD_Reference_ID=?";
try {
PreparedStatement pstmt = DB
.prepareStatement(SQL, null);
pstmt.setInt(1, AD_Reference_ID);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
String value = rs.getString(1);
String name = rs.getString(2);
values.put(value, name);
}
rs.close();
pstmt.close();
} catch (SQLException e) {
log.log(Level.SEVERE, SQL, e);
}
// Nothing to show or Record_ID
if (field.getValue() == null
|| field.getColumnName().equals("Record_ID"))
;
else if (values != null)
text = (String) values.get(field.getValue());
else if (m_lookup != null) {
NamePair pp = m_lookup.get(field.getValue());
if (pp != null)
text = pp.getName();
}
// Display it
} // setValue
JMenuItem item = new JMenuItem(text, icon);
item.setForeground(color);
item.setName(field.getColumnName());
popup.add(item);
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JMenuItem menuItem = ((JMenuItem)e.getSource());
String columnName=menuItem.getName();
GridField callingField = m_curTab.getField(columnName);
//
setStatusLine(m_curTab.processCallout(callingField), true);
actionButtonCleanUp(menuItem.getName(),
callingField.getAD_Process_ID(), callingField.getHeader());
}
});
}
}
popup.show(aProcess.getButton(), -1, aProcess.getButton().getHeight());
}
/**
* Ignore
*/
@ -2469,9 +2641,16 @@ public final class APanel extends CPanel
* Start Button Process
* @param vButton button
*/
private void actionButton (VButton vButton)
{
private void actionButton (VButton vButton){
log.info(vButton.toString());
String title = vButton.getDescription();
if (title == null || title.length() == 0)
title = vButton.getName();
actionButtonCleanUp(vButton.getColumnName(), vButton.getProcess_ID(), title);
}
private void actionButtonCleanUp(String columnName, int processID, String title)
{
if (m_curTab.hasChangedCurrentTabAndParents()) {
String msg = CLogger.retrieveErrorString("Please ReQuery Window");
@ -2481,7 +2660,7 @@ public final class APanel extends CPanel
boolean startWOasking = false;
// boolean batch = false;
String col = vButton.getColumnName();
String col = columnName;
// Zoom
if (col.equals("Record_ID"))
@ -2512,7 +2691,7 @@ public final class APanel extends CPanel
record_ID = Env.getContextAsInt (m_ctx, m_curWindowNo, "AD_Language_ID");
// Record_ID - Change Log ID
if (record_ID == -1
&& (vButton.getProcess_ID() == PROCESS_AD_CHANGELOG_UNDO || vButton.getProcess_ID() == PROCESS_AD_CHANGELOG_REDO))
&& (processID == PROCESS_AD_CHANGELOG_UNDO || processID == PROCESS_AD_CHANGELOG_REDO))
{
Integer id = (Integer)m_curTab.getValue("AD_ChangeLog_ID");
record_ID = id.intValue();
@ -2529,7 +2708,7 @@ public final class APanel extends CPanel
if (col.equals("DocAction"))
{
isProcessMandatory = true;
VDocAction vda = new VDocAction(m_curWindowNo, m_curTab, vButton, record_ID);
VDocAction vda = new VDocAction(m_curWindowNo, m_curTab, null, record_ID);
// Something to select from?
if (vda.getNumberOfOptions() == 0)
{
@ -2552,7 +2731,7 @@ public final class APanel extends CPanel
else if (col.equals("CreateFrom") || col.equals("X_CreateFromBatch"))
{
// Run form only if the button has no process defined - teo_sarca [ 1974354 ]
if (vButton.getProcess_ID() <= 0)
if (processID <= 0)
{
ICreateFrom cf = VCreateFromFactory.create(m_curTab, col);
if(cf != null)
@ -2628,8 +2807,8 @@ public final class APanel extends CPanel
* or invoke user form
*/
log.config("Process_ID=" + vButton.getProcess_ID() + ", Record_ID=" + record_ID);
if (vButton.getProcess_ID() == 0)
log.config("Process_ID=" + processID + ", Record_ID=" + record_ID);
if (processID == 0)
{
if (isProcessMandatory)
{
@ -2643,7 +2822,7 @@ public final class APanel extends CPanel
return;
// call form
MProcess pr = new MProcess(m_ctx, vButton.getProcess_ID(), null);
MProcess pr = new MProcess(m_ctx, processID, null);
int form_ID = pr.getAD_Form_ID();
if (form_ID != 0 )
{
@ -2653,10 +2832,7 @@ public final class APanel extends CPanel
return;
FormFrame ff = new FormFrame(getGraphicsConfiguration());
String title = vButton.getDescription();
if (title == null || title.length() == 0)
title = vButton.getName();
ProcessInfo pi = new ProcessInfo (title, vButton.getProcess_ID(), table_ID, record_ID);
ProcessInfo pi = new ProcessInfo (title, processID, table_ID, record_ID);
pi.setAD_User_ID (Env.getAD_User_ID(m_ctx));
pi.setAD_Client_ID (Env.getAD_Client_ID(m_ctx));
ff.setProcessInfo(pi);
@ -2667,7 +2843,7 @@ public final class APanel extends CPanel
}
else {
ProcessModalDialog dialog = new ProcessModalDialog(m_ctx, AEnv.getWindow(m_curWindowNo), Env.getHeader(m_ctx, m_curWindowNo),
this, m_curWindowNo, vButton.getProcess_ID(), table_ID,
this, m_curWindowNo, processID, table_ID,
record_ID, startWOasking);
if (dialog.isValidDialog())
{

View File

@ -415,7 +415,12 @@ public class GridController extends CPanel
for (int i = 0; i < size; i++)
{
GridField mField = m_mTab.getField(i);
if (mField.isDisplayed())
if (mField.isDisplayed()
// IDEMPIERE-587 Swing: Toolbar Button to start Process from button fields
&& !(
mField.getDisplayType()==DisplayType.Button
&& mField.isToolbarButton())
)
{
VEditor vEditor = VEditorFactory.getEditor(m_mTab, mField, false);
if (vEditor == null)