Attachment.java

/*
 * Copyright (C) 2000 - 2025 Silverpeas
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * As a special exception to the terms and conditions of version 3.0 of
 * the GPL, you may redistribute this Program in connection with Free/Libre
 * Open Source Software ("FLOSS") applications as described in Silverpeas's
 * FLOSS exception.  You should have received a copy of the text describing
 * the FLOSS exception, and it is also available here:
 * "https://www.silverpeas.org/legal/floss_exception.html"
 *
 * 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.silverpeas.mobile.client.components.attachments;

import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptException;
import com.google.gwt.dom.client.ImageElement;
import com.google.gwt.dom.client.SpanElement;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.*;
import org.silverpeas.mobile.client.apps.documents.pages.SharingPage;
import org.silverpeas.mobile.client.apps.documents.resources.DocumentsMessages;
import org.silverpeas.mobile.client.apps.notifications.NotificationsApp;
import org.silverpeas.mobile.client.common.Notification;
import org.silverpeas.mobile.client.common.mobil.MobilUtils;
import org.silverpeas.mobile.client.common.navigation.UrlUtils;
import org.silverpeas.mobile.client.common.network.NetworkHelper;
import org.silverpeas.mobile.client.common.storage.CacheStorageHelper;
import org.silverpeas.mobile.client.resources.ApplicationMessages;
import org.silverpeas.mobile.shared.dto.documents.SimpleDocumentDTO;
import org.silverpeas.mobile.shared.dto.notifications.NotificationDTO;

public class Attachment extends Composite {

  private static AttachmentUiBinder uiBinder = GWT.create(AttachmentUiBinder.class);
  @UiField
  Anchor link, download;
  @UiField
  SpanElement size, name, description;
  @UiField
  ImageElement icon;

  @UiField
  HTMLPanel operations;

  @UiField
  HTML share, view, notify;
  private DocumentsMessages msg = null;
  private ApplicationMessages globalMsg = null;
  private SimpleDocumentDTO data = null;

  private int sharing;
  private boolean notifiable;

  public void setNotifiable(boolean notifiable) {
    this.notifiable = notifiable;
    if (!notifiable) {
      notify.setVisible(false);
    }
  }

  interface AttachmentUiBinder extends UiBinder<Widget, Attachment> {}

  public Attachment() {
    msg = GWT.create(DocumentsMessages.class);
    globalMsg = GWT.create(ApplicationMessages.class);
    initWidget(uiBinder.createAndBindUi(this));
  }

  public void setSharing(int sharing) {
    this.sharing = sharing;
    if (sharing == 0) {
      share.setVisible(false);
    }
  }
  public void setAttachment(SimpleDocumentDTO data) {
    this.data = data;
    render();
  }

  private boolean isViewable() {
    boolean v = (data.getContentType().contains("msword") || data.getContentType().contains("word"));
    v = v || data.getContentType().contains("excel");
    v = v || data.getContentType().contains("pdf");
    v = v || data.getContentType().contains("presentationml");
    v = v || data.getContentType().contains("opendocument.text");
    v = v || data.getContentType().contains("opendocument.spreadsheet");
    v = v || data.getContentType().contains("opendocument.presentation");
    return v;
  }

  private void render() {
    operations.getElement().setId("operations");
    view.getElement().setId("view");
    share.getElement().setId("share");
    download.getElement().setId("download");
    notify.getElement().setId("notify");

    Image img = null;
    String sizeValue;
    if (!data.isDownloadable()) {
      download.setVisible(false);
    }
    if (data.getSize() < 1024 * 1024) {
      sizeValue = String.valueOf(data.getSize() / 1024);
      size.setInnerHTML(msg.sizeK(sizeValue));
    } else {
      sizeValue = String.valueOf(data.getSize() / (1024 * 1024));
      size.setInnerHTML(msg.sizeM(sizeValue));
    }
    String title = data.getFileName();
    if (data.getTitle() != null && !data.getTitle().isEmpty()) {
      title = data.getTitle();
    }
    name.setInnerHTML(title);
    if (data.getDescription() != null && !data.getDescription().isEmpty()){
      description.setInnerHTML("<br/>"+data.getDescription());
    } else {
      description.getStyle().setDisplay(Style.Display.NONE);
    }

    if (data.getContentType().contains("msword") || data.getContentType().contains("word")) {
      icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-word.svg");
    } else if (data.getContentType().contains("excel")) {
      icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-excel.svg");
    } else if (data.getContentType().contains("pdf")) {
      icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-pdf.svg");
    } else if (data.getContentType().contains("image")) {
      icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-image.svg");
    } else if (data.getContentType().contains("presentationml")) {
      icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-powerpoint.svg");
    } else if (data.getContentType().contains("zip")) {
      icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-zip.svg");
    } else if (data.getContentType().contains("opendocument.text")) {
      icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-writer.svg");
    } else if (data.getContentType().contains("opendocument.spreadsheet")) {
      icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-calc.svg");
    } else if (data.getContentType().contains("opendocument.presentation")) {
      icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-presentation.svg");
    } else {
      icon.setSrc(NetworkHelper.getContext() + "icons/files/file-type-unknown.svg");
    }

    // link generation
    try {
      String url = UrlUtils.getAttachedFileLocation();
      if (data.isDownloadable()) {
        url += "componentId/";
        url += data.getInstanceId();
        url += "/attachmentId/";
        url += data.getId();
        url += "/lang/";
        url += data.getLang();
        url += "/name/";
        url += data.getFileName();
      } else {
        url = "#";
      }
      download.setHref(url);
      link.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent clickEvent) {
          toogleOperations();
        }
      });

      if (!isViewable()) view.setVisible(false);

    } catch (JavaScriptException e) {
      Notification.alert(e.getMessage());
    }

  }

  private void toogleOperations() {
    if (operations.getStylePrimaryName().equalsIgnoreCase("ops-closed")) {
      operations.setStylePrimaryName("ops-open");
      link.setStylePrimaryName("expand-less");
    } else {
      operations.setStylePrimaryName("ops-closed");
      link.setStylePrimaryName("expand-more");
    }
  }

  private boolean isVisibleOperations() {
    return operations.getStylePrimaryName().equals("ops-open");
  }

  private void viewDocument() {
    AttachmentsManager.viewDocument(data.getId(), data.getLang(), data.getTitle());
  }

  @UiHandler("share")
  protected void share(ClickEvent event) {
    if (isVisibleOperations()) {
      SharingPage page = new SharingPage();
      page.setData("Attachment", data.getSpId(), data.getInstanceId());
      page.show();
    }
  }

  @UiHandler("download")
  protected void download(ClickEvent event) {
    if (isVisibleOperations()) {
      if (MobilUtils.isIOS()) {
        if (data.isDownloadable()) {
          String u = link.getHref();
          if (NetworkHelper.isOnline()) {
            CacheStorageHelper.store(u);
          }
          Window.open(u, "_blank", "fullscreen=yes");
        } else {
          viewDocument();
        }
      } else {
        if (data.isDownloadable()) {
          link.setTarget("_self");
          link.getElement().setAttribute("download", data.getFileName());
          if (NetworkHelper.isOnline()) {
            CacheStorageHelper.store(((Anchor) event.getSource()).getHref());
          }
        } else {
          viewDocument();
        }
      }
    }
  }

  @UiHandler("view")
  protected void view(ClickEvent event) {
    if (isVisibleOperations()) viewDocument();
  }

  @UiHandler("notify")
  protected void notify(ClickEvent event) {
    if (isVisibleOperations()) {
      NotificationsApp app = new NotificationsApp(data.getInstanceId(), data.getId(), NotificationDTO.TYPE_DOCUMENT, data.getFileName(), data.getFileName());
      app.start();
    }
  }
}