package org.argeo.library.ui; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.spi.FileSystemProvider; import javax.jcr.Node; import javax.jcr.RepositoryException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.cms.fs.CmsFsUtils; import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.eclipse.ui.EclipseUiUtils; import org.argeo.eclipse.ui.fs.FsUiUtils; import org.argeo.eclipse.ui.specific.UiContext; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; /** * Default Documents file composite: a sashForm with a browser in the middle and * meta data at right hand side. */ public class DocumentsFileComposite extends Composite { private static final long serialVersionUID = -7567632342889241793L; private final static Log log = LogFactory.getLog(DocumentsFileComposite.class); private final Node currentBaseContext; // UI Parts for the browser private Composite rightPannelCmp; public DocumentsFileComposite(Composite parent, int style, Node context, FileSystemProvider fsp) { super(parent, style); this.currentBaseContext = context; this.setLayout(EclipseUiUtils.noSpaceGridLayout()); SashForm form = new SashForm(this, SWT.HORIZONTAL); Composite centerCmp = new Composite(form, SWT.BORDER | SWT.NO_FOCUS); createDisplay(centerCmp); rightPannelCmp = new Composite(form, SWT.NO_FOCUS); Path path = CmsFsUtils.getPath(fsp, context); setOverviewInput(path); form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); form.setWeights(new int[] { 55, 20 }); } private void createDisplay(final Composite parent) { parent.setLayout(EclipseUiUtils.noSpaceGridLayout()); Browser browser = new Browser(parent, SWT.NONE); // browser.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, // true)); browser.setLayoutData(EclipseUiUtils.fillAll()); try { // FIXME make it more robust String url = CmsUiUtils.getDataUrl(currentBaseContext, UiContext.getHttpRequest()); // FIXME issue with the redirection to https if (url.startsWith("http://") && !url.startsWith("http://localhost")) url = "https://" + url.substring("http://".length(), url.length()); if (log.isTraceEnabled()) log.debug("Trying to display " + url); browser.setUrl(url); browser.layout(true, true); } catch (RepositoryException re) { throw new IllegalStateException("Cannot open file at " + currentBaseContext, re); } } /** * Recreates the content of the box that displays information about the current * selected Path. */ private void setOverviewInput(Path path) { try { EclipseUiUtils.clear(rightPannelCmp); rightPannelCmp.setLayout(new GridLayout()); if (path != null) { // if (isImg(context)) { // EditableImage image = new Img(parent, RIGHT, context, // imageWidth); // image.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, // true, false, // 2, 1)); // } Label contextL = new Label(rightPannelCmp, SWT.NONE); contextL.setText(path.getFileName().toString()); contextL.setFont(EclipseUiUtils.getBoldFont(rightPannelCmp)); addProperty(rightPannelCmp, "Last modified", Files.getLastModifiedTime(path).toString()); // addProperty(rightPannelCmp, "Owner", // Files.getOwner(path).getName()); if (Files.isDirectory(path)) { addProperty(rightPannelCmp, "Type", "Folder"); } else { String mimeType = Files.probeContentType(path); if (EclipseUiUtils.isEmpty(mimeType)) mimeType = "Unknown"; addProperty(rightPannelCmp, "Type", mimeType); addProperty(rightPannelCmp, "Size", FsUiUtils.humanReadableByteCount(Files.size(path), false)); } } rightPannelCmp.layout(true, true); } catch (IOException e) { throw new IllegalStateException("Cannot display details for " + path.toString(), e); } } // Simplify UI implementation private void addProperty(Composite parent, String propName, String value) { Label propLbl = new Label(parent, SWT.NONE); //propLbl.setText(ConnectUtils.replaceAmpersand(propName + ": " + value)); propLbl.setText(value); //CmsUiUtils.markup(propLbl); } }