/******************************************************************************
* Copyright (C) 2008 Low Heng Sin All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* Posterita Ltd., 3, Draper Avenue, Quatre Bornes, Mauritius *
* or via info@posterita.org or http://www.posterita.org/ *
*****************************************************************************/
package org.adempiere.webui.window;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.SQLException;
import java.util.logging.Level;
import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.component.Button;
import org.adempiere.webui.component.Panel;
import org.adempiere.webui.component.Window;
import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.compiere.util.Msg;
import org.zkoss.util.media.AMedia;
import org.zkoss.util.media.Media;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zkex.zul.Borderlayout;
import org.zkoss.zkex.zul.Center;
import org.zkoss.zkex.zul.North;
import org.zkoss.zkex.zul.South;
import org.zkoss.zul.Filedownload;
import org.zkoss.zul.Fileupload;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.Iframe;
/**
*
* @author Low Heng Sin
*
*/
public class WMediaDialog extends Window implements EventListener
{
/**
*
*/
private static final long serialVersionUID = -329919930778203892L;
private static CLogger log = CLogger.getCLogger(WMediaDialog.class);
/** data */
private Object m_data;
/** Change */
private boolean m_change = false;
private Iframe preview = new Iframe();
private Button bDelete = new Button();
private Button bSave = new Button();
private Button bLoad = new Button();
private Button bCancel = new Button();
private Button bOk = new Button();
private Panel previewPanel = new Panel();
private Borderlayout mainPanel = new Borderlayout();
private Hbox toolBar = new Hbox();
private Hbox confirmPanel = new Hbox();
private boolean m_cancel;
/**
* Constructor.
* @param title
* @param data
*/
public WMediaDialog(String title, Object data)
{
super();
this.setTitle(title);
try
{
staticInit();
m_data = data;
displayData();
}
catch (Exception ex)
{
log.log(Level.SEVERE, "", ex);
}
try
{
AEnv.showWindow(this);
}
catch (Exception e)
{
}
} // WAttachment
/**
* Static setup.
* <pre>
* - northPanel
* - toolBar
* - title
* - centerPane [split]
* - graphPanel (left)
* - gifScroll - gifPanel
* - pdfViewer
* - text (right)
* - confirmPanel
* </pre>
* @throws Exception
*/
void staticInit() throws Exception
{
this.setWidth("500px");
this.setHeight("600px");
this.setClosable(true);
this.setBorder("normal");
this.appendChild(mainPanel);
mainPanel.setHeight("100%");
mainPanel.setWidth("100%");
North northPanel = new North();
northPanel.setCollapsible(false);
northPanel.setSplittable(false);
toolBar.appendChild(bLoad);
toolBar.appendChild(bDelete);
toolBar.appendChild(bSave);
mainPanel.appendChild(northPanel);
northPanel.appendChild(toolBar);
bSave.setEnabled(false);
bSave.setImage("/images/Export24.png");
bSave.setTooltiptext(Msg.getMsg(Env.getCtx(), "AttachmentSave"));
bSave.addEventListener(Events.ON_CLICK, this);
bLoad.setImage("/images/Import24.png");
bLoad.setTooltiptext(Msg.getMsg(Env.getCtx(), "Load"));
bLoad.addEventListener(Events.ON_CLICK, this);
bDelete.setImage("/images/Delete24.png");
bDelete.setTooltiptext(Msg.getMsg(Env.getCtx(), "Delete"));
bDelete.addEventListener(Events.ON_CLICK, this);
previewPanel.appendChild(preview);
preview.setHeight("100%");
preview.setWidth("100%");
Center centerPane = new Center();
centerPane.setAutoscroll(true);
centerPane.setFlex(true);
mainPanel.appendChild(centerPane);
centerPane.appendChild(previewPanel);
South southPane = new South();
mainPanel.appendChild(southPane);
southPane.appendChild(confirmPanel);
southPane.setHeight("30px");
bCancel.setImage("/images/Cancel24.png");
bCancel.addEventListener(Events.ON_CLICK, this);
bOk.setImage("/images/Ok24.png");
bOk.addEventListener(Events.ON_CLICK, this);
confirmPanel.appendChild(bCancel);
confirmPanel.appendChild(bOk);
}
/**
* Dispose
*/
public void dispose ()
{
preview = null;
this.detach();
} // dispose
/**
* Display gif or jpg in gifPanel
* @param index index
*/
private void displayData ()
{
// Reset UI
preview.setVisible(false);
bDelete.setEnabled(false);
bSave.setEnabled(false);
if (m_data != null)
{
bSave.setEnabled(true);
bDelete.setEnabled(true);
try
{
AMedia media = createMedia();
preview.setContent(media);
preview.setVisible(true);
}
catch (Exception e)
{
log.log(Level.SEVERE, "Failed to preview content", e);
}
}
} // displayData
private AMedia createMedia() throws SQLException {
AMedia media;
String contentType = null;
if (m_data instanceof byte[])
{
media = new AMedia(this.getTitle(), null, contentType, (byte[])m_data);
}
else if (m_data instanceof Blob)
{
media = new AMedia(this.getTitle(), null, contentType, ((Blob)m_data).getBinaryStream());
}
else if (m_data instanceof Clob)
{
Clob clob = (Clob)m_data;
long length = clob.length() > 100 ? 100 : clob.length();
String data = ((Clob)m_data).getSubString(1, new Long(length).intValue());
if (data.toUpperCase().indexOf("<html>") >= 0)
{
contentType = "text/html";
}
else
{
contentType = "text/plain";
}
media = new AMedia(this.getTitle(), null, contentType, ((Clob)m_data).getCharacterStream());
}
else
{
contentType = "text/plain";
media = new AMedia(this.getTitle(), null, contentType, m_data.toString());
}
return media;
}
/**
* Action Listener
* @param e event
*/
public void onEvent(Event e)
{
// log.config(e.getActionCommand());
// Save and Close
if (e.getTarget() == bOk)
{
dispose();
}
// Cancel
else if (e.getTarget() == bCancel)
{
m_cancel = true;
dispose();
}
// clear data
else if (e.getTarget() == bDelete)
{
m_data = null;
m_change = true;
displayData();
}
// Load Attachment
else if (e.getTarget() == bLoad)
loadFile();
// Open Attachment
else if (e.getTarget() == bSave)
{
save();
}
} // onEvent
/**************************************************************************
* Load file
*/
private void loadFile()
{
log.info("");
Media media = null;
try
{
media = Fileupload.get();
if (media == null)
return;
}
catch (InterruptedException e)
{
e.printStackTrace();
}
String fileName = media.getName();
log.config(fileName);
//update
m_change = true;
m_data = media.getByteData();
displayData();
} // getFileName
/**
* download
*/
private void save()
{
if (m_data == null)
return;
try
{
AMedia media = createMedia();
Filedownload.save(media);
}
catch (Exception e)
{
log.log(Level.SEVERE, "Failed to export content.", e);
}
} // saveAttachmentToFile
public boolean isCancel() {
return m_cancel;
}
public boolean isChange() {
return m_change;
}
public Object getData() {
return m_data;
}
}