/* * This library is part of OpenCms - * the Open Source Content Management System * * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * For further information about Alkacon Software, please see the * company website: http://www.alkacon.com * * For further information about OpenCms, please see the * project website: http://www.opencms.org * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.opencms.ade.galleries.client.preview.ui; import org.opencms.ade.galleries.client.Messages; import org.opencms.ade.galleries.client.preview.CmsPreviewUtil; import org.opencms.ade.galleries.client.preview.I_CmsPreviewHandler; import org.opencms.ade.galleries.shared.CmsResourceInfoBean; import org.opencms.ade.galleries.shared.I_CmsGalleryProviderConstants.GalleryMode; import org.opencms.gwt.client.ui.CmsConfirmDialog; import org.opencms.gwt.client.ui.CmsPushButton; import org.opencms.gwt.client.ui.CmsTabbedPanel; import org.opencms.gwt.client.ui.CmsTabbedPanel.CmsTabbedPanelStyle; import org.opencms.gwt.client.ui.I_CmsConfirmDialogHandler; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; 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.Command; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; /** * Provides a widget skeleton for the preview dialog.<p> * * This widget contains a panel with the resource preview and * a set of tabs with resource information under the preview panel.<p> * * @param <T> the resource info bean type * * @since 8.0. */ public abstract class A_CmsPreviewDialog<T extends CmsResourceInfoBean> extends Composite { /** * @see com.google.gwt.uibinder.client.UiBinder */ protected interface I_CmsPreviewDialogUiBinder extends UiBinder<Widget, A_CmsPreviewDialog<?>> { // GWT interface, nothing to do here } /** The ui-binder instance for this class. */ private static I_CmsPreviewDialogUiBinder uiBinder = GWT.create(I_CmsPreviewDialogUiBinder.class); /** The button panel. */ @UiField protected FlowPanel m_buttonBar; /** The select button. */ @UiField protected CmsPushButton m_closePreview; /** The dialog height. */ protected int m_dialogHeight; /** The dialog width. */ protected int m_dialogWidth; /** The dialog mode of the gallery. */ protected GalleryMode m_galleryMode; /** The parent panel of the preview dialog. */ @UiField protected FlowPanel m_parentPanel; /** The preview height. */ protected int m_previewHeight; /** The preview placeholder panel. */ @UiField protected FlowPanel m_previewHolder; /** The preview panel of preview dialog. */ @UiField protected SimplePanel m_previewPanel; /** The select button. */ @UiField protected CmsPushButton m_selectButton; /** The tabbed panel of the preview dialog. */ protected CmsTabbedPanel<Widget> m_tabbedPanel; /** The tabs placeholder panel. */ @UiField protected FlowPanel m_tabsHolder; /** The min height for the preview panel. */ private final int m_minPreviewHeight = 362; /** * The constructor.<p> * * @param dialogMode the gallery dialog mode (view, widget, ade, editor, ...) * @param dialogHeight the dialog height to set * @param dialogWidth the dialog width to set */ public A_CmsPreviewDialog(GalleryMode dialogMode, int dialogHeight, int dialogWidth) { initWidget(uiBinder.createAndBindUi(this)); m_galleryMode = dialogMode; m_dialogHeight = dialogHeight; m_dialogWidth = dialogWidth; m_previewHeight = m_minPreviewHeight; int detailsHeight = m_dialogHeight - m_previewHeight - 7; m_previewHolder.getElement().getStyle().setHeight(m_previewHeight, Unit.PX); m_tabsHolder.getElement().getStyle().setHeight(detailsHeight, Unit.PX); m_tabbedPanel = new CmsTabbedPanel<Widget>(CmsTabbedPanelStyle.classicTabs); m_tabsHolder.add(m_tabbedPanel); m_selectButton.setText(Messages.get().key(Messages.GUI_PREVIEW_BUTTON_SELECT_0)); m_selectButton.setVisible(false); m_closePreview.setText(Messages.get().key(Messages.GUI_PREVIEW_CLOSE_BUTTON_0)); // buttons switch (m_galleryMode) { case editor: m_selectButton.setVisible(CmsPreviewUtil.shouldShowSelectButton()); m_closePreview.setText(Messages.get().key(Messages.GUI_PREVIEW_CLOSE_GALLERY_BUTTON_0)); m_buttonBar.getElement().getStyle().setBottom(94, Unit.PX); m_buttonBar.getElement().getStyle().setRight(1, Unit.PX); break; case widget: m_selectButton.setVisible(true); m_closePreview.setText(Messages.get().key(Messages.GUI_PREVIEW_CLOSE_GALLERY_BUTTON_0)); break; case ade: case view: default: break; } } /** * Displays a confirm save changes dialog with the given message. * May insert individual message before the given one for further information.<p> * Will call the appropriate command after saving/cancel.<p> * * @param message the message to display * @param onConfirm the command executed after saving * @param onCancel the command executed on cancel */ public void confirmSaveChanges(String message, final Command onConfirm, final Command onCancel) { CmsConfirmDialog confirmDialog = new CmsConfirmDialog("Confirm", message); confirmDialog.setHandler(new I_CmsConfirmDialogHandler() { /** * @see org.opencms.gwt.client.ui.I_CmsCloseDialogHandler#onClose() */ public void onClose() { if (onCancel != null) { onCancel.execute(); } } /** * @see org.opencms.gwt.client.ui.I_CmsConfirmDialogHandler#onOk() */ public void onOk() { if (onConfirm != null) { onConfirm.execute(); } } }); confirmDialog.center(); } /** * Fills the content of the tabs panel.<p> * * @param resourceInfo the bean containing the parameter */ public abstract void fillContent(T resourceInfo); /** * Returns the gallery mode.<p> * * @return the gallery mode */ public GalleryMode getGalleryMode() { return m_galleryMode; } /** * Returns if there are any changes that need saving, before the preview may be closed.<p> * * @return <code>true</code> if changed */ public abstract boolean hasChanges(); /** * Will be triggered, when the select button is clicked.<p> * * @param event the click event */ @UiHandler("m_closePreview") public void onCloseClick(ClickEvent event) { saveChanges(null); getHandler().closePreview(); } /** * Will be triggered, when the select button is clicked.<p> * * @param event the click event */ @UiHandler("m_selectButton") public void onSelectClick(ClickEvent event) { if (m_galleryMode == GalleryMode.editor) { // note: the select button isn't necessarily visible in editor mode (depending on the WYSIWYG editor), but // if it is, we want it to save the data and close the gallery dialog if (getHandler().setDataInEditor()) { // do this after a delay, so we don't get ugly Javascript errors when the iframe is closed. Timer timer = new Timer() { @Override public void run() { CmsPreviewUtil.closeDialog(); } }; timer.schedule(1); } } else { saveChanges(null); getHandler().selectResource(); } } /** * Removes the preview.<p> */ public void removePreview() { removeFromParent(); } /** * Saves the changes for this dialog.<p> * * @param afterSaveCommand the command to execute after saving the changes */ public abstract void saveChanges(Command afterSaveCommand); /** * Returns the preview handler.<p> * * @return the preview handler */ protected abstract I_CmsPreviewHandler<T> getHandler(); }