View Javadoc
1   package org.argeo.cms.ui.widgets;
2   
3   import javax.jcr.Node;
4   import javax.jcr.RepositoryException;
5   
6   import org.argeo.cms.CmsException;
7   import org.argeo.cms.ui.CmsImageManager;
8   import org.argeo.cms.ui.internal.JcrFileUploadReceiver;
9   import org.argeo.cms.ui.util.CmsUiUtils;
10  import org.argeo.cms.ui.viewers.NodePart;
11  import org.argeo.cms.ui.viewers.Section;
12  import org.argeo.cms.ui.viewers.SectionPart;
13  import org.eclipse.rap.fileupload.FileUploadHandler;
14  import org.eclipse.rap.fileupload.FileUploadListener;
15  import org.eclipse.rap.fileupload.FileUploadReceiver;
16  import org.eclipse.rap.rwt.service.ServerPushSession;
17  import org.eclipse.rap.rwt.widgets.FileUpload;
18  import org.eclipse.swt.SWT;
19  import org.eclipse.swt.events.SelectionAdapter;
20  import org.eclipse.swt.events.SelectionEvent;
21  import org.eclipse.swt.graphics.Point;
22  import org.eclipse.swt.widgets.Composite;
23  import org.eclipse.swt.widgets.Control;
24  
25  /** An image within the Argeo Text framework */
26  public class Img extends EditableImage implements SectionPart, NodePart {
27  	private static final long serialVersionUID = 6233572783968188476L;
28  
29  	private final Section section;
30  
31  	private final CmsImageManager imageManager;
32  	private FileUploadHandler currentUploadHandler = null;
33  	private FileUploadListener fileUploadListener;
34  
35  	public Img(Composite parent, int swtStyle, Node imgNode,
36  			Point preferredImageSize) throws RepositoryException {
37  		this(Section.findSection(parent), parent, swtStyle, imgNode,
38  				preferredImageSize);
39  		setStyle(TextStyles.TEXT_IMAGE);
40  	}
41  
42  	public Img(Composite parent, int swtStyle, Node imgNode)
43  			throws RepositoryException {
44  		this(Section.findSection(parent), parent, swtStyle, imgNode, null);
45  		setStyle(TextStyles.TEXT_IMAGE);
46  	}
47  
48  	Img(Section section, Composite parent, int swtStyle, Node imgNode,
49  			Point preferredImageSize) throws RepositoryException {
50  		super(parent, swtStyle, imgNode, false, preferredImageSize);
51  		this.section = section;
52  		imageManager = CmsUiUtils.getCmsView().getImageManager();
53  		CmsUiUtils.style(this, TextStyles.TEXT_IMG);
54  	}
55  
56  	@Override
57  	protected Control createControl(Composite box, String style) {
58  		if (isEditing()) {
59  			try {
60  				return createImageChooser(box, style);
61  			} catch (RepositoryException e) {
62  				throw new CmsException("Cannot create image chooser", e);
63  			}
64  		} else {
65  			return createLabel(box, style);
66  		}
67  	}
68  
69  	@Override
70  	public synchronized void stopEditing() {
71  		super.stopEditing();
72  		fileUploadListener = null;
73  	}
74  
75  	@Override
76  	protected synchronized Boolean load(Control lbl) {
77  		try {
78  			Node imgNode = getNode();
79  			boolean loaded = imageManager.load(imgNode, lbl,
80  					getPreferredImageSize());
81  			// getParent().layout();
82  			return loaded;
83  		} catch (RepositoryException e) {
84  			throw new CmsException("Cannot load " + getNodeId()
85  					+ " from image manager", e);
86  		}
87  	}
88  
89  	protected Control createImageChooser(Composite box, String style)
90  			throws RepositoryException {
91  		// FileDialog fileDialog = new FileDialog(getShell());
92  		// fileDialog.open();
93  		// String fileName = fileDialog.getFileName();
94  		CmsImageManager imageManager = CmsUiUtils.getCmsView().getImageManager();
95  		Node node = getNode();
96  		JcrFileUploadReceiver receiver = new JcrFileUploadReceiver(
97  				node.getParent(), node.getName() + '[' + node.getIndex() + ']',
98  				imageManager);
99  		if (currentUploadHandler != null)
100 			currentUploadHandler.dispose();
101 		currentUploadHandler = prepareUpload(receiver);
102 		final ServerPushSession pushSession = new ServerPushSession();
103 		final FileUpload fileUpload = new FileUpload(box, SWT.NONE);
104 		CmsUiUtils.style(fileUpload, style);
105 		fileUpload.addSelectionListener(new SelectionAdapter() {
106 			private static final long serialVersionUID = -9158471843941668562L;
107 
108 			@Override
109 			public void widgetSelected(SelectionEvent e) {
110 				pushSession.start();
111 				fileUpload.submit(currentUploadHandler.getUploadUrl());
112 			}
113 		});
114 		return fileUpload;
115 	}
116 
117 	protected FileUploadHandler prepareUpload(FileUploadReceiver receiver) {
118 		final FileUploadHandler uploadHandler = new FileUploadHandler(receiver);
119 		if (fileUploadListener != null)
120 			uploadHandler.addUploadListener(fileUploadListener);
121 		return uploadHandler;
122 	}
123 
124 	@Override
125 	public Section getSection() {
126 		return section;
127 	}
128 
129 	public void setFileUploadListener(FileUploadListener fileUploadListener) {
130 		this.fileUploadListener = fileUploadListener;
131 		if (currentUploadHandler != null)
132 			currentUploadHandler.addUploadListener(fileUploadListener);
133 	}
134 
135 	@Override
136 	public Node getItem() throws RepositoryException {
137 		return getNode();
138 	}
139 
140 	@Override
141 	public String getPartId() {
142 		return getNodeId();
143 	}
144 
145 	@Override
146 	public String toString() {
147 		return "Img #" + getPartId();
148 	}
149 
150 }