com.google.livingstories.client.contentmanager.LivingStoryManager.java Source code

Java tutorial

Introduction

Here is the source code for com.google.livingstories.client.contentmanager.LivingStoryManager.java

Source

/**
 * Copyright 2010 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS-IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.livingstories.client.contentmanager;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
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.UiFactory;
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.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DeckPanel;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.livingstories.client.LivingStory;
import com.google.livingstories.client.LivingStoryRpcService;
import com.google.livingstories.client.LivingStoryRpcServiceAsync;
import com.google.livingstories.client.PublishState;
import com.google.livingstories.client.lsp.ContentRenderer;
import com.google.livingstories.client.ui.CoordinatedLivingStorySelector;
import com.google.livingstories.client.ui.RichTextEditor;
import com.google.livingstories.client.util.LivingStoryData;

/**
 * UI for managing living stories
 */
public class LivingStoryManager extends ManagerPane {
    interface MyUiBinder extends UiBinder<Widget, LivingStoryManager> {
    }

    private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);

    private final LivingStoryRpcServiceAsync livingStoryService = GWT.create(LivingStoryRpcService.class);

    @UiField
    CoordinatedLivingStorySelector livingStorySelector;
    @UiField
    Button createButton;

    @UiField
    DeckPanel contentPanel;
    @UiField
    Label livingStoryIdLabel;
    @UiField
    TextBox urlTextBox;
    @UiField
    TextBox titleTextBox;
    @UiField
    RichTextEditor summaryEditor;
    @UiField
    Label publishStateLabel;
    @UiField
    Button updatePreviewButton;
    @UiField
    Button saveDraftButton;
    @UiField
    Button publishButton;
    @UiField
    Button deleteButton;
    @UiField
    Label statusMessage;
    @UiField
    SimplePanel previewPanel;

    /* Widgets for the create living story dialog */
    private DialogBox createDialog;
    private TextBox createDialogTextBox;
    private Button createDialogSaveButton;

    public LivingStoryManager() {
        initWidget(uiBinder.createAndBindUi(this));
    }

    @UiHandler("createButton")
    void createLivingStory(ClickEvent e) {
        getCreateDialog().center();
    }

    private DialogBox getCreateDialog() {
        if (createDialog == null) {
            // creates the dialog box on first demand, but reuses it for subsequent
            // appearances
            createDialog = new DialogBox();
            createDialog.setText("Enter story url");
            createDialog.setAnimationEnabled(true);

            VerticalPanel dialogVPanel = new VerticalPanel();
            dialogVPanel.add(new HTML("Enter the desired story url name"));
            createDialogTextBox = new TextBox();
            // dialog text is set below
            dialogVPanel.add(createDialogTextBox);

            HorizontalPanel buttonPanel = new HorizontalPanel();
            createDialogSaveButton = new Button("Save");
            createDialogSaveButton.addClickHandler(new ClickHandler() {
                public void onClick(ClickEvent event) {
                    closeCreateDialog(false);
                }
            });
            buttonPanel.add(createDialogSaveButton);
            Button cancelButton = new Button("Cancel");
            cancelButton.addClickHandler(new ClickHandler() {
                public void onClick(ClickEvent event) {
                    closeCreateDialog(true);
                }
            });
            buttonPanel.add(cancelButton);
            dialogVPanel.add(buttonPanel);
            createDialog.setWidget(dialogVPanel);
        }

        createDialogTextBox.setText("");

        return createDialog;
    }

    private void closeCreateDialog(boolean isCancel) {
        if (isCancel) {
            createDialog.hide();
        } else {
            AsyncCallback<LivingStory> callback = new AsyncCallback<LivingStory>() {
                public void onSuccess(LivingStory story) {
                    createDialogTextBox.setText("");
                    createDialog.hide();
                    String idString = String.valueOf(story.getId());
                    if (!livingStorySelector.hasItemWithValue(idString)) {
                        livingStorySelector.addItem(story.getTitle(), idString);
                    }
                    livingStorySelector.selectItemWithValue(idString);
                    livingStorySelector.setCoordinatedLivingStoryIdFromSelection();
                    populateStoryContent(story);
                }

                public void onFailure(Throwable caught) {
                    createDialogSaveButton.setText("Story creation failed");
                    createDialogSaveButton.setStyleName("failedbutton");
                    createDialogSaveButton.setEnabled(false);
                }
            };

            livingStoryService.createLivingStory(createDialogTextBox.getText(), "New Story", callback);
        }
    }

    @UiHandler("deleteButton")
    void deleteLivingStory(ClickEvent event) {
        boolean delete = Window.confirm("Are you sure you want to delete this living story? "
                + "Doing so will also delete all content that belongs to it.");
        if (delete) {
            final String selectedStoryId = livingStorySelector.getSelectedItemValue();
            AsyncCallback<Void> callback = new AsyncCallback<Void>() {
                public void onSuccess(Void nothing) {
                    livingStorySelector.removeItemWithValue(selectedStoryId);
                    clearStoryContent();
                    contentPanel.showWidget(0);
                    livingStorySelector.clearCoordinatedLivingStoryId();
                }

                public void onFailure(Throwable caught) {
                    statusMessage.setText("Deletion failed");
                }
            };

            livingStoryService.deleteLivingStory(Long.valueOf(selectedStoryId), callback);
        }
    }

    @UiHandler("updatePreviewButton")
    void updatePreview(ClickEvent event) {
        previewPanel.setWidget(new ContentRenderer(summaryEditor.getContent(), true));
    }

    @UiHandler("saveDraftButton")
    void saveDraft(ClickEvent event) {
        save(PublishState.DRAFT);
    }

    @UiHandler("publishButton")
    void publish(ClickEvent event) {
        save(PublishState.PUBLISHED);
    }

    private void save(PublishState publishState) {
        AsyncCallback<LivingStory> callback = new AsyncCallback<LivingStory>() {
            public void onSuccess(LivingStory story) {
                statusMessage.setText(
                        story.getPublishState() == PublishState.PUBLISHED ? "Published!" : "Saved as draft");
                statusMessage.setStylePrimaryName("serverResponseLabelSuccess");
                publishStateLabel.setText(story.getPublishState().toString());
                // If the story title has been changed, refresh it in the list box
                livingStorySelector.setItemText(livingStorySelector.getSelectedIndex(), story.getTitle());
            }

            public void onFailure(Throwable caught) {
                statusMessage.setText("Saving failed.");
                statusMessage.setStylePrimaryName("serverResponseLabelError");
            }
        };

        updatePreview(null);
        livingStoryService.saveLivingStory(Long.valueOf(livingStorySelector.getSelectedItemValue()),
                urlTextBox.getText(), titleTextBox.getText(), publishState, summaryEditor.getContent(), callback);
    }

    @UiFactory
    CoordinatedLivingStorySelector createLivingStoryList() {
        return new CoordinatedLivingStorySelector(livingStoryService);
    }

    @UiHandler("livingStorySelector")
    void changeLivingStories(ChangeEvent event) {
        if (livingStorySelector.hasSelection()) {
            Long livingStoryId = livingStorySelector.getSelectedLivingStoryId();
            LivingStoryData.setLivingStoryId(livingStoryId);

            AsyncCallback<LivingStory> callback = new AsyncCallback<LivingStory>() {
                public void onFailure(Throwable caught) {
                    contentPanel.showWidget(0);
                }

                public void onSuccess(LivingStory story) {
                    populateStoryContent(story);
                }
            };

            if (livingStoryId != null) {
                livingStoryService.getLivingStoryById(livingStoryId, false, callback);
            }
        }
    }

    private void populateStoryContent(LivingStory story) {
        contentPanel.showWidget(1);
        livingStoryIdLabel.setText(Long.toString(story.getId()));
        urlTextBox.setText(story.getUrl());
        titleTextBox.setText(story.getTitle());
        summaryEditor.setContent(story.getSummary());
        publishStateLabel.setText(story.getPublishState().toString());
        statusMessage.setText("");
        updatePreview(null);
    }

    private void clearStoryContent() {
        livingStoryIdLabel.setText("");
        urlTextBox.setText("");
        titleTextBox.setText("");
        summaryEditor.setContent("");
        publishStateLabel.setText("");
        statusMessage.setText("");
        previewPanel.clear();
    }

    @Override
    public void onShow() {
        livingStorySelector.selectCoordinatedLivingStory();
        changeLivingStories(null);

        if (livingStorySelector.hasSelection()) {
            LivingStoryData.setLivingStoryId(livingStorySelector.getSelectedLivingStoryId());
        }
    }
}