/** * Sencha GXT 3.0.0b - Sencha for GWT * Copyright(c) 2007-2012, Sencha, Inc. * licensing@sencha.com * * http://www.sencha.com/products/gxt/license/ */ package com.sencha.gxt.desktopapp.client; import java.util.Date; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.user.client.ui.HasWidgets; import com.google.web.bindery.event.shared.HandlerRegistration; import com.sencha.gxt.core.client.util.DelayedTask; import com.sencha.gxt.core.client.util.Util; import com.sencha.gxt.desktopapp.client.event.AddFileModelEvent; import com.sencha.gxt.desktopapp.client.event.AddFileModelEvent.AddFileModelHandler; import com.sencha.gxt.desktopapp.client.event.RemoveFileModelEvent; import com.sencha.gxt.desktopapp.client.event.RemoveFileModelEvent.RemoveFileModelHandler; import com.sencha.gxt.desktopapp.client.event.UpdateFileModelEvent; import com.sencha.gxt.desktopapp.client.event.UpdateFileModelEvent.UpdateFileModelHandler; import com.sencha.gxt.desktopapp.client.persistence.FileModel; import com.sencha.gxt.desktopapp.client.persistence.FileSystem; public abstract class FileBasedMiniAppPresenterImpl implements FileBasedMiniAppPresenter { protected static final int AUTO_SAVE_DELAY_MS = 750; protected static final int AUTO_SAVE_QUEUE_MAX = 10; private DesktopBus desktopBus; private FileSystem fileSystem; private FileModel fileModel; private FileBasedMiniAppView fileBasedMiniAppView; private HandlerRegistration addFileModelRegistration; private AddFileModelHandler addFileModelHandler; private HandlerRegistration updateFileModelRegistration; private UpdateFileModelHandler updateFileModelHandler; private HandlerRegistration removeFileModelRegistration; private RemoveFileModelHandler removeFileModelHandler; private String currentValue; private int autoSaveCount; private DelayedTask autoSaveDelayedTask; public FileBasedMiniAppPresenterImpl(DesktopBus desktopBus, FileSystem fileSystem, FileModel fileModel) { this.desktopBus = desktopBus; this.fileSystem = fileSystem; this.fileModel = fileModel; } @Override public void bind() { getAddFileModelRegistration(); getUpdateFileModelRegistration(); getRemoveFileModelRegistration(); updateCurrentValue(getDisplayedContent(getFileModel())); updateTitle(); } @Override public void go(HasWidgets hasWidgets) { hasWidgets.add(getFileBasedMiniAppView().asWidget()); } @Override public void onClose() { } @Override public void onContentUpdate() { if (++autoSaveCount > AUTO_SAVE_QUEUE_MAX) { getAutoSaveDelayedTask().delay(0); } else { startAutoSaveTimer(); } } @Override public void onSave() { String currentValue = getFileBasedMiniAppView().getValue(); // if current value has changed, update store, which publishes to other // presenters if (!Util.equalWithNull(currentValue, this.currentValue)) { this.currentValue = currentValue; getFileModel().setContent(currentValue); getFileModel().setLastModified(new Date()); // TODO: move to FileSystem getFileSystem().getTreeStore().update(getFileModel()); } } @Override public void unbind() { getAddFileModelRegistration().removeHandler(); getUpdateFileModelRegistration().removeHandler(); getRemoveFileModelRegistration().removeHandler(); } protected abstract FileBasedMiniAppView createFileBasedMiniAppView(); protected DelayedTask getAutoSaveDelayedTask() { if (autoSaveDelayedTask == null) { autoSaveDelayedTask = new DelayedTask() { @Override public void onExecute() { onSave(); autoSaveDelayedTask.delay(AUTO_SAVE_DELAY_MS); autoSaveCount = 0; } }; } return autoSaveDelayedTask; } protected DesktopBus getDesktopBus() { return desktopBus; } protected String getDisplayedContent(FileModel fileModel) { return fileModel.getContent(); } protected FileBasedMiniAppView getFileBasedMiniAppView() { if (fileBasedMiniAppView == null) { fileBasedMiniAppView = createFileBasedMiniAppView(); } return fileBasedMiniAppView; } protected FileModel getFileModel() { return fileModel; } protected FileSystem getFileSystem() { return fileSystem; } protected String getTitle() { return getFileSystem().getPath(fileModel); } protected void setDisplayedContent(String value) { getFileBasedMiniAppView().setValue(value); } protected void setValue(FileModel fileModel) { String currentValue = getDisplayedContent(fileModel); // if current value has changed, update view with current value if (!Util.equalWithNull(currentValue, this.currentValue)) { updateCurrentValue(currentValue); } } protected void startAutoSaveTimer() { getAutoSaveDelayedTask().delay(AUTO_SAVE_DELAY_MS); } protected void stopAutoSaveTimer() { getAutoSaveDelayedTask().cancel(); } protected void updateTitle() { String newTitle = getTitle(); getFileBasedMiniAppView().setTitle(newTitle); } private AddFileModelHandler getAddFileModelHandler() { if (addFileModelHandler == null) { addFileModelHandler = new AddFileModelHandler() { @Override public void onAddFileModel(AddFileModelEvent addFileModelEvent) { onAddFileModelEvent(addFileModelEvent); } }; } return addFileModelHandler; } private HandlerRegistration getAddFileModelRegistration() { if (addFileModelRegistration == null) { addFileModelRegistration = getDesktopBus().addAddFileModelHandler(getAddFileModelHandler()); } return addFileModelRegistration; } private RemoveFileModelHandler getRemoveFileModelHandler() { if (removeFileModelHandler == null) { removeFileModelHandler = new RemoveFileModelHandler() { @Override public void onRemoveFileModel(RemoveFileModelEvent removeFileModelEvent) { onRemoveFileModelEvent(removeFileModelEvent); } }; } return removeFileModelHandler; } private HandlerRegistration getRemoveFileModelRegistration() { if (removeFileModelRegistration == null) { removeFileModelRegistration = getDesktopBus().addRemoveFileModelHandler(getRemoveFileModelHandler()); } return removeFileModelRegistration; } private UpdateFileModelHandler getUpdateFileModelHandler() { if (updateFileModelHandler == null) { updateFileModelHandler = new UpdateFileModelHandler() { @Override public void onUpdateFileModel(UpdateFileModelEvent updateFileModelEvent) { onUpdateFileModelEvent(updateFileModelEvent); } }; } return updateFileModelHandler; } private HandlerRegistration getUpdateFileModelRegistration() { if (updateFileModelRegistration == null) { updateFileModelRegistration = getDesktopBus().addUpdateFileModelHandler(getUpdateFileModelHandler()); } return updateFileModelRegistration; } private void onAddFileModelEvent(AddFileModelEvent addFileModelEvent) { // update title on any add to pick up path name change due to move updateTitle(); } private void onRemoveFileModelEvent(RemoveFileModelEvent removeFileModelEvent) { FileModel fileModel = removeFileModelEvent.getFileModel(); if (fileModel == getFileModel()) { // Distinguish between remove and move (remove + add) Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { if (getFileSystem().getTreeStore().findModel(getFileModel()) == null) { getFileBasedMiniAppView().close(); } } }); } } private void onUpdateFileModelEvent(UpdateFileModelEvent updateFileModelEvent) { FileModel fileModel = updateFileModelEvent.getFileModel(); if (fileModel == getFileModel()) { setValue(fileModel); } updateTitle(); } private void updateCurrentValue(String currentValue) { this.currentValue = currentValue; setDisplayedContent(currentValue); } }