IDEMPIERE-234 Configure Toolbar by User, by Window, by Tab and configure new buttons and new toolbars. Fixed example action for custom window toolbar button is not thread safe.
This commit is contained in:
parent
d4e9ae0656
commit
9dc0dc5b94
|
@ -13,59 +13,21 @@
|
|||
*****************************************************************************/
|
||||
package org.adempiere.ui.zk.example.action;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.adempiere.base.IGridTabExporter;
|
||||
import org.adempiere.base.Service;
|
||||
import org.adempiere.exceptions.AdempiereException;
|
||||
import org.adempiere.webui.action.IAction;
|
||||
import org.adempiere.webui.adwindow.ADWindow;
|
||||
import org.adempiere.webui.adwindow.AbstractADWindowContent;
|
||||
import org.adempiere.webui.adwindow.IADTabbox;
|
||||
import org.adempiere.webui.adwindow.IADTabpanel;
|
||||
import org.adempiere.webui.adwindow.ADWindowContent;
|
||||
import org.adempiere.webui.apps.AEnv;
|
||||
import org.adempiere.webui.component.Checkbox;
|
||||
import org.adempiere.webui.component.ConfirmPanel;
|
||||
import org.adempiere.webui.component.Label;
|
||||
import org.adempiere.webui.component.ListItem;
|
||||
import org.adempiere.webui.component.Listbox;
|
||||
import org.adempiere.webui.component.Window;
|
||||
import org.adempiere.webui.window.FDialog;
|
||||
import org.compiere.model.GridTab;
|
||||
import org.compiere.model.MRole;
|
||||
import org.compiere.util.Env;
|
||||
import org.compiere.util.Msg;
|
||||
import org.zkoss.util.media.AMedia;
|
||||
import org.zkoss.zk.ui.event.Event;
|
||||
import org.zkoss.zk.ui.event.EventListener;
|
||||
import org.zkoss.zul.Div;
|
||||
import org.zkoss.zul.Filedownload;
|
||||
import org.zkoss.zul.Hbox;
|
||||
import org.zkoss.zul.Vbox;
|
||||
|
||||
/**
|
||||
* @author hengsin
|
||||
*
|
||||
*/
|
||||
public class ExportAction implements IAction, EventListener<Event> {
|
||||
public class ExportAction implements IAction {
|
||||
|
||||
private AbstractADWindowContent panel;
|
||||
|
||||
private Map<String, IGridTabExporter> exporterMap = null;
|
||||
private Map<String, String> extensionMap = null;
|
||||
|
||||
private Window winExportFile = null;
|
||||
private ConfirmPanel confirmPanel = new ConfirmPanel(true);
|
||||
private Listbox cboType = new Listbox();
|
||||
private Checkbox chkCurrentRow = new Checkbox();
|
||||
/**
|
||||
*
|
||||
* default constructor
|
||||
*/
|
||||
public ExportAction() {
|
||||
}
|
||||
|
@ -76,143 +38,20 @@ public class ExportAction implements IAction, EventListener<Event> {
|
|||
@Override
|
||||
public void execute(Object target) {
|
||||
ADWindow adwindow = (ADWindow) target;
|
||||
panel = adwindow.getADWindowContent();
|
||||
ADWindowContent panel = adwindow.getADWindowContent();
|
||||
|
||||
if (!MRole.getDefault().isCanExport()) {
|
||||
FDialog.error(panel.getWindowNo(), "AccessTableNoView");
|
||||
return;
|
||||
}
|
||||
|
||||
doExport();
|
||||
doExport(panel);
|
||||
}
|
||||
|
||||
private void doExport() {
|
||||
exporterMap = new HashMap<String, IGridTabExporter>();
|
||||
extensionMap = new HashMap<String, String>();
|
||||
List<IGridTabExporter> exporterList = Service.locator().list(IGridTabExporter.class).getServices();
|
||||
for(IGridTabExporter exporter : exporterList)
|
||||
{
|
||||
String extension = exporter.getFileExtension();
|
||||
if (!extensionMap.containsKey(extension))
|
||||
{
|
||||
extensionMap.put(extension, exporter.getFileExtensionLabel());
|
||||
exporterMap.put(extension, exporter);
|
||||
}
|
||||
}
|
||||
|
||||
if(winExportFile == null)
|
||||
{
|
||||
winExportFile = new Window();
|
||||
winExportFile.setTitle(Msg.getMsg(Env.getCtx(), "Export") + ": " + panel.getActiveGridTab().getName());
|
||||
winExportFile.setWidth("450px");
|
||||
winExportFile.setClosable(true);
|
||||
winExportFile.setBorder("normal");
|
||||
winExportFile.setStyle("position:absolute");
|
||||
|
||||
cboType.setMold("select");
|
||||
|
||||
cboType.getItems().clear();
|
||||
for(Map.Entry<String, String> entry : extensionMap.entrySet())
|
||||
{
|
||||
cboType.appendItem(entry.getKey() + " - " + entry.getValue(), entry.getKey());
|
||||
}
|
||||
|
||||
cboType.setSelectedIndex(0);
|
||||
|
||||
Vbox vb = new Vbox();
|
||||
vb.setWidth("100%");
|
||||
winExportFile.appendChild(vb);
|
||||
|
||||
Hbox hb = new Hbox();
|
||||
Div div = new Div();
|
||||
div.setAlign("right");
|
||||
div.appendChild(new Label("Files of Type: "));
|
||||
hb.appendChild(div);
|
||||
hb.appendChild(cboType);
|
||||
cboType.setWidth("100%");
|
||||
vb.appendChild(hb);
|
||||
|
||||
hb = new Hbox();
|
||||
chkCurrentRow.setLabel(Msg.getMsg(Env.getCtx(), "ExportCurrentRowOnly"));
|
||||
chkCurrentRow.setSelected(true);
|
||||
hb.appendChild(chkCurrentRow);
|
||||
vb.appendChild(hb);
|
||||
|
||||
vb.appendChild(confirmPanel);
|
||||
confirmPanel.addActionListener(this);
|
||||
}
|
||||
|
||||
winExportFile.setAttribute(Window.MODE_KEY, Window.MODE_HIGHLIGHTED);
|
||||
AEnv.showWindow(winExportFile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEvent(Event event) throws Exception {
|
||||
if(event.getTarget().getId().equals(ConfirmPanel.A_CANCEL))
|
||||
winExportFile.onClose();
|
||||
else if(event.getTarget().getId().equals(ConfirmPanel.A_OK))
|
||||
exportFile();
|
||||
}
|
||||
|
||||
private void exportFile() {
|
||||
try {
|
||||
ListItem li = cboType.getSelectedItem();
|
||||
if(li == null || li.getValue() == null)
|
||||
{
|
||||
FDialog.error(0, winExportFile, "FileInvalidExtension");
|
||||
return;
|
||||
}
|
||||
|
||||
String ext = li.getValue().toString();
|
||||
IGridTabExporter exporter = exporterMap.get(ext);
|
||||
if (exporter == null)
|
||||
{
|
||||
FDialog.error(0, winExportFile, "FileInvalidExtension");
|
||||
return;
|
||||
}
|
||||
|
||||
boolean currentRowOnly = chkCurrentRow.isSelected();
|
||||
File file = File.createTempFile("Export", "."+ext);
|
||||
IADTabbox adTab = panel.getADTab();
|
||||
int selected = adTab.getSelectedIndex();
|
||||
int tabLevel = panel.getActiveGridTab().getTabLevel();
|
||||
Set<String> tables = new HashSet<String>();
|
||||
List<GridTab> childs = new ArrayList<GridTab>();
|
||||
List<GridTab> includedList = panel.getActiveGridTab().getIncludedTabs();
|
||||
for(GridTab included : includedList)
|
||||
{
|
||||
String tableName = included.getTableName();
|
||||
if (tables.contains(tableName))
|
||||
continue;
|
||||
tables.add(tableName);
|
||||
childs.add(included);
|
||||
}
|
||||
for(int i = selected+1; i < adTab.getTabCount(); i++)
|
||||
{
|
||||
IADTabpanel adTabPanel = adTab.getADTabpanel(i);
|
||||
if (adTabPanel.getGridTab().isSortTab())
|
||||
continue;
|
||||
if (adTabPanel.getGridTab().getTabLevel() <= tabLevel)
|
||||
break;
|
||||
String tableName = adTabPanel.getGridTab().getTableName();
|
||||
if (tables.contains(tableName))
|
||||
continue;
|
||||
tables.add(tableName);
|
||||
childs.add(adTabPanel.getGridTab());
|
||||
}
|
||||
|
||||
exporter.export(panel.getActiveGridTab(), childs, currentRowOnly, file);
|
||||
|
||||
winExportFile.onClose();
|
||||
winExportFile = null;
|
||||
AMedia media = null;
|
||||
media = new AMedia(panel.getActiveGridTab().getName() + "." + ext, null, exporter.getContentType(), file, true);
|
||||
Filedownload.save(media, panel.getActiveGridTab().getName() + "." + ext);
|
||||
} catch (Exception e) {
|
||||
throw new AdempiereException(e);
|
||||
} finally {
|
||||
if (winExportFile != null)
|
||||
winExportFile.onClose();
|
||||
}
|
||||
}
|
||||
private void doExport(ADWindowContent panel) {
|
||||
ExportWindow window = new ExportWindow();
|
||||
window.init(panel);
|
||||
|
||||
AEnv.showWindow(window);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,188 @@
|
|||
/**
|
||||
*
|
||||
*/
|
||||
package org.adempiere.ui.zk.example.action;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.adempiere.base.IGridTabExporter;
|
||||
import org.adempiere.base.Service;
|
||||
import org.adempiere.exceptions.AdempiereException;
|
||||
import org.adempiere.webui.adwindow.ADWindowContent;
|
||||
import org.adempiere.webui.adwindow.IADTabbox;
|
||||
import org.adempiere.webui.adwindow.IADTabpanel;
|
||||
import org.adempiere.webui.component.Checkbox;
|
||||
import org.adempiere.webui.component.ConfirmPanel;
|
||||
import org.adempiere.webui.component.Label;
|
||||
import org.adempiere.webui.component.ListItem;
|
||||
import org.adempiere.webui.component.Listbox;
|
||||
import org.adempiere.webui.component.Window;
|
||||
import org.adempiere.webui.window.FDialog;
|
||||
import org.compiere.model.GridTab;
|
||||
import org.compiere.util.Env;
|
||||
import org.compiere.util.Msg;
|
||||
import org.zkoss.util.media.AMedia;
|
||||
import org.zkoss.zk.ui.event.Event;
|
||||
import org.zkoss.zk.ui.event.EventListener;
|
||||
import org.zkoss.zul.Div;
|
||||
import org.zkoss.zul.Filedownload;
|
||||
import org.zkoss.zul.Hbox;
|
||||
import org.zkoss.zul.Vbox;
|
||||
|
||||
/**
|
||||
* @author hengsin
|
||||
*
|
||||
*/
|
||||
public class ExportWindow extends Window implements EventListener<Event> {
|
||||
|
||||
/**
|
||||
* generated serial id
|
||||
*/
|
||||
private static final long serialVersionUID = -4465587396361021680L;
|
||||
|
||||
private Map<String, IGridTabExporter> exporterMap = null;
|
||||
private Map<String, String> extensionMap = null;
|
||||
|
||||
private ConfirmPanel confirmPanel = new ConfirmPanel(true);
|
||||
private Listbox cboType = new Listbox();
|
||||
private Checkbox chkCurrentRow = new Checkbox();
|
||||
private ADWindowContent panel;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public ExportWindow() {
|
||||
}
|
||||
|
||||
public void init(ADWindowContent panel) {
|
||||
this.panel = panel;
|
||||
|
||||
exporterMap = new HashMap<String, IGridTabExporter>();
|
||||
extensionMap = new HashMap<String, String>();
|
||||
List<IGridTabExporter> exporterList = Service.locator().list(IGridTabExporter.class).getServices();
|
||||
for(IGridTabExporter exporter : exporterList)
|
||||
{
|
||||
String extension = exporter.getFileExtension();
|
||||
if (!extensionMap.containsKey(extension))
|
||||
{
|
||||
extensionMap.put(extension, exporter.getFileExtensionLabel());
|
||||
exporterMap.put(extension, exporter);
|
||||
}
|
||||
}
|
||||
|
||||
setTitle(Msg.getMsg(Env.getCtx(), "Export") + ": " + panel.getActiveGridTab().getName());
|
||||
setWidth("450px");
|
||||
setClosable(true);
|
||||
setBorder("normal");
|
||||
setStyle("position:absolute");
|
||||
|
||||
cboType.setMold("select");
|
||||
|
||||
cboType.getItems().clear();
|
||||
for(Map.Entry<String, String> entry : extensionMap.entrySet())
|
||||
{
|
||||
cboType.appendItem(entry.getKey() + " - " + entry.getValue(), entry.getKey());
|
||||
}
|
||||
|
||||
cboType.setSelectedIndex(0);
|
||||
|
||||
Vbox vb = new Vbox();
|
||||
vb.setWidth("100%");
|
||||
appendChild(vb);
|
||||
|
||||
Hbox hb = new Hbox();
|
||||
Div div = new Div();
|
||||
div.setStyle("float: right");
|
||||
div.appendChild(new Label("Files of Type: "));
|
||||
hb.appendChild(div);
|
||||
hb.appendChild(cboType);
|
||||
cboType.setWidth("100%");
|
||||
vb.appendChild(hb);
|
||||
|
||||
hb = new Hbox();
|
||||
chkCurrentRow.setLabel(Msg.getMsg(Env.getCtx(), "ExportCurrentRowOnly"));
|
||||
chkCurrentRow.setSelected(true);
|
||||
hb.appendChild(chkCurrentRow);
|
||||
vb.appendChild(hb);
|
||||
|
||||
vb.appendChild(confirmPanel);
|
||||
confirmPanel.addActionListener(this);
|
||||
|
||||
setAttribute(Window.MODE_KEY, Window.MODE_HIGHLIGHTED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEvent(Event event) throws Exception {
|
||||
if(event.getTarget().getId().equals(ConfirmPanel.A_CANCEL))
|
||||
onClose();
|
||||
else if(event.getTarget().getId().equals(ConfirmPanel.A_OK))
|
||||
exportFile();
|
||||
|
||||
}
|
||||
|
||||
private void exportFile() {
|
||||
try {
|
||||
ListItem li = cboType.getSelectedItem();
|
||||
if(li == null || li.getValue() == null)
|
||||
{
|
||||
FDialog.error(0, this, "FileInvalidExtension");
|
||||
return;
|
||||
}
|
||||
|
||||
String ext = li.getValue().toString();
|
||||
IGridTabExporter exporter = exporterMap.get(ext);
|
||||
if (exporter == null)
|
||||
{
|
||||
FDialog.error(0, this, "FileInvalidExtension");
|
||||
return;
|
||||
}
|
||||
|
||||
boolean currentRowOnly = chkCurrentRow.isSelected();
|
||||
File file = File.createTempFile("Export", "."+ext);
|
||||
IADTabbox adTab = panel.getADTab();
|
||||
int selected = adTab.getSelectedIndex();
|
||||
int tabLevel = panel.getActiveGridTab().getTabLevel();
|
||||
Set<String> tables = new HashSet<String>();
|
||||
List<GridTab> childs = new ArrayList<GridTab>();
|
||||
List<GridTab> includedList = panel.getActiveGridTab().getIncludedTabs();
|
||||
for(GridTab included : includedList)
|
||||
{
|
||||
String tableName = included.getTableName();
|
||||
if (tables.contains(tableName))
|
||||
continue;
|
||||
tables.add(tableName);
|
||||
childs.add(included);
|
||||
}
|
||||
for(int i = selected+1; i < adTab.getTabCount(); i++)
|
||||
{
|
||||
IADTabpanel adTabPanel = adTab.getADTabpanel(i);
|
||||
if (adTabPanel.getGridTab().isSortTab())
|
||||
continue;
|
||||
if (adTabPanel.getGridTab().getTabLevel() <= tabLevel)
|
||||
break;
|
||||
String tableName = adTabPanel.getGridTab().getTableName();
|
||||
if (tables.contains(tableName))
|
||||
continue;
|
||||
tables.add(tableName);
|
||||
childs.add(adTabPanel.getGridTab());
|
||||
}
|
||||
|
||||
exporter.export(panel.getActiveGridTab(), childs, currentRowOnly, file);
|
||||
|
||||
onClose();
|
||||
AMedia media = null;
|
||||
media = new AMedia(panel.getActiveGridTab().getName() + "." + ext, null, exporter.getContentType(), file, true);
|
||||
Filedownload.save(media, panel.getActiveGridTab().getName() + "." + ext);
|
||||
} catch (Exception e) {
|
||||
throw new AdempiereException(e);
|
||||
} finally {
|
||||
onClose();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -14,9 +14,14 @@
|
|||
package org.adempiere.webui.action;
|
||||
|
||||
/**
|
||||
* Custom UI action provided through OSGi service. Implementation must be thread safe.
|
||||
* @author hengsin
|
||||
*
|
||||
*/
|
||||
public interface IAction {
|
||||
/**
|
||||
*
|
||||
* @param target
|
||||
*/
|
||||
public void execute(Object target);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue