Author: vjrj Date: 2008-11-24 19:14:39 +0100 (Mon, 24 Nov 2008) New Revision: 965 Added: trunk/src/main/java/org/ourproject/kune/workspace/client/AbstractFoldableContentActions.java trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContent.java Modified: trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientActions.java trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewer.java trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerPresenter.java trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionRegistry.java trunk/src/main/java/org/ourproject/kune/platf/client/actions/toolbar/ActionToolbarPanel.java trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java trunk/src/main/java/org/ourproject/kune/platf/client/state/SessionDefault.java trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/skel/Toolbar.java Log: Incomplete - task UI tools & workspace refactorization Modified: trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientActions.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientActions.java 2008-11-24 11:49:57 UTC (rev 964) +++ trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientActions.java 2008-11-24 18:14:39 UTC (rev 965) @@ -29,27 +29,14 @@ import static org.ourproject.kune.docs.client.DocumentClientTool.TYPE_WIKIPAGE; import org.ourproject.kune.docs.client.cnt.DocumentViewer; -import org.ourproject.kune.platf.client.actions.ActionEnableCondition; -import org.ourproject.kune.platf.client.actions.ActionMenuItemDescriptor; import org.ourproject.kune.platf.client.actions.ActionToolbarButtonAndItemDescriptor; -import org.ourproject.kune.platf.client.actions.ActionToolbarButtonDescriptor; -import org.ourproject.kune.platf.client.actions.ActionToolbarButtonSeparator; import org.ourproject.kune.platf.client.actions.ActionToolbarMenuAndItemDescriptor; import org.ourproject.kune.platf.client.actions.ActionToolbarMenuDescriptor; -import org.ourproject.kune.platf.client.actions.ActionToolbarPosition; import org.ourproject.kune.platf.client.actions.ContentActionRegistry; import org.ourproject.kune.platf.client.actions.ContextActionRegistry; import org.ourproject.kune.platf.client.dto.AccessRolDTO; -import org.ourproject.kune.platf.client.dto.BasicMimeTypeDTO; -import org.ourproject.kune.platf.client.dto.ContentSimpleDTO; import org.ourproject.kune.platf.client.dto.ContentStatusDTO; -import org.ourproject.kune.platf.client.dto.GroupDTO; -import org.ourproject.kune.platf.client.dto.InitDataDTO; -import org.ourproject.kune.platf.client.dto.StateContainerDTO; -import org.ourproject.kune.platf.client.dto.StateContentDTO; import org.ourproject.kune.platf.client.dto.StateToken; -import org.ourproject.kune.platf.client.errors.SessionExpiredException; -import org.ourproject.kune.platf.client.rpc.AsyncCallbackSimple; import org.ourproject.kune.platf.client.rpc.ContentServiceAsync; import org.ourproject.kune.platf.client.rpc.GroupServiceAsync; import org.ourproject.kune.platf.client.services.KuneErrorHandler; @@ -57,75 +44,47 @@ import org.ourproject.kune.platf.client.state.StateManager; import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; import org.ourproject.kune.platf.client.ui.upload.FileUploader; +import org.ourproject.kune.platf.client.utils.DeferredCommandWrapper; +import org.ourproject.kune.workspace.client.AbstractFoldableContentActions; import org.ourproject.kune.workspace.client.ctxnav.ContextNavigator; import org.ourproject.kune.workspace.client.cxt.ContextPropEditor; import org.ourproject.kune.workspace.client.editor.TextEditor; import org.ourproject.kune.workspace.client.entitylogo.EntityLogo; import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService; -import org.ourproject.kune.workspace.client.site.Site; import com.calclab.suco.client.ioc.Provider; -import com.calclab.suco.client.listener.Listener; -import com.calclab.suco.client.listener.Listener0; -import com.google.gwt.user.client.Command; -import com.google.gwt.user.client.DeferredCommand; -import com.google.gwt.user.client.rpc.AsyncCallback; -public class DocumentClientActions { - - private final I18nUITranslationService i18n; - private final ContextNavigator contextNavigator; - private final Session session; - private final StateManager stateManager; - private final Provider<FileUploader> fileUploaderProvider; - private final ContentActionRegistry contentActionRegistry; - private final ContextActionRegistry contextActionRegistry; - private final Provider<ContentServiceAsync> contentServiceProvider; - private final Provider<GroupServiceAsync> groupServiceProvider; - private final Provider<FileDownloadUtils> fileDownloadProvider; - private final EntityLogo entityLogo; - private final Provider<TextEditor> textEditorProvider; - private final KuneErrorHandler errorHandler; - private final DocumentViewer documentViewer; - private final Provider<ContextPropEditor> contextPropEditorProvider; - +public class DocumentClientActions extends AbstractFoldableContentActions { public DocumentClientActions(final I18nUITranslationService i18n, final ContextNavigator contextNavigator, final Session session, final StateManager stateManager, + final DeferredCommandWrapper deferredCommandWrapper, final Provider<ContentServiceAsync> contentServiceProvider, final Provider<GroupServiceAsync> groupServiceProvider, final Provider<FileUploader> fileUploaderProvider, final ContentActionRegistry contentActionRegistry, final ContextActionRegistry contextActionRegistry, final Provider<FileDownloadUtils> fileDownloadProvider, final EntityLogo entityLogo, final Provider<TextEditor> textEditorProvider, final KuneErrorHandler errorHandler, final DocumentViewer documentViewer, final Provider<ContextPropEditor> contextProvEditorProvider) { - this.i18n = i18n; - this.contextNavigator = contextNavigator; - this.session = session; - this.stateManager = stateManager; - this.contentServiceProvider = contentServiceProvider; - this.groupServiceProvider = groupServiceProvider; - this.fileUploaderProvider = fileUploaderProvider; - this.contextActionRegistry = contextActionRegistry; - this.contentActionRegistry = contentActionRegistry; - this.fileDownloadProvider = fileDownloadProvider; - this.entityLogo = entityLogo; - this.textEditorProvider = textEditorProvider; - this.errorHandler = errorHandler; - this.documentViewer = documentViewer; - this.contextPropEditorProvider = contextProvEditorProvider; - createActions(); + super(session, stateManager, i18n, errorHandler, deferredCommandWrapper, groupServiceProvider, + contentServiceProvider, fileUploaderProvider, contextNavigator, contentActionRegistry, + contextActionRegistry, fileDownloadProvider, textEditorProvider, contextProvEditorProvider, + documentViewer, entityLogo); } - private void createActions() { + @Override + protected void createActions() { + String parentMenuTitle = i18n.t("File"); + String parentMenuTitleCtx = i18n.t("Folder"); + final ActionToolbarMenuAndItemDescriptor<StateToken> addFolder = createFolderAction(TYPE_FOLDER, - "images/nav/folder_add.png", i18n.t("New folder"), i18n.t("Folder"), i18n.t("New"), + "images/nav/folder_add.png", i18n.t("New folder"), parentMenuTitleCtx, i18n.t("New"), i18n.t("New folder")); final ActionToolbarMenuAndItemDescriptor<StateToken> addGallery = createFolderAction(TYPE_GALLERY, - "images/nav/gallery_add.png", i18n.t("New gallery"), i18n.t("Folder"), i18n.t("New"), + "images/nav/gallery_add.png", i18n.t("New gallery"), parentMenuTitleCtx, i18n.t("New"), i18n.t("New gallery")); final ActionToolbarMenuAndItemDescriptor<StateToken> addWiki = createFolderAction(TYPE_WIKI, - "images/nav/wiki_add.png", i18n.t("New wiki"), i18n.t("Folder"), i18n.t("New"), i18n.t("wiki")); + "images/nav/wiki_add.png", i18n.t("New wiki"), parentMenuTitleCtx, i18n.t("New"), i18n.t("wiki")); final ActionToolbarMenuAndItemDescriptor<StateToken> addBlog = createFolderAction(TYPE_BLOG, - "images/nav/blog_add.png", i18n.t("New blog"), i18n.t("Folder"), i18n.t("New"), i18n.t("New blog")); + "images/nav/blog_add.png", i18n.t("New blog"), parentMenuTitleCtx, i18n.t("New"), i18n.t("New blog")); final ActionToolbarMenuAndItemDescriptor<StateToken> addDoc = createDocAction("images/nav/page_add.png", i18n.t("New document"), TYPE_DOCUMENT); @@ -134,181 +93,29 @@ final ActionToolbarMenuAndItemDescriptor<StateToken> addPost = createDocAction("images/nav/post_add.png", i18n.t("New post"), TYPE_POST); - final ActionToolbarMenuAndItemDescriptor<StateToken> delContainer = new ActionToolbarMenuAndItemDescriptor<StateToken>( - AccessRolDTO.Administrator, ActionToolbarPosition.topbar, new Listener<StateToken>() { - public void onEvent(final StateToken token) { - Site.info("Sorry, in development"); - } - }); - delContainer.setParentMenuTitle(i18n.t("Folder")); - delContainer.setTextDescription(i18n.t("Delete folder")); - delContainer.setMustBeConfirmed(true); - delContainer.setConfirmationTitle(i18n.t("Please confirm")); - delContainer.setConfirmationText(i18n.t("You will delete it and also all its contents. Are you sure?")); + final ActionToolbarMenuAndItemDescriptor<StateToken> delContainer = createDelContainerAction("Delete folder", + parentMenuTitleCtx); - final ActionToolbarMenuAndItemDescriptor<StateToken> delContent = new ActionToolbarMenuAndItemDescriptor<StateToken>( - AccessRolDTO.Administrator, ActionToolbarPosition.topbar, new Listener<StateToken>() { - public void onEvent(final StateToken token) { - contentServiceProvider.get().delContent(session.getUserHash(), token, - new AsyncCallbackSimple<String>() { - public void onSuccess(final String result) { - final StateToken parent = token.clone().clearDocument(); - stateManager.gotoToken(parent); - } - }); - } - }); - delContent.setParentMenuTitle(i18n.t("File")); - delContent.setTextDescription(i18n.t("Delete")); - delContent.setMustBeConfirmed(true); - delContent.setConfirmationTitle(i18n.t("Please confirm")); - delContent.setConfirmationText(i18n.t("Are you sure?")); - delContent.setEnableCondition(new ActionEnableCondition<StateToken>() { - public boolean mustBeEnabled(final StateToken itemToken) { - final StateToken defContentToken = session.getCurrentState().getGroup().getDefaultContent().getStateToken(); - return !itemToken.equals(defContentToken); - } - }); + final ActionToolbarMenuAndItemDescriptor<StateToken> delContent = createDelContentAction(parentMenuTitle, + i18n.t("Delete")); - final ActionMenuItemDescriptor<StateToken> go = new ActionMenuItemDescriptor<StateToken>(AccessRolDTO.Viewer, - new Listener<StateToken>() { - public void onEvent(final StateToken token) { - stateManager.gotoToken(token); - } - }); - go.setMustBeAuthenticated(false); - go.setTextDescription(i18n.t("Open")); - go.setIconUrl("images/nav/go.png"); - go.setEnableCondition(new ActionEnableCondition<StateToken>() { - public boolean mustBeEnabled(final StateToken itemToken) { - return !contextNavigator.isSelected(itemToken); - } - }); + final ActionToolbarMenuAndItemDescriptor<StateToken> renameCtn = createContentRenameAction(parentMenuTitle, + i18n.t("Rename")); - final ActionToolbarMenuAndItemDescriptor<StateToken> renameCtn = new ActionToolbarMenuAndItemDescriptor<StateToken>( - AccessRolDTO.Editor, ActionToolbarPosition.topbar, new Listener<StateToken>() { - public void onEvent(final StateToken stateToken) { - contextNavigator.editItem(stateToken); - } - }); - renameCtn.setTextDescription(i18n.t("Rename")); - renameCtn.setParentMenuTitle(i18n.t("File")); + final ActionToolbarMenuAndItemDescriptor<StateToken> renameCtx = createRenameContentInCtxAction( + parentMenuTitleCtx, i18n.t("Rename")); - final ActionToolbarMenuAndItemDescriptor<StateToken> renameCtx = new ActionToolbarMenuAndItemDescriptor<StateToken>( - AccessRolDTO.Editor, ActionToolbarPosition.topbar, new Listener<StateToken>() { - public void onEvent(final StateToken stateToken) { - contextNavigator.editItem(stateToken); - } - }); - renameCtx.setTextDescription(i18n.t("Rename")); - renameCtx.setParentMenuTitle(i18n.t("Folder")); + final ActionToolbarMenuDescriptor<StateToken> setAsDefGroupCnt = createSetAsDefContent(parentMenuTitle); - final ActionToolbarButtonDescriptor<StateToken> goGroupHome = new ActionToolbarButtonDescriptor<StateToken>( - AccessRolDTO.Viewer, ActionToolbarPosition.topbar, new Listener<StateToken>() { - public void onEvent(final StateToken token) { - stateManager.gotoToken(token.getGroup()); - } - }); - goGroupHome.setMustBeAuthenticated(false); - goGroupHome.setIconUrl("images/group-home.png"); - goGroupHome.setEnableCondition(new ActionEnableCondition<StateToken>() { - public boolean mustBeEnabled(final StateToken itemToken) { - final StateToken defContentToken = session.getCurrentState().getGroup().getDefaultContent().getStateToken(); - return !itemToken.equals(defContentToken); - } - }); + final ActionToolbarMenuDescriptor<StateToken> setAsDefGroupCxt = createSetAsDefContent(parentMenuTitleCtx); - final ActionToolbarMenuDescriptor<StateToken> setAsDefGroupCnt; - setAsDefGroupCnt = createSetAsDefContent(); - setAsDefGroupCnt.setParentMenuTitle(i18n.t("File")); + final ActionToolbarMenuDescriptor<StateToken> refreshCnt = createRefreshCntAction(parentMenuTitle); - final ActionToolbarMenuDescriptor<StateToken> setAsDefGroupCxt; - setAsDefGroupCxt = createSetAsDefContent(); - setAsDefGroupCxt.setParentMenuTitle(i18n.t("Folder")); + final ActionToolbarMenuDescriptor<StateToken> refreshCtx = createRefreshCxtAction(parentMenuTitleCtx); - final ActionToolbarMenuDescriptor<StateToken> refreshCtx = new ActionToolbarMenuDescriptor<StateToken>( - AccessRolDTO.Viewer, ActionToolbarPosition.topbar, new Listener<StateToken>() { - public void onEvent(final StateToken stateToken) { - stateManager.reload(); - contextNavigator.selectItem(stateToken); - } - }); - refreshCtx.setMustBeAuthenticated(false); - refreshCtx.setParentMenuTitle(i18n.t("Folder")); - refreshCtx.setTextDescription(i18n.t("Refresh")); - refreshCtx.setIconUrl("images/nav/refresh.png"); - - final ActionToolbarMenuDescriptor<StateToken> refreshCnt = new ActionToolbarMenuDescriptor<StateToken>( - AccessRolDTO.Viewer, ActionToolbarPosition.topbar, new Listener<StateToken>() { - public void onEvent(final StateToken stateToken) { - stateManager.reload(); - contextNavigator.selectItem(stateToken); - } - }); - refreshCnt.setMustBeAuthenticated(false); - refreshCnt.setParentMenuTitle(i18n.t("File")); - refreshCnt.setTextDescription(i18n.t("Refresh")); - refreshCnt.setIconUrl("images/nav/refresh.png"); - final ActionToolbarButtonAndItemDescriptor<StateToken> uploadFile = createUploadAction(i18n.t("Upload file"), "images/nav/upload.png", i18n.t("Upload some files (images, PDFs, ...)"), null); - session.onInitDataReceived(new Listener<InitDataDTO>() { - public void onEvent(final InitDataDTO parameter) { - final ActionToolbarButtonAndItemDescriptor<StateToken> uploadMedia = createUploadAction( - i18n.t("Upload media"), "images/nav/upload.png", i18n.t("Upload some media (images, videos)"), - session.getGalleryPermittedExtensions()); - contextActionRegistry.addAction(uploadMedia, TYPE_GALLERY); - } - }); - - final ActionToolbarButtonDescriptor<StateToken> download = new ActionToolbarButtonDescriptor<StateToken>( - AccessRolDTO.Viewer, ActionToolbarPosition.topbar, new Listener<StateToken>() { - public void onEvent(final StateToken token) { - downloadContent(token); - } - }); - download.setMustBeAuthenticated(false); - download.setTextDescription(i18n.t("Download")); - download.setToolTip(i18n.t("Download this file")); - download.setIconUrl("images/nav/download.png"); - - final ActionMenuItemDescriptor<StateToken> downloadCtx = new ActionMenuItemDescriptor<StateToken>( - AccessRolDTO.Viewer, new Listener<StateToken>() { - public void onEvent(final StateToken token) { - downloadContent(token); - } - }); - downloadCtx.setMustBeAuthenticated(false); - downloadCtx.setTextDescription(i18n.t("Download")); - downloadCtx.setIconUrl("images/nav/download.png"); - - final ActionToolbarMenuAndItemDescriptor<StateToken> setGroupLogo = new ActionToolbarMenuAndItemDescriptor<StateToken>( - AccessRolDTO.Administrator, ActionToolbarPosition.topbar, new Listener<StateToken>() { - public void onEvent(final StateToken token) { - groupServiceProvider.get().setGroupFullLogo(session.getUserHash(), token, - new AsyncCallbackSimple<GroupDTO>() { - public void onSuccess(GroupDTO newGroup) { - Site.info("Logo selected"); - if (session.getCurrentState().getGroup().getShortName().equals( - newGroup.getShortName())) { - session.getCurrentState().setGroup(newGroup); - } - entityLogo.refreshGroupLogo(); - } - }); - } - }); - setGroupLogo.setParentMenuTitle(i18n.t("File")); - setGroupLogo.setTextDescription(i18n.t("Set this as the group logo")); - setGroupLogo.setIconUrl("images/nav/picture.png"); - setGroupLogo.setEnableCondition(new ActionEnableCondition<StateToken>() { - public boolean mustBeEnabled(final StateToken itemToken) { - final BasicMimeTypeDTO mime = session.getContentState().getMimeType(); - return mime != null && mime.getType().equals("image"); - } - }); - final ActionToolbarMenuDescriptor<StateToken> setPublishStatus = createSetStatusAction( AccessRolDTO.Administrator, i18n.t("Published online"), ContentStatusDTO.publishedOnline); final ActionToolbarMenuDescriptor<StateToken> setEditionInProgressStatus = createSetStatusAction( @@ -320,74 +127,6 @@ final ActionToolbarMenuDescriptor<StateToken> setInTheDustBinStatus = createSetStatusAction( AccessRolDTO.Administrator, i18n.t("In the dustbin"), ContentStatusDTO.inTheDustbin); - final ActionToolbarButtonDescriptor<StateToken> translateContent = new ActionToolbarButtonDescriptor<StateToken>( - AccessRolDTO.Editor, ActionToolbarPosition.topbar, new Listener<StateToken>() { - public void onEvent(final StateToken stateToken) { - Site.important(i18n.t("Sorry, this functionality is currently in development")); - } - }); - translateContent.setTextDescription(i18n.tWithNT("Translate", "used in button")); - translateContent.setToolTip(i18n.t("Translate this document to other languages")); - translateContent.setIconUrl("images/language.gif"); - translateContent.setLeftSeparator(ActionToolbarButtonSeparator.spacer); - - final ActionToolbarButtonDescriptor<StateToken> editContent = new ActionToolbarButtonDescriptor<StateToken>( - AccessRolDTO.Editor, ActionToolbarPosition.topbar, new Listener<StateToken>() { - public void onEvent(final StateToken stateToken) { - session.check(new AsyncCallbackSimple<Object>() { - public void onSuccess(final Object result) { - final TextEditor editor = textEditorProvider.get(); - documentViewer.detach(); - contextNavigator.detach(); - contextPropEditorProvider.get().attach(); - editor.editContent(session.getContentState().getContent(), new Listener<String>() { - public void onEvent(final String html) { - Site.showProgressSaving(); - contentServiceProvider.get().save(session.getUserHash(), stateToken, html, - new AsyncCallback<Object>() { - public void onFailure(final Throwable caught) { - Site.hideProgress(); - try { - throw caught; - } catch (final SessionExpiredException e) { - errorHandler.doSessionExpired(); - } catch (final Throwable e) { - Site.error(i18n.t("Error saving document. Retrying...")); - errorHandler.process(caught); - editor.onSaveFailed(); - } - } - - public void onSuccess(Object param) { - Site.hideProgress(); - session.getContentState().setContent(html); - editor.onSaved(); - } - }); - } - }, new Listener0() { - public void onEvent() { - // onClose - DeferredCommand.addCommand(new Command() { - public void execute() { - documentViewer.attach(); - contextPropEditorProvider.get().detach(); - contextNavigator.attach(); - if (session.getCurrentStateToken().equals(stateToken)) { - documentViewer.refreshState(); - } - } - }); - } - }); - } - }); - } - }); - editContent.setTextDescription(i18n.tWithNT("Edit", "used in button")); - editContent.setIconUrl("images/content_edit.png"); - editContent.setLeftSeparator(ActionToolbarButtonSeparator.spacer); - final String[] all = { TYPE_ROOT, TYPE_FOLDER, TYPE_DOCUMENT, TYPE_GALLERY, TYPE_BLOG, TYPE_POST, TYPE_WIKI, TYPE_WIKIPAGE, TYPE_UPLOADEDFILE }; final String[] containersNoRoot = { TYPE_FOLDER, TYPE_GALLERY, TYPE_BLOG, TYPE_WIKI }; @@ -419,135 +158,14 @@ contentActionRegistry.addAction(setAsDefGroupCnt, TYPE_DOCUMENT, TYPE_UPLOADEDFILE); contentActionRegistry.addAction(setAsDefGroupCxt, TYPE_BLOG); contextActionRegistry.addAction(goGroupHome, containers); - // contentActionRegistry.addAction(setGroupLogo, TYPE_UPLOADEDFILE); contextActionRegistry.addAction(downloadCtx, TYPE_UPLOADEDFILE); contentActionRegistry.addAction(editContent, TYPE_DOCUMENT, TYPE_POST, TYPE_WIKIPAGE); contentActionRegistry.addAction(translateContent, TYPE_DOCUMENT, TYPE_FOLDER, TYPE_GALLERY, TYPE_UPLOADEDFILE, TYPE_WIKI, TYPE_WIKIPAGE); } - private ActionToolbarMenuAndItemDescriptor<StateToken> createDocAction(String iconUrl, final String description, - final String typeId) { - final ActionToolbarMenuAndItemDescriptor<StateToken> addDoc = new ActionToolbarMenuAndItemDescriptor<StateToken>( - AccessRolDTO.Editor, ActionToolbarPosition.topbar, new Listener<StateToken>() { - public void onEvent(final StateToken token) { - Site.showProgressProcessing(); - contentServiceProvider.get().addContent(session.getUserHash(), - session.getCurrentState().getStateToken(), description, typeId, - new AsyncCallbackSimple<StateContentDTO>() { - public void onSuccess(final StateContentDTO state) { - contextNavigator.setEditOnNextStateChange(true); - stateManager.setRetrievedState(state); - } - }); - } - }); - addDoc.setTextDescription(description); - addDoc.setParentMenuTitle(i18n.t("Folder")); - addDoc.setParentSubMenuTitle(i18n.t("New")); - addDoc.setIconUrl(iconUrl); - return addDoc; + @Override + protected void createPostSessionInitActions() { + contextActionRegistry.addAction(uploadMedia, TYPE_GALLERY); } - - private ActionToolbarMenuAndItemDescriptor<StateToken> createFolderAction(final String contentTypeId, - final String iconUrl, final String textDescription, final String parentMenuTitle, - final String parentMenuSubtitle, final String defaultName) { - final ActionToolbarMenuAndItemDescriptor<StateToken> addFolder; - addFolder = new ActionToolbarMenuAndItemDescriptor<StateToken>(AccessRolDTO.Editor, - ActionToolbarPosition.topbar, new Listener<StateToken>() { - public void onEvent(final StateToken stateToken) { - Site.showProgressProcessing(); - contentServiceProvider.get().addFolder(session.getUserHash(), stateToken, defaultName, - contentTypeId, new AsyncCallbackSimple<StateContainerDTO>() { - public void onSuccess(final StateContainerDTO state) { - contextNavigator.setEditOnNextStateChange(true); - stateManager.setRetrievedState(state); - } - }); - } - }); - addFolder.setTextDescription(textDescription); - addFolder.setParentMenuTitle(parentMenuTitle); - addFolder.setParentSubMenuTitle(parentMenuSubtitle); - addFolder.setIconUrl(iconUrl); - return addFolder; - } - - private ActionToolbarMenuDescriptor<StateToken> createSetAsDefContent() { - final ActionToolbarMenuDescriptor<StateToken> setAsDefGroupContent; - setAsDefGroupContent = new ActionToolbarMenuDescriptor<StateToken>(AccessRolDTO.Administrator, - ActionToolbarPosition.topbar, new Listener<StateToken>() { - public void onEvent(final StateToken token) { - Site.showProgressProcessing(); - contentServiceProvider.get().setAsDefaultContent(session.getUserHash(), token, - new AsyncCallbackSimple<ContentSimpleDTO>() { - public void onSuccess(final ContentSimpleDTO defContent) { - session.getCurrentState().getGroup().setDefaultContent(defContent); - Site.hideProgress(); - Site.info(i18n.t("Document selected as the group homepage")); - } - }); - } - }); - setAsDefGroupContent.setTextDescription(i18n.t("Set this as the group default page")); - setAsDefGroupContent.setIconUrl("images/group-home.png"); - setAsDefGroupContent.setEnableCondition(new ActionEnableCondition<StateToken>() { - public boolean mustBeEnabled(final StateToken itemToken) { - final StateToken defContentToken = session.getCurrentState().getGroup().getDefaultContent().getStateToken(); - return !itemToken.equals(defContentToken); - } - }); - return setAsDefGroupContent; - } - - private ActionToolbarMenuAndItemDescriptor<StateToken> createSetStatusAction(final AccessRolDTO rol, - final String textDescription, final ContentStatusDTO status) { - final ActionToolbarMenuAndItemDescriptor<StateToken> action = new ActionToolbarMenuAndItemDescriptor<StateToken>( - rol, ActionToolbarPosition.topbar, new Listener<StateToken>() { - public void onEvent(final StateToken stateToken) { - final AsyncCallbackSimple<Object> callback = new AsyncCallbackSimple<Object>() { - public void onSuccess(final Object result) { - session.getContentState().setStatus(status); - contextNavigator.setItemStatus(stateToken, status); - } - }; - if (status.equals(ContentStatusDTO.publishedOnline) || status.equals(ContentStatusDTO.rejected)) { - contentServiceProvider.get().setStatusAsAdmin(session.getUserHash(), stateToken, status, - callback); - } else { - contentServiceProvider.get().setStatus(session.getUserHash(), stateToken, status, callback); - } - } - }); - action.setTextDescription(textDescription); - action.setParentMenuTitle(i18n.t("File")); - action.setParentSubMenuTitle(i18n.t("Change the status")); - return action; - } - - private ActionToolbarButtonAndItemDescriptor<StateToken> createUploadAction(final String textDescription, - final String iconUrl, final String toolTip, final String permitedExtensions) { - final ActionToolbarButtonAndItemDescriptor<StateToken> uploadFile; - uploadFile = new ActionToolbarButtonAndItemDescriptor<StateToken>(AccessRolDTO.Editor, - ActionToolbarPosition.bottombar, new Listener<StateToken>() { - public void onEvent(final StateToken token) { - if (permitedExtensions != null) { - // FIXME: can't be reset ... - // fileUploaderProvider.get().setPermittedExtensions(permitedExtensions); - } else { - // FIXME: can't be reset ... - // fileUploaderProvider.get().resetPermittedExtensions(); - } - fileUploaderProvider.get().show(); - } - }); - uploadFile.setTextDescription(textDescription); - uploadFile.setIconUrl(iconUrl); - uploadFile.setToolTip(toolTip); - return uploadFile; - } - - private void downloadContent(final StateToken token) { - fileDownloadProvider.get().downloadFile(token); - } } Modified: trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java 2008-11-24 11:49:57 UTC (rev 964) +++ trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientModule.java 2008-11-24 18:14:39 UTC (rev 965) @@ -36,27 +36,20 @@ import org.ourproject.kune.platf.client.rpc.ContentServiceAsync; import org.ourproject.kune.platf.client.rpc.GroupServiceAsync; import org.ourproject.kune.platf.client.services.I18nTranslationService; -import org.ourproject.kune.platf.client.services.Images; import org.ourproject.kune.platf.client.services.KuneErrorHandler; import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.state.StateManager; import org.ourproject.kune.platf.client.tool.ToolSelector; import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; import org.ourproject.kune.platf.client.ui.upload.FileUploader; +import org.ourproject.kune.platf.client.utils.DeferredCommandWrapper; import org.ourproject.kune.workspace.client.ctxnav.ContextNavigator; import org.ourproject.kune.workspace.client.cxt.ContextPropEditor; -import org.ourproject.kune.workspace.client.cxt.ContextPropEditorPanel; -import org.ourproject.kune.workspace.client.cxt.ContextPropEditorPresenter; -import org.ourproject.kune.workspace.client.cxt.ContextPropEditorView; import org.ourproject.kune.workspace.client.editor.TextEditor; import org.ourproject.kune.workspace.client.entitylogo.EntityLogo; import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService; -import org.ourproject.kune.workspace.client.i18n.LanguageSelector; import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; -import org.ourproject.kune.workspace.client.tags.TagsSummary; import org.ourproject.kune.workspace.client.themes.WsThemePresenter; -import org.ourproject.kune.workspace.client.title.EntitySubTitle; -import org.ourproject.kune.workspace.client.title.EntityTitle; import com.calclab.suco.client.ioc.decorator.Singleton; import com.calclab.suco.client.ioc.module.AbstractModule; @@ -80,28 +73,14 @@ @Override public DocumentClientActions create() { return new DocumentClientActions($(I18nUITranslationService.class), $(ContextNavigator.class), - $(Session.class), $(StateManager.class), $$(ContentServiceAsync.class), - $$(GroupServiceAsync.class), $$(FileUploader.class), $(ContentActionRegistry.class), - $(ContextActionRegistry.class), $$(FileDownloadUtils.class), $(EntityLogo.class), - $$(TextEditor.class), $(KuneErrorHandler.class), $(DocumentViewer.class), + $(Session.class), $(StateManager.class), $(DeferredCommandWrapper.class), + $$(ContentServiceAsync.class), $$(GroupServiceAsync.class), $$(FileUploader.class), + $(ContentActionRegistry.class), $(ContextActionRegistry.class), $$(FileDownloadUtils.class), + $(EntityLogo.class), $$(TextEditor.class), $(KuneErrorHandler.class), $(DocumentViewer.class), $$(ContextPropEditor.class)); } }); - register(Singleton.class, new Factory<ContextPropEditor>(ContextPropEditor.class) { - @Override - public ContextPropEditor create() { - final ContextPropEditorPresenter presenter = new ContextPropEditorPresenter($(Session.class), - $(StateManager.class), $(ContentCapabilitiesRegistry.class), $$(TagsSummary.class), - $$(ContentServiceAsync.class), $(EntityTitle.class), $(EntitySubTitle.class)); - final ContextPropEditorView view = new ContextPropEditorPanel(presenter, - $(I18nUITranslationService.class), $(WorkspaceSkeleton.class), $$(LanguageSelector.class), - $(Images.class)); - presenter.init(view); - return presenter; - } - }); - register(ToolGroup.class, new Factory<DocumentContext>(DocumentContext.class) { @Override public DocumentContext create() { Modified: trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewer.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewer.java 2008-11-24 11:49:57 UTC (rev 964) +++ trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewer.java 2008-11-24 18:14:39 UTC (rev 965) @@ -19,12 +19,7 @@ */ package org.ourproject.kune.docs.client.cnt; -public interface DocumentViewer { +import org.ourproject.kune.workspace.client.cnt.FoldableContent; - void attach(); - - void detach(); - - void refreshState(); - +public interface DocumentViewer extends FoldableContent { } Modified: trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerPresenter.java 2008-11-24 11:49:57 UTC (rev 964) +++ trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentViewerPresenter.java 2008-11-24 18:14:39 UTC (rev 965) @@ -50,10 +50,6 @@ this.view = view; } - public void refreshState() { - setState(session.getContentState()); - } - @Override protected void setState(StateContentDTO state) { super.setState(state); Modified: trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionRegistry.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionRegistry.java 2008-11-24 11:49:57 UTC (rev 964) +++ trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionRegistry.java 2008-11-24 18:14:39 UTC (rev 965) @@ -22,6 +22,8 @@ import org.ourproject.kune.platf.client.dto.AccessRightsDTO; +import com.allen_sauer.gwt.log.client.Log; + public class ActionRegistry<T> { private static final String GENERIC = "kgenacts"; @@ -36,8 +38,10 @@ } public void addAction(final ActionDescriptor<T> action, String... typeIds) { - for (final String contentTypeId : typeIds) { - final ActionCollection<T> actionColl = getActions(contentTypeId); + assert (action != null); + for (final String typeId : typeIds) { + Log.debug("Registering action '" + action.getText() + "' for " + typeId); + final ActionCollection<T> actionColl = getActions(typeId); actionColl.add(action); } } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/actions/toolbar/ActionToolbarPanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/actions/toolbar/ActionToolbarPanel.java 2008-11-24 11:49:57 UTC (rev 964) +++ trunk/src/main/java/org/ourproject/kune/platf/client/actions/toolbar/ActionToolbarPanel.java 2008-11-24 18:14:39 UTC (rev 965) @@ -40,6 +40,8 @@ this.ws = ws; topbar = new SimpleToolbar(); bottombar = new SimpleToolbar(); + topbar.setWidth("100%"); + bottombar.setWidth("100%"); this.actionManagerProvider = actionManagerProvider; toolbarMenus = new HashMap<String, Menu>(); Modified: trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java 2008-11-24 11:49:57 UTC (rev 964) +++ trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java 2008-11-24 18:14:39 UTC (rev 965) @@ -71,6 +71,10 @@ import org.ourproject.kune.workspace.client.ctxnav.ContextNavigator; import org.ourproject.kune.workspace.client.ctxnav.ContextNavigatorPanel; import org.ourproject.kune.workspace.client.ctxnav.ContextNavigatorPresenter; +import org.ourproject.kune.workspace.client.cxt.ContextPropEditor; +import org.ourproject.kune.workspace.client.cxt.ContextPropEditorPanel; +import org.ourproject.kune.workspace.client.cxt.ContextPropEditorPresenter; +import org.ourproject.kune.workspace.client.cxt.ContextPropEditorView; import org.ourproject.kune.workspace.client.editor.TextEditor; import org.ourproject.kune.workspace.client.editor.TextEditorPanel; import org.ourproject.kune.workspace.client.editor.TextEditorPresenter; @@ -118,7 +122,9 @@ import org.ourproject.kune.workspace.client.site.rpc.UserServiceAsync; import org.ourproject.kune.workspace.client.sitebar.sitesign.SiteSignOutLink; import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; +import org.ourproject.kune.workspace.client.tags.TagsSummary; import org.ourproject.kune.workspace.client.themes.WsThemePresenter; +import org.ourproject.kune.workspace.client.title.EntitySubTitle; import org.ourproject.kune.workspace.client.title.EntityTitle; import com.calclab.suco.client.ioc.decorator.NoDecoration; @@ -495,6 +501,20 @@ } }); + register(Singleton.class, new Factory<ContextPropEditor>(ContextPropEditor.class) { + @Override + public ContextPropEditor create() { + final ContextPropEditorPresenter presenter = new ContextPropEditorPresenter($(Session.class), + $(StateManager.class), $(ContentCapabilitiesRegistry.class), $$(TagsSummary.class), + $$(ContentServiceAsync.class), $(EntityTitle.class), $(EntitySubTitle.class)); + final ContextPropEditorView view = new ContextPropEditorPanel(presenter, + $(I18nUITranslationService.class), $(WorkspaceSkeleton.class), $$(LanguageSelector.class), + $(Images.class)); + presenter.init(view); + return presenter; + } + }); + register(Singleton.class, new Factory<FileDownloadUtils>(FileDownloadUtils.class) { @Override public FileDownloadUtils create() { Modified: trunk/src/main/java/org/ourproject/kune/platf/client/state/SessionDefault.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/state/SessionDefault.java 2008-11-24 11:49:57 UTC (rev 964) +++ trunk/src/main/java/org/ourproject/kune/platf/client/state/SessionDefault.java 2008-11-24 18:14:39 UTC (rev 965) @@ -182,6 +182,7 @@ } private Object[][] mapCountries() { + assert (initData != null); final Object[][] objs = new Object[initData.getCountries().size()][1]; int i = 0; for (I18nCountryDTO country : initData.getCountries()) { @@ -192,6 +193,7 @@ } private Object[][] mapLangs() { + assert (initData != null); final Object[][] objs = new Object[initData.getLanguages().size()][1]; int i = 0; for (I18nLanguageSimpleDTO language : initData.getLanguages()) { @@ -202,6 +204,7 @@ } private void mapTimezones() { + assert (initData != null); timezonesArray = new Object[initData.getTimezones().length][1]; for (int i = 0; i < getTimezones().length; i++) { final Object[] obj = new Object[] { initData.getTimezones()[i] }; Added: trunk/src/main/java/org/ourproject/kune/workspace/client/AbstractFoldableContentActions.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/AbstractFoldableContentActions.java 2008-11-24 11:49:57 UTC (rev 964) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/AbstractFoldableContentActions.java 2008-11-24 18:14:39 UTC (rev 965) @@ -0,0 +1,496 @@ +package org.ourproject.kune.workspace.client; + +import org.ourproject.kune.platf.client.actions.ActionEnableCondition; +import org.ourproject.kune.platf.client.actions.ActionMenuItemDescriptor; +import org.ourproject.kune.platf.client.actions.ActionToolbarButtonAndItemDescriptor; +import org.ourproject.kune.platf.client.actions.ActionToolbarButtonDescriptor; +import org.ourproject.kune.platf.client.actions.ActionToolbarButtonSeparator; +import org.ourproject.kune.platf.client.actions.ActionToolbarMenuAndItemDescriptor; +import org.ourproject.kune.platf.client.actions.ActionToolbarMenuDescriptor; +import org.ourproject.kune.platf.client.actions.ActionToolbarPosition; +import org.ourproject.kune.platf.client.actions.ContentActionRegistry; +import org.ourproject.kune.platf.client.actions.ContextActionRegistry; +import org.ourproject.kune.platf.client.dto.AccessRolDTO; +import org.ourproject.kune.platf.client.dto.BasicMimeTypeDTO; +import org.ourproject.kune.platf.client.dto.ContentSimpleDTO; +import org.ourproject.kune.platf.client.dto.ContentStatusDTO; +import org.ourproject.kune.platf.client.dto.GroupDTO; +import org.ourproject.kune.platf.client.dto.InitDataDTO; +import org.ourproject.kune.platf.client.dto.StateContainerDTO; +import org.ourproject.kune.platf.client.dto.StateContentDTO; +import org.ourproject.kune.platf.client.dto.StateToken; +import org.ourproject.kune.platf.client.errors.SessionExpiredException; +import org.ourproject.kune.platf.client.rpc.AsyncCallbackSimple; +import org.ourproject.kune.platf.client.rpc.ContentServiceAsync; +import org.ourproject.kune.platf.client.rpc.GroupServiceAsync; +import org.ourproject.kune.platf.client.services.KuneErrorHandler; +import org.ourproject.kune.platf.client.state.Session; +import org.ourproject.kune.platf.client.state.StateManager; +import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; +import org.ourproject.kune.platf.client.ui.upload.FileUploader; +import org.ourproject.kune.platf.client.utils.DeferredCommandWrapper; +import org.ourproject.kune.workspace.client.cnt.FoldableContent; +import org.ourproject.kune.workspace.client.ctxnav.ContextNavigator; +import org.ourproject.kune.workspace.client.cxt.ContextPropEditor; +import org.ourproject.kune.workspace.client.editor.TextEditor; +import org.ourproject.kune.workspace.client.entitylogo.EntityLogo; +import org.ourproject.kune.workspace.client.i18n.I18nUITranslationService; +import org.ourproject.kune.workspace.client.site.Site; + +import com.calclab.suco.client.ioc.Provider; +import com.calclab.suco.client.listener.Listener; +import com.calclab.suco.client.listener.Listener0; +import com.google.gwt.user.client.rpc.AsyncCallback; + +public abstract class AbstractFoldableContentActions { + + protected final Session session; + protected final StateManager stateManager; + protected final I18nUITranslationService i18n; + protected final Provider<ContentServiceAsync> contentServiceProvider; + protected final Provider<FileUploader> fileUploaderProvider; + protected final ContextNavigator contextNavigator; + protected final KuneErrorHandler errorHandler; + protected final Provider<GroupServiceAsync> groupServiceProvider; + protected final ContentActionRegistry contentActionRegistry; + protected final ContextActionRegistry contextActionRegistry; + protected final Provider<FileDownloadUtils> fileDownloadProvider; + protected final Provider<TextEditor> textEditorProvider; + protected final Provider<ContextPropEditor> contextPropEditorProvider; + protected final FoldableContent foldableContent; + protected final DeferredCommandWrapper deferredCommandWrapper; + protected final EntityLogo entityLogo; + protected ActionMenuItemDescriptor<StateToken> go; + protected ActionToolbarButtonDescriptor<StateToken> goGroupHome; + protected ActionToolbarButtonAndItemDescriptor<StateToken> uploadMedia; + protected ActionToolbarButtonDescriptor<StateToken> download; + protected ActionMenuItemDescriptor<StateToken> downloadCtx; + protected ActionToolbarButtonDescriptor<StateToken> translateContent; + protected ActionToolbarButtonDescriptor<StateToken> editContent; + + public AbstractFoldableContentActions(Session session, StateManager stateManager, I18nUITranslationService i18n, + KuneErrorHandler errorHandler, DeferredCommandWrapper deferredCommandWrapper, + Provider<GroupServiceAsync> groupServiceProvider, Provider<ContentServiceAsync> contentServiceProvider, + Provider<FileUploader> fileUploaderProvider, ContextNavigator contextNavigator, + ContentActionRegistry contentActionRegistry, ContextActionRegistry contextActionRegistry, + Provider<FileDownloadUtils> fileDownloadProvider, Provider<TextEditor> textEditorProvider, + Provider<ContextPropEditor> contextPropEditorProvider, FoldableContent foldableContent, + EntityLogo entityLogo) { + this.session = session; + this.stateManager = stateManager; + this.i18n = i18n; + this.errorHandler = errorHandler; + this.deferredCommandWrapper = deferredCommandWrapper; + this.groupServiceProvider = groupServiceProvider; + this.contentServiceProvider = contentServiceProvider; + this.fileUploaderProvider = fileUploaderProvider; + this.contextNavigator = contextNavigator; + this.contentActionRegistry = contentActionRegistry; + this.contextActionRegistry = contextActionRegistry; + this.fileDownloadProvider = fileDownloadProvider; + this.textEditorProvider = textEditorProvider; + this.contextPropEditorProvider = contextPropEditorProvider; + this.foldableContent = foldableContent; + this.entityLogo = entityLogo; + createCommonActions(); + createActions(); + session.onInitDataReceived(new Listener<InitDataDTO>() { + public void onEvent(InitDataDTO parameter) { + createCommonPostSessionInitActions(); + createPostSessionInitActions(); + } + }); + } + + protected void createActions() { + } + + protected ActionToolbarMenuAndItemDescriptor<StateToken> createContentRenameAction(String parentMenuTitle, + String textDescription) { + final ActionToolbarMenuAndItemDescriptor<StateToken> renameCtn = new ActionToolbarMenuAndItemDescriptor<StateToken>( + AccessRolDTO.Editor, ActionToolbarPosition.topbar, new Listener<StateToken>() { + public void onEvent(final StateToken stateToken) { + contextNavigator.editItem(stateToken); + } + }); + renameCtn.setTextDescription(textDescription); + renameCtn.setParentMenuTitle(parentMenuTitle); + return renameCtn; + } + + protected ActionToolbarMenuAndItemDescriptor<StateToken> createDelContainerAction(String text, + String parentMenuTitle) { + final ActionToolbarMenuAndItemDescriptor<StateToken> delContainer = new ActionToolbarMenuAndItemDescriptor<StateToken>( + AccessRolDTO.Administrator, ActionToolbarPosition.topbar, new Listener<StateToken>() { + public void onEvent(final StateToken token) { + Site.info("Sorry, in development"); + } + }); + delContainer.setParentMenuTitle(parentMenuTitle); + delContainer.setTextDescription(i18n.t(text)); + delContainer.setMustBeConfirmed(true); + delContainer.setConfirmationTitle(i18n.t("Please confirm")); + delContainer.setConfirmationText(i18n.t("You will delete it and also all its contents. Are you sure?")); + return delContainer; + } + + protected ActionToolbarMenuAndItemDescriptor<StateToken> createDelContentAction(String parentMenuTitle, + String textDescription) { + final ActionToolbarMenuAndItemDescriptor<StateToken> delContent = new ActionToolbarMenuAndItemDescriptor<StateToken>( + AccessRolDTO.Administrator, ActionToolbarPosition.topbar, new Listener<StateToken>() { + public void onEvent(final StateToken token) { + contentServiceProvider.get().delContent(session.getUserHash(), token, + new AsyncCallbackSimple<String>() { + public void onSuccess(final String result) { + final StateToken parent = token.clone().clearDocument(); + stateManager.gotoToken(parent); + } + }); + } + }); + delContent.setParentMenuTitle(parentMenuTitle); + delContent.setTextDescription(textDescription); + delContent.setMustBeConfirmed(true); + delContent.setConfirmationTitle(i18n.t("Please confirm")); + delContent.setConfirmationText(i18n.t("Are you sure?")); + delContent.setEnableCondition(new ActionEnableCondition<StateToken>() { + public boolean mustBeEnabled(final StateToken itemToken) { + final StateToken defContentToken = session.getCurrentState().getGroup().getDefaultContent().getStateToken(); + return !itemToken.equals(defContentToken); + } + }); + return delContent; + } + + protected ActionToolbarMenuAndItemDescriptor<StateToken> createDocAction(String iconUrl, final String description, + final String typeId) { + final ActionToolbarMenuAndItemDescriptor<StateToken> addDoc = new ActionToolbarMenuAndItemDescriptor<StateToken>( + AccessRolDTO.Editor, ActionToolbarPosition.topbar, new Listener<StateToken>() { + public void onEvent(final StateToken token) { + Site.showProgressProcessing(); + contentServiceProvider.get().addContent(session.getUserHash(), + session.getCurrentState().getStateToken(), description, typeId, + new AsyncCallbackSimple<StateContentDTO>() { + public void onSuccess(final StateContentDTO state) { + contextNavigator.setEditOnNextStateChange(true); + stateManager.setRetrievedState(state); + } + }); + } + }); + addDoc.setTextDescription(description); + addDoc.setParentMenuTitle(i18n.t("Folder")); + addDoc.setParentSubMenuTitle(i18n.t("New")); + addDoc.setIconUrl(iconUrl); + return addDoc; + } + + protected ActionToolbarMenuAndItemDescriptor<StateToken> createFolderAction(final String contentTypeId, + final String iconUrl, final String textDescription, final String parentMenuTitle, + final String parentMenuSubtitle, final String defaultName) { + final ActionToolbarMenuAndItemDescriptor<StateToken> addFolder; + addFolder = new ActionToolbarMenuAndItemDescriptor<StateToken>(AccessRolDTO.Editor, + ActionToolbarPosition.topbar, new Listener<StateToken>() { + public void onEvent(final StateToken stateToken) { + Site.showProgressProcessing(); + contentServiceProvider.get().addFolder(session.getUserHash(), stateToken, defaultName, + contentTypeId, new AsyncCallbackSimple<StateContainerDTO>() { + public void onSuccess(final StateContainerDTO state) { + contextNavigator.setEditOnNextStateChange(true); + stateManager.setRetrievedState(state); + } + }); + } + }); + addFolder.setTextDescription(textDescription); + addFolder.setParentMenuTitle(parentMenuTitle); + addFolder.setParentSubMenuTitle(parentMenuSubtitle); + addFolder.setIconUrl(iconUrl); + return addFolder; + } + + protected void createPostSessionInitActions() { + } + + protected ActionToolbarMenuDescriptor<StateToken> createRefreshCntAction(String parentMenuTitle) { + final ActionToolbarMenuDescriptor<StateToken> refreshCnt = new ActionToolbarMenuDescriptor<StateToken>( + AccessRolDTO.Viewer, ActionToolbarPosition.topbar, new Listener<StateToken>() { + public void onEvent(final StateToken stateToken) { + stateManager.reload(); + contextNavigator.selectItem(stateToken); + } + }); + refreshCnt.setMustBeAuthenticated(false); + refreshCnt.setParentMenuTitle(parentMenuTitle); + refreshCnt.setTextDescription(i18n.t("Refresh")); + refreshCnt.setIconUrl("images/nav/refresh.png"); + return refreshCnt; + } + + protected ActionToolbarMenuDescriptor<StateToken> createRefreshCxtAction(String parentMenuTitleCtx) { + final ActionToolbarMenuDescriptor<StateToken> refreshCtx = new ActionToolbarMenuDescriptor<StateToken>( + AccessRolDTO.Viewer, ActionToolbarPosition.topbar, new Listener<StateToken>() { + public void onEvent(final StateToken stateToken) { + stateManager.reload(); + contextNavigator.selectItem(stateToken); + } + }); + refreshCtx.setMustBeAuthenticated(false); + refreshCtx.setParentMenuTitle(parentMenuTitleCtx); + refreshCtx.setTextDescription(i18n.t("Refresh")); + refreshCtx.setIconUrl("images/nav/refresh.png"); + return refreshCtx; + } + + protected ActionToolbarMenuAndItemDescriptor<StateToken> createRenameContentInCtxAction(String parentMenuTitleCtx, + String textDescription) { + final ActionToolbarMenuAndItemDescriptor<StateToken> renameCtx = new ActionToolbarMenuAndItemDescriptor<StateToken>( + AccessRolDTO.Editor, ActionToolbarPosition.topbar, new Listener<StateToken>() { + public void onEvent(final StateToken stateToken) { + contextNavigator.editItem(stateToken); + } + }); + renameCtx.setTextDescription(textDescription); + renameCtx.setParentMenuTitle(parentMenuTitleCtx); + return renameCtx; + } + + protected ActionToolbarMenuDescriptor<StateToken> createSetAsDefContent(String parentMenuTitle) { + final ActionToolbarMenuDescriptor<StateToken> setAsDefGroupContent; + setAsDefGroupContent = new ActionToolbarMenuDescriptor<StateToken>(AccessRolDTO.Administrator, + ActionToolbarPosition.topbar, new Listener<StateToken>() { + public void onEvent(final StateToken token) { + Site.showProgressProcessing(); + contentServiceProvider.get().setAsDefaultContent(session.getUserHash(), token, + new AsyncCallbackSimple<ContentSimpleDTO>() { + public void onSuccess(final ContentSimpleDTO defContent) { + session.getCurrentState().getGroup().setDefaultContent(defContent); + Site.hideProgress(); + Site.info(i18n.t("Document selected as the group homepage")); + } + }); + } + }); + setAsDefGroupContent.setTextDescription(i18n.t("Set this as the group default page")); + setAsDefGroupContent.setIconUrl("images/group-home.png"); + setAsDefGroupContent.setEnableCondition(new ActionEnableCondition<StateToken>() { + public boolean mustBeEnabled(final StateToken itemToken) { + final StateToken defContentToken = session.getCurrentState().getGroup().getDefaultContent().getStateToken(); + return !itemToken.equals(defContentToken); + } + }); + setAsDefGroupContent.setParentMenuTitle(parentMenuTitle); + return setAsDefGroupContent; + } + + protected ActionToolbarMenuAndItemDescriptor<StateToken> createSetStatusAction(final AccessRolDTO rol, + final String textDescription, final ContentStatusDTO status) { + final ActionToolbarMenuAndItemDescriptor<StateToken> action = new ActionToolbarMenuAndItemDescriptor<StateToken>( + rol, ActionToolbarPosition.topbar, new Listener<StateToken>() { + public void onEvent(final StateToken stateToken) { + final AsyncCallbackSimple<Object> callback = new AsyncCallbackSimple<Object>() { + public void onSuccess(final Object result) { + session.getContentState().setStatus(status); + contextNavigator.setItemStatus(stateToken, status); + } + }; + if (status.equals(ContentStatusDTO.publishedOnline) || status.equals(ContentStatusDTO.rejected)) { + contentServiceProvider.get().setStatusAsAdmin(session.getUserHash(), stateToken, status, + callback); + } else { + contentServiceProvider.get().setStatus(session.getUserHash(), stateToken, status, callback); + } + } + }); + action.setTextDescription(textDescription); + action.setParentMenuTitle(i18n.t("File")); + action.setParentSubMenuTitle(i18n.t("Change the status")); + return action; + } + + protected ActionToolbarButtonAndItemDescriptor<StateToken> createUploadAction(final String textDescription, + final String iconUrl, final String toolTip, final String permitedExtensions) { + final ActionToolbarButtonAndItemDescriptor<StateToken> uploadFile; + uploadFile = new ActionToolbarButtonAndItemDescriptor<StateToken>(AccessRolDTO.Editor, + ActionToolbarPosition.bottombar, new Listener<StateToken>() { + public void onEvent(final StateToken token) { + if (permitedExtensions != null) { + // FIXME: can't be reset ... + // fileUploaderProvider.get().setPermittedExtensions(permitedExtensions); + } else { + // FIXME: can't be reset ... + // fileUploaderProvider.get().resetPermittedExtensions(); + } + fileUploaderProvider.get().show(); + } + }); + uploadFile.setTextDescription(textDescription); + uploadFile.setIconUrl(iconUrl); + uploadFile.setToolTip(toolTip); + return uploadFile; + } + + protected void downloadContent(final StateToken token) { + fileDownloadProvider.get().downloadFile(token); + } + + private void createCommonActions() { + go = new ActionMenuItemDescriptor<StateToken>(AccessRolDTO.Viewer, new Listener<StateToken>() { + public void onEvent(final StateToken token) { + stateManager.gotoToken(token); + } + }); + go.setMustBeAuthenticated(false); + go.setTextDescription(i18n.t("Open")); + go.setIconUrl("images/nav/go.png"); + go.setEnableCondition(new ActionEnableCondition<StateToken>() { + public boolean mustBeEnabled(final StateToken itemToken) { + return !contextNavigator.isSelected(itemToken); + } + }); + + goGroupHome = new ActionToolbarButtonDescriptor<StateToken>(AccessRolDTO.Viewer, ActionToolbarPosition.topbar, + new Listener<StateToken>() { + public void onEvent(final StateToken token) { + stateManager.gotoToken(token.getGroup()); + } + }); + goGroupHome.setMustBeAuthenticated(false); + goGroupHome.setIconUrl("images/group-home.png"); + goGroupHome.setEnableCondition(new ActionEnableCondition<StateToken>() { + public boolean mustBeEnabled(final StateToken itemToken) { + final StateToken defContentToken = session.getCurrentState().getGroup().getDefaultContent().getStateToken(); + return !itemToken.equals(defContentToken); + } + }); + goGroupHome.setLeftSeparator(ActionToolbarButtonSeparator.fill); + + download = new ActionToolbarButtonDescriptor<StateToken>(AccessRolDTO.Viewer, ActionToolbarPosition.topbar, + new Listener<StateToken>() { + public void onEvent(final StateToken token) { + downloadContent(token); + } + }); + download.setMustBeAuthenticated(false); + download.setTextDescription(i18n.t("Download")); + download.setToolTip(i18n.t("Download this file")); + download.setIconUrl("images/nav/download.png"); + + downloadCtx = new ActionMenuItemDescriptor<StateToken>(AccessRolDTO.Viewer, new Listener<StateToken>() { + public void onEvent(final StateToken token) { + downloadContent(token); + } + }); + downloadCtx.setMustBeAuthenticated(false); + downloadCtx.setTextDescription(i18n.t("Download")); + downloadCtx.setIconUrl("images/nav/download.png"); + + translateContent = new ActionToolbarButtonDescriptor<StateToken>(AccessRolDTO.Editor, + ActionToolbarPosition.topbar, new Listener<StateToken>() { + public void onEvent(final StateToken stateToken) { + Site.important(i18n.t("Sorry, this functionality is currently in development")); + } + }); + translateContent.setTextDescription(i18n.tWithNT("Translate", "used in button")); + translateContent.setToolTip(i18n.t("Translate this document to other languages")); + translateContent.setIconUrl("images/language.gif"); + translateContent.setLeftSeparator(ActionToolbarButtonSeparator.spacer); + + editContent = new ActionToolbarButtonDescriptor<StateToken>(AccessRolDTO.Editor, ActionToolbarPosition.topbar, + new Listener<StateToken>() { + public void onEvent(final StateToken stateToken) { + session.check(new AsyncCallbackSimple<Object>() { + public void onSuccess(final Object result) { + final TextEditor editor = textEditorProvider.get(); + foldableContent.detach(); + contextNavigator.detach(); + contextPropEditorProvider.get().attach(); + editor.editContent(session.getContentState().getContent(), new Listener<String>() { + public void onEvent(final String html) { + Site.showProgressSaving(); + contentServiceProvider.get().save(session.getUserHash(), stateToken, html, + new AsyncCallback<Object>() { + public void onFailure(final Throwable caught) { + Site.hideProgress(); + try { + throw caught; + } catch (final SessionExpiredException e) { + errorHandler.doSessionExpired(); + } catch (final Throwable e) { + Site.error(i18n.t("Error saving document. Retrying...")); + errorHandler.process(caught); + editor.onSaveFailed(); + } + } + + public void onSuccess(Object param) { + Site.hideProgress(); + session.getContentState().setContent(html); + editor.onSaved(); + } + }); + } + }, new Listener0() { + public void onEvent() { + // onClose + deferredCommandWrapper.addCommand(new Listener0() { + public void onEvent() { + foldableContent.attach(); + contextPropEditorProvider.get().detach(); + contextNavigator.attach(); + if (session.getCurrentStateToken().equals(stateToken)) { + foldableContent.refreshState(); + } + } + }); + } + }); + } + }); + } + }); + editContent.setTextDescription(i18n.tWithNT("Edit", "used in button")); + editContent.setIconUrl("images/content_edit.png"); + editContent.setLeftSeparator(ActionToolbarButtonSeparator.spacer); + + } + + private void createCommonPostSessionInitActions() { + uploadMedia = createUploadAction(i18n.t("Upload media"), "images/nav/upload.png", + i18n.t("Upload some media (images, videos)"), session.getGalleryPermittedExtensions()); + } + + /** + * For future use contentActionRegistry.addAction(setGroupLogo, + * TYPE_UPLOADEDFILE); + */ + @SuppressWarnings("unused") + private ActionToolbarMenuAndItemDescriptor<StateToken> createSetGroupLogoAction(String parentMenuTitle) { + final ActionToolbarMenuAndItemDescriptor<StateToken> setGroupLogo = new ActionToolbarMenuAndItemDescriptor<StateToken>( + AccessRolDTO.Administrator, ActionToolbarPosition.topbar, new Listener<StateToken>() { + public void onEvent(final StateToken token) { + groupServiceProvider.get().setGroupFullLogo(session.getUserHash(), token, + new AsyncCallbackSimple<GroupDTO>() { + public void onSuccess(GroupDTO newGroup) { + Site.info("Logo selected"); + if (session.getCurrentState().getGroup().getShortName().equals( + newGroup.getShortName())) { + session.getCurrentState().setGroup(newGroup); + } + entityLogo.refreshGroupLogo(); + } + }); + } + }); + setGroupLogo.setParentMenuTitle(parentMenuTitle); + setGroupLogo.setTextDescription(i18n.t("Set this as the group logo")); + setGroupLogo.setIconUrl("images/nav/picture.png"); + setGroupLogo.setEnableCondition(new ActionEnableCondition<StateToken>() { + public boolean mustBeEnabled(final StateToken itemToken) { + final BasicMimeTypeDTO mime = session.getContentState().getMimeType(); + return mime != null && mime.getType().equals("image"); + } + }); + return setGroupLogo; + } +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContent.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContent.java 2008-11-24 11:49:57 UTC (rev 964) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContent.java 2008-11-24 18:14:39 UTC (rev 965) @@ -0,0 +1,11 @@ +package org.ourproject.kune.workspace.client.cnt; + +public interface FoldableContent { + + void attach(); + + void detach(); + + void refreshState(); + +} Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java 2008-11-24 11:49:57 UTC (rev 964) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/cnt/FoldableContentPresenter.java 2008-11-24 18:14:39 UTC (rev 965) @@ -13,7 +13,7 @@ import com.calclab.suco.client.listener.Listener; -public abstract class FoldableContentPresenter extends AbstractContentPresenter { +public abstract class FoldableContentPresenter extends AbstractContentPresenter implements FoldableContent { private final String toolName; private final ActionRegistry<StateToken> actionRegistry; @@ -37,6 +37,10 @@ return toolName; } + public void refreshState() { + setState(session.getContentState()); + } + protected void setState(StateAbstractDTO state) { toolbar.detach(); if (state instanceof StateContainerDTO) { Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/skel/Toolbar.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/skel/Toolbar.java 2008-11-24 11:49:57 UTC (rev 964) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/skel/Toolbar.java 2008-11-24 18:14:39 UTC (rev 965) @@ -42,6 +42,10 @@ public void add(final Widget widget) { childPanel.add(widget); + if (widget instanceof SimpleToolbar) { + widget.setWidth("100%"); + childPanel.setCellWidth(widget, "100%"); + } doLayoutIfNeeded(); }