Author: vjrj_ Date: 2011-06-21 22:03:39 +0200 (Tue, 21 Jun 2011) New Revision: 1412 Added: trunk/src/main/java/cc/kune/core/server/manager/file/EntityBackgroundDownloadManager.java trunk/src/main/java/cc/kune/core/server/manager/file/EntityBackgroundUploadManager.java trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityOptionsUploadButton.java trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityUploaderForm.java Modified: trunk/src/main/java/cc/kune/common/client/notify/NotifyUser.java trunk/src/main/java/cc/kune/common/public/kune-common.css trunk/src/main/java/cc/kune/core/client/rpcservices/GroupService.java trunk/src/main/java/cc/kune/core/client/rpcservices/GroupServiceAsync.java trunk/src/main/java/cc/kune/core/client/services/FileDownloadUtils.java trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java trunk/src/main/java/cc/kune/core/public/ws.css trunk/src/main/java/cc/kune/core/server/KuneRackModule.java trunk/src/main/java/cc/kune/core/server/manager/FileManager.java trunk/src/main/java/cc/kune/core/server/manager/GroupManager.java trunk/src/main/java/cc/kune/core/server/manager/file/FileGwtUploadAbstractServlet.java trunk/src/main/java/cc/kune/core/server/manager/file/FileManagerDefault.java trunk/src/main/java/cc/kune/core/server/manager/file/FileUploadManager.java trunk/src/main/java/cc/kune/core/server/manager/file/FileUtils.java trunk/src/main/java/cc/kune/core/server/manager/file/ImageUtilsDefault.java trunk/src/main/java/cc/kune/core/server/manager/impl/GroupManagerDefault.java trunk/src/main/java/cc/kune/core/server/rpc/GroupRPC.java trunk/src/main/java/cc/kune/core/shared/dto/GroupDTO.java trunk/src/main/java/cc/kune/domain/Group.java trunk/src/main/java/cc/kune/gspace/client/GSpaceArmor.java trunk/src/main/java/cc/kune/gspace/client/GSpaceArmorImpl.java trunk/src/main/java/cc/kune/gspace/client/GSpaceArmorImpl.ui.xml trunk/src/main/java/cc/kune/gspace/client/options/logo/CurrentLogoChangedEvent.java trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityOptionsLogoPanel.java trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityOptionsLogoPresenter.java trunk/src/main/java/cc/kune/gspace/client/options/logo/GroupOptionsLogoPresenter.java trunk/src/main/java/cc/kune/gspace/client/options/logo/UserOptionsLogoPresenter.java trunk/src/main/java/cc/kune/gspace/client/options/style/EntityOptionsStyleConfPanel.java trunk/src/main/java/cc/kune/gspace/client/options/style/EntityOptionsStyleConfPresenter.java trunk/src/main/java/cc/kune/gspace/client/options/style/EntityOptionsStyleConfView.java trunk/src/main/java/cc/kune/gspace/client/options/style/GroupOptionsStyleConfPanel.java trunk/src/main/java/cc/kune/gspace/client/options/style/GroupOptionsStyleConfPresenter.java trunk/src/main/java/cc/kune/gspace/client/options/style/UserOptionsStyleConfPanel.java trunk/src/main/java/cc/kune/gspace/client/options/style/UserOptionsStyleConfPresenter.java trunk/src/main/java/cc/kune/gspace/client/resources/gSpaceArmor.css trunk/src/main/java/cc/kune/gspace/client/style/GSpaceBackManager.java trunk/src/main/java/cc/kune/gspace/client/style/GSpaceBackManagerImpl.java trunk/src/main/java/cc/kune/gspace/client/themes/GSpaceThemeManager.java trunk/src/main/java/cc/kune/pspace/client/PSpaceInDevelopment.ui.xml trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientActions.java trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientActions.java trunk/src/main/java/org/ourproject/kune/workspace/client/OldAbstractFoldableContentActions.java Log: Group Background management Modified: trunk/src/main/java/cc/kune/common/client/notify/NotifyUser.java =================================================================== --- trunk/src/main/java/cc/kune/common/client/notify/NotifyUser.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/common/client/notify/NotifyUser.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -20,6 +20,7 @@ package cc.kune.common.client.notify; import cc.kune.common.client.utils.SimpleResponseCallback; +import cc.kune.common.client.utils.TextUtils; import cc.kune.core.client.notify.msgs.UserNotifyEvent; import cc.kune.core.client.notify.spiner.ProgressHideEvent; import cc.kune.core.client.notify.spiner.ProgressShowEvent; @@ -51,6 +52,11 @@ eventBus.fireEvent(new UserNotifyEvent(NotifyLevel.error, message, closeable)); } + public static void error(final String message, final String additionalMessage) { + eventBus.fireEvent(new UserNotifyEvent(NotifyLevel.error, message + + (TextUtils.empty(additionalMessage) ? "" : ": " + additionalMessage))); + } + public static void error(final String message, final String title, final boolean closeable) { eventBus.fireEvent(new UserNotifyEvent(NotifyLevel.error, message, title, closeable)); } Modified: trunk/src/main/java/cc/kune/common/public/kune-common.css =================================================================== --- trunk/src/main/java/cc/kune/common/public/kune-common.css 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/common/public/kune-common.css 2011-06-21 20:03:39 UTC (rev 1412) @@ -211,7 +211,7 @@ float: right; } -.oc-clean { +.oc-clean,.k-clear,.oc-clear,.k-clean { clear: both; } Modified: trunk/src/main/java/cc/kune/core/client/rpcservices/GroupService.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/rpcservices/GroupService.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/client/rpcservices/GroupService.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -32,23 +32,23 @@ @RemoteServiceRelativePath("GroupService") public interface GroupService extends RemoteService { - void changeDefLicense(final String userHash, final StateToken groupToken, final LicenseDTO license); + void changeDefLicense(final String userHash, final StateToken groupToken, final LicenseDTO license); - void changeGroupWsTheme(String userHash, StateToken groupToken, String theme) throws DefaultException; + void changeGroupWsTheme(String userHash, StateToken groupToken, String theme) throws DefaultException; - GroupDTO clearGroupBackImage(String userHash, StateToken token); + GroupDTO clearGroupBackImage(String userHash, StateToken token); - StateToken createNewGroup(String userHash, GroupDTO group, String publicDesc, String tags, String[] enabledTools) - throws DefaultException; + StateToken createNewGroup(String userHash, GroupDTO group, String publicDesc, String tags, + String[] enabledTools) throws DefaultException; - GroupDTO getGroup(String userHash, StateToken token); + GroupDTO getGroup(String userHash, StateToken token); - GroupDTO setGroupBackImage(String userHash, StateToken token); + void setGroupNewMembersJoiningPolicy(String userHash, StateToken groupToken, + AdmissionType admissionPolicy); - void setGroupNewMembersJoiningPolicy(String userHash, StateToken groupToken, AdmissionType admissionPolicy); + void setSocialNetworkVisibility(String userHash, StateToken groupToken, + SocialNetworkVisibility visibility); - void setSocialNetworkVisibility(String userHash, StateToken groupToken, SocialNetworkVisibility visibility); + void setToolEnabled(String userHash, StateToken groupToken, String toolName, boolean enabled); - void setToolEnabled(String userHash, StateToken groupToken, String toolName, boolean enabled); - } Modified: trunk/src/main/java/cc/kune/core/client/rpcservices/GroupServiceAsync.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/rpcservices/GroupServiceAsync.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/client/rpcservices/GroupServiceAsync.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -29,27 +29,26 @@ public interface GroupServiceAsync { - void changeDefLicense(final String userHash, final StateToken groupToken, final LicenseDTO license, - AsyncCallback<Void> asyncCallback); + void changeDefLicense(final String userHash, final StateToken groupToken, final LicenseDTO license, + AsyncCallback<Void> asyncCallback); - void changeGroupWsTheme(String userHash, StateToken groupToken, String theme, AsyncCallback<Void> callback); + void changeGroupWsTheme(String userHash, StateToken groupToken, String theme, + AsyncCallback<Void> callback); - void clearGroupBackImage(String userHash, StateToken token, AsyncCallback<GroupDTO> asyncCallback); + void clearGroupBackImage(String userHash, StateToken token, AsyncCallback<GroupDTO> asyncCallback); - void createNewGroup(String userHash, GroupDTO group, String publicDesc, String tags, String[] enabledTools, - AsyncCallback<StateToken> callback); + void createNewGroup(String userHash, GroupDTO group, String publicDesc, String tags, + String[] enabledTools, AsyncCallback<StateToken> callback); - void getGroup(String userHash, StateToken token, AsyncCallback<GroupDTO> asyncCallback); + void getGroup(String userHash, StateToken token, AsyncCallback<GroupDTO> asyncCallback); - void setGroupBackImage(String userHash, StateToken token, AsyncCallback<GroupDTO> asyncCallback); + void setGroupNewMembersJoiningPolicy(String userHash, StateToken groupToken, + AdmissionType admissionPolicy, AsyncCallback<Void> asyncCallback); - void setGroupNewMembersJoiningPolicy(String userHash, StateToken groupToken, AdmissionType admissionPolicy, - AsyncCallback<Void> asyncCallback); + void setSocialNetworkVisibility(String userHash, StateToken token, SocialNetworkVisibility visibility, + AsyncCallback<Void> asyncCallback); - void setSocialNetworkVisibility(String userHash, StateToken token, SocialNetworkVisibility visibility, - AsyncCallback<Void> asyncCallback); + void setToolEnabled(String userHash, StateToken groupToken, String toolName, boolean enabled, + AsyncCallback<Void> asyncCallback); - void setToolEnabled(String userHash, StateToken groupToken, String toolName, boolean enabled, - AsyncCallback<Void> asyncCallback); - } Modified: trunk/src/main/java/cc/kune/core/client/services/FileDownloadUtils.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/services/FileDownloadUtils.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/client/services/FileDownloadUtils.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -33,6 +33,7 @@ public class FileDownloadUtils { + private static final String BACKDOWNLOADSERVLET = "servlets/EntityBackgroundDownloadManager"; private static final String DOWNLOADSERVLET = "servlets/FileDownloadManager"; protected static final String GROUP_NO_AVATAR_IMAGE = "images/group-def-icon.png"; private static final String LOGODOWNLOADSERVLET = "servlets/EntityLogoDownloadManager"; @@ -67,6 +68,16 @@ DOM.setElementAttribute(RootPanel.get("__download").getElement(), "src", url); } + public String getBackgroundImageUrl(final StateToken token) { + return new Url(GWT.getModuleBaseURL() + BACKDOWNLOADSERVLET, new UrlParam(FileConstants.TOKEN, + token.toString())).toString(); + } + + public String getBackgroundResizedUrl(final StateToken token, final ImageSize imageSize) { + return new Url(GWT.getModuleBaseURL() + BACKDOWNLOADSERVLET, new UrlParam(FileConstants.TOKEN, + token.toString()), new UrlParam(FileConstants.IMGSIZE, imageSize.toString())).toString(); + } + public String getGroupLogo(final GroupDTO group) { return group.hasLogo() ? getLogoImageUrl(group.getStateToken()) : group.isPersonal() ? PERSON_NO_AVATAR_IMAGE : GROUP_NO_AVATAR_IMAGE; Modified: trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/client/sitebar/spaces/SpaceSelectorPresenter.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -28,6 +28,7 @@ import cc.kune.core.client.state.TokenUtils; import cc.kune.core.client.state.UserSignOutEvent; import cc.kune.gspace.client.GSpaceArmor; +import cc.kune.gspace.client.style.GSpaceBackManager; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; @@ -69,6 +70,7 @@ } private final GSpaceArmor armor; + private final GSpaceBackManager backManager; private Space currentSpace; private String groupToken; private String homeToken; @@ -81,12 +83,13 @@ @Inject public SpaceSelectorPresenter(final EventBus eventBus, final StateManager stateManager, final SpaceSelectorView view, final SpaceSelectorProxy proxy, final GSpaceArmor armor, - final Session session, final Provider<SignIn> signIn) { + final Session session, final Provider<SignIn> signIn, final GSpaceBackManager backManager) { super(eventBus, view, proxy); this.stateManager = stateManager; this.armor = armor; this.session = session; this.signIn = signIn; + this.backManager = backManager; currentSpace = null; homeToken = SiteTokens.HOME; userToken = SiteTokens.WAVEINBOX; @@ -124,6 +127,7 @@ private void onGroupSpaceSelect() { armor.selectGroupSpace(); + backManager.restoreBackImage(); getView().setHomeBtnDown(false); getView().setUserBtnDown(false); getView().setGroupBtnDown(true); @@ -133,6 +137,7 @@ private void onHomeSpaceSelect() { armor.selectHomeSpace(); + backManager.clearBackImage(); getView().setHomeBtnDown(true); getView().setUserBtnDown(false); getView().setGroupBtnDown(false); @@ -142,6 +147,7 @@ private void onPublicSpaceSelect() { armor.selectPublicSpace(); + backManager.restoreBackImage(); getView().setHomeBtnDown(false); getView().setUserBtnDown(false); getView().setGroupBtnDown(false); @@ -204,6 +210,7 @@ private void onUserSpaceSelect() { if (session.isLogged()) { armor.selectUserSpace(); + backManager.clearBackImage(); getView().setHomeBtnDown(false); getView().setUserBtnDown(true); getView().setGroupBtnDown(false); Modified: trunk/src/main/java/cc/kune/core/public/ws.css =================================================================== --- trunk/src/main/java/cc/kune/core/public/ws.css 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/public/ws.css 2011-06-21 20:03:39 UTC (rev 1412) @@ -1,5 +1,6 @@ -CHARSET "UTF-8 "; body { - background-color: white; +CHARSET "UTF-8 "; +body { + background-color: transparent; color: black; font-family: 'Ubuntu', Arial; font-size: small; Modified: trunk/src/main/java/cc/kune/core/server/KuneRackModule.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/KuneRackModule.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/server/KuneRackModule.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -33,6 +33,8 @@ import cc.kune.core.client.rpcservices.SocialNetworkService; import cc.kune.core.client.rpcservices.UserService; import cc.kune.core.server.init.FinderRegistry; +import cc.kune.core.server.manager.file.EntityBackgroundDownloadManager; +import cc.kune.core.server.manager.file.EntityBackgroundUploadManager; import cc.kune.core.server.manager.file.EntityLogoDownloadManager; import cc.kune.core.server.manager.file.EntityLogoUploadManager; import cc.kune.core.server.manager.file.FileDownloadManager; @@ -139,7 +141,8 @@ builder.installRESTServices("^/ws/json/", TestJSONService.class, GroupJSONService.class, UserJSONService.class, I18nTranslationJSONService.class, ContentJSONService.class); builder.installServlet("^/ws/servlets/", FileUploadManager.class, FileDownloadManager.class, - EntityLogoUploadManager.class, EntityLogoDownloadManager.class, FileGwtUploadServlet.class); + EntityLogoUploadManager.class, EntityLogoDownloadManager.class, FileGwtUploadServlet.class, + EntityBackgroundDownloadManager.class, EntityBackgroundUploadManager.class); builder.at("^/ws/(.*)$").install(new ForwardFilter("^/ws/(.*)$", "/ws/{0}")); } Modified: trunk/src/main/java/cc/kune/core/server/manager/FileManager.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/manager/FileManager.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/server/manager/FileManager.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -24,31 +24,39 @@ public interface FileManager { - /** - * Create a new file adding a numeric sequence if the file already exists - * - * @param dir - * the directory (use File.separator for dir delimiters) - * @param fileName - * (the new file name) - * @return if 'file.txt' exists it creates 'file 1.txt' and if 'file 1.txt' - * exists it creates 'file 2.txt' and so on - * @throws IOException - */ - File createFileWithSequentialName(String dir, String fileName) throws IOException; + /** + * Create a new file adding a numeric sequence if the file already exists + * + * @param dir + * the directory (use File.separator for dir delimiters) + * @param fileName + * (the new file name) + * @return if 'file.txt' exists it creates 'file 1.txt' and if 'file 1.txt' + * exists it creates 'file 2.txt' and so on + * @throws IOException + */ + File createFileWithSequentialName(String dir, String fileName) throws IOException; - /** - * @param dir - * the directory (use File.separator for dir delimiters) - * @return true if and only if the directory was created, along with all - * necessary parent directories; false otherwise - */ - boolean mkdir(String dir); + /** + * @param dir + * the directory (use File.separator for dir delimiters) + * @return true if and only if the directory was created, along with all + * necessary parent directories; false otherwise + */ + boolean mkdir(String dir); - /** - * @param dir - * the directory (use File.separator for dir delimiters) - */ - boolean rmdir(String dir) throws IOException; + /** + * @param dir + * the directory (use File.separator for dir delimiters) + * @param file + * the file to remove + */ + boolean rm(String dir, String file); + /** + * @param dir + * the directory (use File.separator for dir delimiters) + */ + boolean rmdir(String dir) throws IOException; + } Modified: trunk/src/main/java/cc/kune/core/server/manager/GroupManager.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/manager/GroupManager.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/server/manager/GroupManager.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -32,46 +32,46 @@ public interface GroupManager extends Manager<Group, Long> { - void changeDefLicense(User user, Group group, String licenseShortName); + void changeDefLicense(User user, Group group, String licenseShortName); - void changeWsTheme(User user, Group group, String theme) throws AccessViolationException; + void changeWsTheme(User user, Group group, String theme) throws AccessViolationException; - void clearGroupBackImage(Group group); + void clearGroupBackImage(Group group); - Group createGroup(Group group, User user, String publicDescrip) throws GroupNameInUseException, - UserMustBeLoggedException; + Group createGroup(Group group, User user, String publicDescrip) throws GroupNameInUseException, + UserMustBeLoggedException; - Group createUserGroup(User user) throws GroupNameInUseException, EmailAddressInUseException; + Group createUserGroup(User user) throws GroupNameInUseException, EmailAddressInUseException; - Group createUserGroup(User user, boolean wantPersonalHomepage) throws GroupNameInUseException, - EmailAddressInUseException; + Group createUserGroup(User user, boolean wantPersonalHomepage) throws GroupNameInUseException, + EmailAddressInUseException; - List<Group> findAdminInGroups(Long groupId); + List<Group> findAdminInGroups(Long groupId); - Group findByShortName(String groupName); + Group findByShortName(String groupName); - List<Group> findCollabInGroups(Long groupId); + List<Group> findCollabInGroups(Long groupId); - List<String> findEnabledTools(Long id); + List<String> findEnabledTools(Long id); - /** - * IMPORTANT: returns null if userId is null - * - * @param userId - * @return - */ - Group getGroupOfUserWithId(Long userId); + /** + * IMPORTANT: returns null if userId is null + * + * @param userId + * @return + */ + Group getGroupOfUserWithId(Long userId); - Group getSiteDefaultGroup(); + Group getSiteDefaultGroup(); - SearchResult<Group> search(String search); + SearchResult<Group> search(String search); - SearchResult<Group> search(String search, Integer firstResult, Integer maxResults); + SearchResult<Group> search(String search, Integer firstResult, Integer maxResults); - void setDefaultContent(String groupShortName, Content content); + void setDefaultContent(String groupShortName, Content content); - void setGroupBackImage(Group group, Content content); + void setGroupBackgroundImage(Group group, String backgroundFileName, String mime); - void setToolEnabled(User userLogged, String groupShortName, String toolName, boolean enabled); + void setToolEnabled(User userLogged, String groupShortName, String toolName, boolean enabled); } Added: trunk/src/main/java/cc/kune/core/server/manager/file/EntityBackgroundDownloadManager.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/manager/file/EntityBackgroundDownloadManager.java (rev 0) +++ trunk/src/main/java/cc/kune/core/server/manager/file/EntityBackgroundDownloadManager.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -0,0 +1,120 @@ +/* + * + * Copyright (C) 2007-2011 The kune development team (see CREDITS for details) + * This file is part of kune. + * + * 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. + * + * 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 cc.kune.core.server.manager.file; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.OutputStream; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import cc.kune.core.client.errors.ContentNotFoundException; +import cc.kune.core.client.services.FileConstants; +import cc.kune.core.client.services.ImageSize; +import cc.kune.core.server.manager.GroupManager; +import cc.kune.core.server.properties.KuneProperties; +import cc.kune.core.shared.domain.utils.StateToken; +import cc.kune.domain.Group; + +import com.google.inject.Inject; + +/** + * Some snippets from: + * http://www.onjava.com/pub/a/onjava/excerpt/jebp_3/index1.html?page=1 + * + */ + +public class EntityBackgroundDownloadManager extends HttpServlet { + + static final String APPLICATION_X_DOWNLOAD = "application/x-download"; + + public static final Log LOG = LogFactory.getLog(FileDownloadManager.class); + static final String RESP_HEADER_ATTACHMENT_FILENAME = "attachment; filename=\""; + static final String RESP_HEADER_CONTEND_DISP = "Content-Disposition"; + + static final String RESP_HEADER_END = "\""; + + private static final long serialVersionUID = -1160659289588014049L; + + @Inject + FileUtils fileUtils; + @Inject + GroupManager groupManager; + @Inject + KuneProperties kuneProperties; + + String buildResponse(final StateToken statetoken, final String filename, final String mimeType, + final ImageSize imgsize, final HttpServletResponse resp) throws FileNotFoundException, IOException { + final String absDir = kuneProperties.get(KuneProperties.UPLOAD_LOCATION) + + FileUtils.groupToDir(statetoken.getGroup()); + String absFilename = absDir + filename; + + if (imgsize != null) { + final String imgsizePrefix = "." + imgsize; + final String extension = FileUtils.getFileNameExtension(filename, true); + final String filenameWithoutExtension = FileUtils.getFileNameWithoutExtension(filename, extension); + final String filenameResized = filenameWithoutExtension + imgsizePrefix + extension; + if (fileUtils.exist(absDir + filenameResized)) { + absFilename = absDir + filenameResized; + } + } + + final File file = new File(absFilename); + + resp.setContentLength((int) file.length()); + + final String contentType = mimeType.toString(); + + resp.setContentType(contentType); + LOG.info("Content type returned: " + contentType); + + resp.setHeader(RESP_HEADER_CONTEND_DISP, RESP_HEADER_ATTACHMENT_FILENAME + filename + + RESP_HEADER_END); + return absFilename; + } + + @Override + protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) + throws ServletException, IOException { + + final StateToken stateToken = new StateToken(req.getParameter(FileConstants.TOKEN)); + final String imageSizeS = req.getParameter(FileConstants.IMGSIZE); + final ImageSize imgsize = imageSizeS == null ? null : ImageSize.valueOf(imageSizeS); + + try { + final Group group = groupManager.findByShortName(stateToken.getGroup()); + + final String absFilename = buildResponse(stateToken, group.getBackgroundImage(), + group.getBackgroundMime(), imgsize, resp); + final OutputStream out = resp.getOutputStream(); + FileDownloadManagerUtils.returnFile(absFilename, out); + } catch (final ContentNotFoundException e) { + FileDownloadManagerUtils.returnNotFound(resp); + return; + } + } +} Property changes on: trunk/src/main/java/cc/kune/core/server/manager/file/EntityBackgroundDownloadManager.java ___________________________________________________________________ Name: svn:mime-type + text/plain Added: trunk/src/main/java/cc/kune/core/server/manager/file/EntityBackgroundUploadManager.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/manager/file/EntityBackgroundUploadManager.java (rev 0) +++ trunk/src/main/java/cc/kune/core/server/manager/file/EntityBackgroundUploadManager.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -0,0 +1,103 @@ +/* + * + * Copyright (C) 2007-2011 The kune development team (see CREDITS for details) + * This file is part of kune. + * + * 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. + * + * 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 cc.kune.core.server.manager.file; + +import java.io.File; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import cc.kune.core.server.auth.ActionLevel; +import cc.kune.core.server.auth.Authenticated; +import cc.kune.core.server.auth.Authorizated; +import cc.kune.core.server.manager.FileManager; +import cc.kune.core.server.manager.GroupManager; +import cc.kune.core.server.properties.KuneProperties; +import cc.kune.core.shared.domain.AccessRol; +import cc.kune.core.shared.domain.utils.StateToken; +import cc.kune.core.shared.i18n.I18nTranslationService; +import cc.kune.domain.BasicMimeType; +import cc.kune.domain.Group; + +import com.google.inject.Inject; +import com.google.inject.persist.Transactional; + +public class EntityBackgroundUploadManager extends FileGwtUploadAbstractServlet { + + public static final Log LOG = LogFactory.getLog(FileGwtUploadServlet.class); + private static final long serialVersionUID = 1L; + private final FileManager fileManager; + private final GroupManager groupManager; + private final I18nTranslationService i18n; + + @Inject + public EntityBackgroundUploadManager(final KuneProperties kuneProperties, + final GroupManager groupManager, final I18nTranslationService i18n, final FileManager fileManager) { + super(kuneProperties); + this.groupManager = groupManager; + this.i18n = i18n; + this.fileManager = fileManager; + } + + @Override + @Authenticated + @Authorizated(accessRolRequired = AccessRol.Administrator, actionLevel = ActionLevel.group) + @Transactional + protected String createUploadedFile(final String userHash, final StateToken stateToken, + final String fileName, final FileItem origFile, final String typeId) { + try { + final String mimeTypeS = origFile.getContentType(); + final BasicMimeType mimeType = new BasicMimeType(mimeTypeS); + if (!mimeType.getType().equals("image")) { + return "Trying to set a non image (" + mimeTypeS + ") as group background"; + } + final Group group = groupManager.findByShortName(stateToken.getGroup()); + + if (group == Group.NO_GROUP) { + LOG.error("Group not found trying to set the background"); + return i18n.t("Error uploading file"); + } + + final String relDir = FileUtils.groupToDir(group.getShortName()); + final String absDir = kuneProperties.get(KuneProperties.UPLOAD_LOCATION) + relDir; + fileManager.mkdir(absDir); + + File destFile = null; + final String filenameUTF8 = new String(origFile.getName().getBytes(), UTF8); + destFile = fileManager.createFileWithSequentialName(absDir, filenameUTF8); + origFile.write(destFile); + + final String extension = FileUtils.getFileNameExtension(filenameUTF8, false); + ImageUtilsDefault.generateThumbs(absDir, filenameUTF8, extension, false, + Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_RESIZEWIDTH)), + Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_THUMBSIZE)), + Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_CROPSIZE)), + Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_ICONSIZE))); + + LOG.info("Mimetype: " + mimeType); + groupManager.setGroupBackgroundImage(group, filenameUTF8, mimeTypeS); + + } catch (final Exception e) { + return i18n.t("Error uploading file"); + } + return i18n.t("Success uploading"); + } +} Property changes on: trunk/src/main/java/cc/kune/core/server/manager/file/EntityBackgroundUploadManager.java ___________________________________________________________________ Name: svn:mime-type + text/plain Modified: trunk/src/main/java/cc/kune/core/server/manager/file/FileGwtUploadAbstractServlet.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/manager/file/FileGwtUploadAbstractServlet.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/server/manager/file/FileGwtUploadAbstractServlet.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -34,12 +34,18 @@ import cc.kune.core.server.properties.KuneProperties; import cc.kune.core.shared.domain.utils.StateToken; +import com.google.inject.servlet.RequestScoped; + +@RequestScoped public abstract class FileGwtUploadAbstractServlet extends UploadAction { public static final Log LOG = LogFactory.getLog(FileGwtUploadAbstractServlet.class); private static final long serialVersionUID = 1L; + protected static final String UTF8 = "UTF-8"; + protected final KuneProperties kuneProperties; public FileGwtUploadAbstractServlet(final KuneProperties kuneProperties) { + this.kuneProperties = kuneProperties; this.maxSize = Integer.valueOf(kuneProperties.get(KuneProperties.UPLOAD_MAX_FILE_SIZE_IN_KS)); this.uploadDelay = Integer.valueOf(kuneProperties.get(KuneProperties.UPLOAD_DELAY_FOR_TEST)); } Modified: trunk/src/main/java/cc/kune/core/server/manager/file/FileManagerDefault.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/manager/file/FileManagerDefault.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/server/manager/file/FileManagerDefault.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -22,7 +22,6 @@ import java.io.File; import java.io.IOException; - import cc.kune.core.server.manager.FileManager; import com.google.inject.Singleton; @@ -30,34 +29,43 @@ @Singleton public class FileManagerDefault implements FileManager { - public File createFileWithSequentialName(final String dir, final String fileName) throws IOException { - String fileNameProposal = String.valueOf(fileName); - File file = new File(dir, fileNameProposal); - while (file.exists()) { - fileNameProposal = FileUtils.getNextSequentialFileName(fileNameProposal, true); - // @PMD:REVIEWED:AvoidInstantiatingObjectsInLoops: by vjrj on - // 21/05/09 13:15 - file = new File(dir, fileNameProposal); - } - if (file.createNewFile()) { - return file; - } else { - throw new IOException("Cannot create sequential file name"); - } + @Override + public File createFileWithSequentialName(final String dir, final String fileName) throws IOException { + String fileNameProposal = String.valueOf(fileName); + File file = new File(dir, fileNameProposal); + while (file.exists()) { + fileNameProposal = FileUtils.getNextSequentialFileName(fileNameProposal, true); + // @PMD:REVIEWED:AvoidInstantiatingObjectsInLoops: by vjrj on + // 21/05/09 13:15 + file = new File(dir, fileNameProposal); } - - public boolean mkdir(final String dir) { - return new File(dir).mkdirs(); + if (file.createNewFile()) { + return file; + } else { + throw new IOException("Cannot create sequential file name"); } + } - public boolean rmdir(final String dir) throws IOException { - final File file = new File(dir); - if (!file.isDirectory()) { - throw new IOException("rmdir: " + dir + ": Not a directory"); - } - if (file.listFiles().length != 0) { - throw new IOException("rmdir: " + dir + ": Directory not empty"); - } - return file.delete(); + @Override + public boolean mkdir(final String dir) { + return new File(dir).mkdirs(); + } + + @Override + public boolean rm(final String dir, final String fileName) { + final File file = new File(dir, fileName); + return file.delete(); + } + + @Override + public boolean rmdir(final String dir) throws IOException { + final File file = new File(dir); + if (!file.isDirectory()) { + throw new IOException("rmdir: " + dir + ": Not a directory"); } + if (file.listFiles().length != 0) { + throw new IOException("rmdir: " + dir + ": Directory not empty"); + } + return file.delete(); + } } Modified: trunk/src/main/java/cc/kune/core/server/manager/file/FileUploadManager.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/manager/file/FileUploadManager.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/server/manager/file/FileUploadManager.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -20,14 +20,11 @@ package cc.kune.core.server.manager.file; import java.io.File; -import java.io.FileNotFoundException; -import magick.MagickException; import net.sf.json.JSONObject; import org.apache.commons.fileupload.FileItem; -import cc.kune.core.client.services.ImageSize; import cc.kune.core.server.UserSession; import cc.kune.core.server.access.AccessService; import cc.kune.core.server.auth.ActionLevel; @@ -53,129 +50,109 @@ @RequestScoped public class FileUploadManager extends FileJsonUploadManagerAbstract { - private static final long serialVersionUID = -7209922761735338754L; - @Inject - AccessService accessService; - @Inject - ContentManager contentManager; - @Inject - FileManager fileManager; - @Inject - I18nTranslationService i18n; - @Inject - UserSession userSession; + private static final long serialVersionUID = -7209922761735338754L; + @Inject + AccessService accessService; + @Inject + ContentManager contentManager; + @Inject + FileManager fileManager; + @Inject + I18nTranslationService i18n; + @Inject + UserSession userSession; - @Override - protected void beforePostStart() { - } + @Override + protected void beforePostStart() { + } - @Override - protected JSONObject createJsonResponse(final boolean success, final String message) { - /** - * - * http://max-bazhenov.com/dev/upload-dialog-2.0/index.php - * - * Server side handler. - * - * The files in the queue are posted one at a time, the file field name - * is 'file'. The handler should return json encoded object with - * following properties: { success: true|false, // required error: - * 'Error or success message' // optional, also can be named 'message' } - */ + @Override + protected JSONObject createJsonResponse(final boolean success, final String message) { + /** + * + * http://max-bazhenov.com/dev/upload-dialog-2.0/index.php + * + * Server side handler. + * + * The files in the queue are posted one at a time, the file field name is + * 'file'. The handler should return json encoded object with following + * properties: { success: true|false, // required error: 'Error or success + * message' // optional, also can be named 'message' } + */ - JSONObject response = null; - try { - response = new JSONObject(); - response.put("success", success); - response.put("error", message); - response.put("code", "232"); - } catch (final Exception e) { - LOG.error("Error building response"); - } - return response; + JSONObject response = null; + try { + response = new JSONObject(); + response.put("success", success); + response.put("error", message); + response.put("code", "232"); + } catch (final Exception e) { + LOG.error("Error building response"); } + return response; + } - @Override - protected void createUploadedFile(final String userHash, final StateToken stateToken, final String fileName, - final FileItem file, final String typeId) throws Exception { - createUploadedFileWrapped(userHash, stateToken, fileName, file, typeId); - } + @Override + protected void createUploadedFile(final String userHash, final StateToken stateToken, + final String fileName, final FileItem file, final String typeId) throws Exception { + createUploadedFileWrapped(userHash, stateToken, fileName, file, typeId); + } - @Authenticated - @Authorizated(accessRolRequired = AccessRol.Editor, actionLevel = ActionLevel.container, mustCheckMembership = false) - @Transactional - Content createUploadedFileWrapped(final String userHash, final StateToken stateToken, final String fileName, - final FileItem fileUploadItem, final String typeId) throws Exception { - final String relDir = FileUtils.toDir(stateToken); - final String absDir = kuneProperties.get(KuneProperties.UPLOAD_LOCATION) + relDir; - fileManager.mkdir(absDir); + @Authenticated + @Authorizated(accessRolRequired = AccessRol.Editor, actionLevel = ActionLevel.container, mustCheckMembership = false) + @Transactional + Content createUploadedFileWrapped(final String userHash, final StateToken stateToken, + final String fileName, final FileItem fileUploadItem, final String typeId) throws Exception { + final String relDir = FileUtils.toDir(stateToken); + final String absDir = kuneProperties.get(KuneProperties.UPLOAD_LOCATION) + relDir; + fileManager.mkdir(absDir); - File file = null; - try { - final String filenameUTF8 = new String(fileName.getBytes(), UTF8); - file = fileManager.createFileWithSequentialName(absDir, filenameUTF8); - fileUploadItem.write(file); + File file = null; + try { + final String filenameUTF8 = new String(fileName.getBytes(), UTF8); + file = fileManager.createFileWithSequentialName(absDir, filenameUTF8); + fileUploadItem.write(file); - final String mimetype = fileUploadItem.getContentType(); - final BasicMimeType basicMimeType = new BasicMimeType(mimetype); - LOG.info("Mimetype: " + basicMimeType); - final String extension = FileUtils.getFileNameExtension(file.getName(), false); + final String mimetype = fileUploadItem.getContentType(); + final BasicMimeType basicMimeType = new BasicMimeType(mimetype); + LOG.info("Mimetype: " + basicMimeType); + final String extension = FileUtils.getFileNameExtension(file.getName(), false); - String preview = ""; + String preview = ""; - if (basicMimeType.isImage()) { - generateThumbs(absDir, file.getName(), extension, false); - } else if (basicMimeType.isPdf()) { - generateThumbs(absDir, file.getName(), "png", true); - } else if (basicMimeType.isText()) { - final String textPreview = new String(FileUtils.getBytesFromFile(file)); - preview = "<pre>" + StringW.wordWrap(textPreview) + "</pre>"; - } + if (basicMimeType.isImage()) { + generateThumbs(absDir, file.getName(), extension, false); + } else if (basicMimeType.isPdf()) { + generateThumbs(absDir, file.getName(), "png", true); + } else if (basicMimeType.isText()) { + final String textPreview = new String(FileUtils.getBytesFromFile(file)); + preview = "<pre>" + StringW.wordWrap(textPreview) + "</pre>"; + } - // Persist - final User user = userSession.getUser(); - final Container container = accessService.accessToContainer(ContentUtils.parseId(stateToken.getFolder()), - user, AccessRol.Editor); - final Content content = contentManager.createContent( - FileUtils.getFileNameWithoutExtension(file.getName(), extension), preview, user, container, typeId); - content.setMimeType(basicMimeType); - content.setFilename(file.getName()); - return content; - } catch (final Exception e) { - if (file != null && file.exists()) { - logFileDel(file.delete()); - } - throw e; - } + // Persist + final User user = userSession.getUser(); + final Container container = accessService.accessToContainer( + ContentUtils.parseId(stateToken.getFolder()), user, AccessRol.Editor); + final Content content = contentManager.createContent( + FileUtils.getFileNameWithoutExtension(file.getName(), extension), preview, user, container, + typeId); + content.setMimeType(basicMimeType); + content.setFilename(file.getName()); + return content; + } catch (final Exception e) { + if (file != null && file.exists()) { + logFileDel(file.delete()); + } + throw e; } + } - private void generateThumbs(final String absDir, final String filename, final String extension, final boolean isPdf) { - try { - final String fileOrig = absDir + filename; - final String withoutExtension = FileUtils.getFileNameWithoutExtension(filename, extension); - - final String resizeName = absDir + withoutExtension + "." + ImageSize.sized + "." + extension; - final String thumbName = absDir + withoutExtension + "." + ImageSize.thumb + "." + extension; - final String iconName = absDir + withoutExtension + "." + ImageSize.ico + "." + extension; - final String previewName = absDir + withoutExtension + "." + extension; - - final int resizeWidth = Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_RESIZEWIDTH)); - final int thumbSize = Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_THUMBSIZE)); - final int cropSize = Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_CROPSIZE)); - final int iconSize = Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_ICONSIZE)); - - ImageUtilsDefault.scaleImageToMax(fileOrig, resizeName, resizeWidth); - ImageUtilsDefault.createThumb(fileOrig, thumbName, thumbSize, cropSize); - ImageUtilsDefault.createThumb(fileOrig, iconName, iconSize); - if (isPdf) { - ImageUtilsDefault.createThumbFromPdf(fileOrig, previewName); - } - } catch (final NumberFormatException e) { - LOG.error("Image sizes in kune.properties are not integers", e); - } catch (final MagickException e) { - LOG.info("Problem generating image thumb for " + filename, e); - } catch (final FileNotFoundException e) { - LOG.info("Original image not found generating image thumb for " + filename, e); - } - } + private void generateThumbs(final String absDir, final String filename, final String extension, + final boolean isPdf) { + ImageUtilsDefault.generateThumbs(absDir, filename, extension, isPdf, + Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_RESIZEWIDTH)), + Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_THUMBSIZE)), + Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_CROPSIZE)), + Integer.parseInt(kuneProperties.get(KuneProperties.IMAGES_ICONSIZE))); + } } Modified: trunk/src/main/java/cc/kune/core/server/manager/file/FileUtils.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/manager/file/FileUtils.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/server/manager/file/FileUtils.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -28,109 +28,113 @@ public class FileUtils { - public static final String SLASH = File.separator; + public static final String SLASH = File.separator; - /** - * Snippet from: - * http://www.java-tips.org/java-se-tips/java.io/reading-a-file - * -into-a-byte-array.html - */ - public static byte[] getBytesFromFile(final File file) throws IOException { - final InputStream iStream = new FileInputStream(file); + /** + * Snippet from: http://www.java-tips.org/java-se-tips/java.io/reading-a-file + * -into-a-byte-array.html + */ + public static byte[] getBytesFromFile(final File file) throws IOException { + final InputStream iStream = new FileInputStream(file); - // Get the size of the file - final long length = file.length(); + // Get the size of the file + final long length = file.length(); - if (length > Integer.MAX_VALUE) { - // File is too large - } + if (length > Integer.MAX_VALUE) { + // File is too large + } - // Create the byte array to hold the data - final byte[] bytes = new byte[(int) length]; + // Create the byte array to hold the data + final byte[] bytes = new byte[(int) length]; - // Read in the bytes - int offset = 0; - int numRead = 0; - while (offset < bytes.length && (numRead = iStream.read(bytes, offset, bytes.length - offset)) >= 0) { - offset += numRead; - } - - // Ensure all the bytes have been read in - if (offset < bytes.length) { - throw new IOException("Could not completely read file " + file.getName()); - } - - // Close the input stream and return bytes - iStream.close(); - return bytes; + // Read in the bytes + int offset = 0; + int numRead = 0; + while (offset < bytes.length && (numRead = iStream.read(bytes, offset, bytes.length - offset)) >= 0) { + offset += numRead; } - /** - * For filename extension info see: - * http://en.wikipedia.org/wiki/File_name_extension - * - * @param filename - * @return - */ - public static String getFileNameExtension(final String filename, final boolean withDot) { - // also we can use FilenameUtils - if (filename == null) { - return ""; - } - final int dotIndex = filename.lastIndexOf('.'); - if (dotIndex == -1 || dotIndex == 0) { - return ""; - } else { - if (withDot) { - final String ext = filename.substring(dotIndex); - return ext.length() == 1 ? "" : ext; - } else { - return filename.substring(dotIndex + 1); - } - } + // Ensure all the bytes have been read in + if (offset < bytes.length) { + throw new IOException("Could not completely read file " + file.getName()); } - public static String getFileNameWithoutExtension(final String fileName, final String extension) { - final int extlength = extension.length(); - if (extlength > 0) { - final boolean withDot = extension.charAt(0) == '.'; - return fileName.substring(0, fileName.length() - extlength - (withDot ? 0 : 1)); - } else { - return fileName; - } + // Close the input stream and return bytes + iStream.close(); + return bytes; + } + + /** + * For filename extension info see: + * http://en.wikipedia.org/wiki/File_name_extension + * + * @param filename + * @return + */ + public static String getFileNameExtension(final String filename, final boolean withDot) { + // also we can use FilenameUtils + if (filename == null) { + return ""; } + final int dotIndex = filename.lastIndexOf('.'); + if (dotIndex == -1 || dotIndex == 0) { + return ""; + } else { + if (withDot) { + final String ext = filename.substring(dotIndex); + return ext.length() == 1 ? "" : ext; + } else { + return filename.substring(dotIndex + 1); + } + } + } - public static String getNextSequentialFileName(final String fileName) { - final int lastSpace = fileName.lastIndexOf(" "); - if (lastSpace != -1) { - final String suffix = fileName.substring(lastSpace + 1); - try { - final Integer i = Integer.valueOf(suffix); - return fileName.substring(0, lastSpace + 1) + (i + 1); - } catch (final NumberFormatException e) { - } - } - return fileName + " 1"; + public static String getFileNameWithoutExtension(final String fileName, final String extension) { + final int extlength = extension.length(); + if (extlength > 0) { + final boolean withDot = extension.charAt(0) == '.'; + return fileName.substring(0, fileName.length() - extlength - (withDot ? 0 : 1)); + } else { + return fileName; } + } - public static String getNextSequentialFileName(final String fileName, final boolean preserveExtension) { - if (!preserveExtension) { - return getNextSequentialFileName(fileName); - } - final int dotIndex = fileName.lastIndexOf("."); - if (dotIndex == -1 || dotIndex == 0) { - return getNextSequentialFileName(fileName); - } else { - final String ext = fileName.substring(dotIndex); - return getNextSequentialFileName(fileName.substring(0, dotIndex)) + ext; - } + public static String getNextSequentialFileName(final String fileName) { + final int lastSpace = fileName.lastIndexOf(" "); + if (lastSpace != -1) { + final String suffix = fileName.substring(lastSpace + 1); + try { + final Integer i = Integer.valueOf(suffix); + return fileName.substring(0, lastSpace + 1) + (i + 1); + } catch (final NumberFormatException e) { + } } + return fileName + " 1"; + } - public static String toDir(final StateToken stateToken) { - return SLASH + stateToken.getGroup() + SLASH + stateToken.getTool() + SLASH + stateToken.getFolder() + SLASH; + public static String getNextSequentialFileName(final String fileName, final boolean preserveExtension) { + if (!preserveExtension) { + return getNextSequentialFileName(fileName); } + final int dotIndex = fileName.lastIndexOf("."); + if (dotIndex == -1 || dotIndex == 0) { + return getNextSequentialFileName(fileName); + } else { + final String ext = fileName.substring(dotIndex); + return getNextSequentialFileName(fileName.substring(0, dotIndex)) + ext; + } + } - public boolean exist(final String file) { - return new File(file).exists(); - } + public static String groupToDir(final String groupName) { + return SLASH + groupName + SLASH; + } + + public static String toDir(final StateToken stateToken) { + return SLASH + stateToken.getGroup() + SLASH + stateToken.getTool() + SLASH + stateToken.getFolder() + + SLASH; + } + + public boolean exist(final String file) { + return new File(file).exists(); + } } Modified: trunk/src/main/java/cc/kune/core/server/manager/file/ImageUtilsDefault.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/manager/file/ImageUtilsDefault.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/server/manager/file/ImageUtilsDefault.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -28,173 +28,212 @@ import magick.MagickException; import magick.MagickImage; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import cc.kune.core.client.services.ImageSize; + public class ImageUtilsDefault { - /** - * http://en.wikipedia.org/wiki/Thumbnail - * - * @throws FileNotFoundException - * - */ - public static void createThumb(String fileOrig, String fileDest, int cropDimension) throws MagickException, - FileNotFoundException { - createThumb(fileOrig, fileDest, cropDimension, cropDimension); - } + public static final Log LOG = LogFactory.getLog(ImageUtilsDefault.class); - public static void createThumb(String fileOrig, String fileDest, int thumbDimension, int cropDimension) - throws MagickException, FileNotFoundException { - checkExist(fileOrig); - if (thumbDimension < cropDimension) { - throw new IndexOutOfBoundsException("Thumb dimension must be bigger than crop dimension"); - } - MagickImage imageOrig = readImage(fileOrig); - Dimension origDimension = imageOrig.getDimension(); - int origHeight = origDimension.height; - int origWidth = origDimension.width; - Dimension proportionalDim = calculatePropDim(origWidth, origHeight, thumbDimension, true); - MagickImage scaled = scaleImage(imageOrig, proportionalDim.width, proportionalDim.height); - int x = calculateCenteredCoordinate(proportionalDim.width, cropDimension); - int y = calculateCenteredCoordinate(proportionalDim.height, cropDimension); - cropImage(scaled, fileDest, x, y, cropDimension, cropDimension); - } + static int calculateCenteredCoordinate(final int size, final int crop) { + final int i = (size - crop) / 2; + return i < 0 ? 0 : i; + } - /** - * convert -density 300 -quality 100 -resize 720x file.pdf result.png - * - * @param pdfFile - * @param newPngFile - * @return - * @throws MagickException - */ - static public boolean createThumbFromPdf(String pdfFile, String newPngFile) throws MagickException { - MagickImage pdf = readImage(pdfFile); - MagickImage pdf1 = pdf.breakFrames()[0]; - return writeImage(pdf1, newPngFile); - } + static Dimension calculatePropDim(final int origWidth, final int origHeight, final int maxSize) { + return calculatePropDim(origWidth, origHeight, maxSize, true); + } - public static boolean cropImage(String fileOrig, String fileDest, int x, int y, int width, int height) - throws MagickException, FileNotFoundException { - Rectangle rectangle = new Rectangle(x, y, width, height); - return cropImage(fileOrig, fileDest, rectangle); + static Dimension calculatePropDim(final int origWidth, final int origHeight, final int maxSize, + final boolean toShortest) { + final boolean higher = origHeight > origWidth; + final int propHeight = origHeight * maxSize / origWidth; + final int propWidth = origWidth * maxSize / origHeight; + final double height = toShortest ? (higher ? propHeight : maxSize) : (higher ? maxSize : propHeight); + final double width = toShortest ? (!higher ? propWidth : maxSize) : (!higher ? maxSize : propWidth); + if ((higher && origHeight <= maxSize) || (!higher && origWidth <= maxSize)) { + return new Dimension(origWidth, origHeight); } + return new Dimension((int) width, (int) height); + } - public static boolean cropImage(String fileOrig, String fileDest, Rectangle rectangle) throws MagickException, - FileNotFoundException { - checkExist(fileOrig); - return cropImage(readImage(fileOrig), fileDest, rectangle); + private static void checkExist(final String fileOrig) throws FileNotFoundException { + final File file = new File(fileOrig); + if (!file.exists()) { + throw new FileNotFoundException(); } + } - public static Dimension getDimension(String file) throws MagickException { - MagickImage imageOrig = readImage(file); - return imageOrig.getDimension(); - } + private static ImageInfo createEmptyImageInfo() throws MagickException { + final ImageInfo imageInfo = new ImageInfo(); + return imageInfo; + } - /** - * FIXME: Not working, returns null always (bug) - * - */ - public static String getPage(String file) throws MagickException { - ImageInfo imageInfo = new ImageInfo(file); - new MagickImage(imageInfo); - return imageInfo.getPage(); - } + private static ImageInfo createEmptyImageInfoWithNoPage() throws MagickException { + final ImageInfo imageInfo = createEmptyImageInfo(); + imageInfo.setPage("0x0+0+0"); + return imageInfo; + } - public static boolean scaleImage(String fileOrig, String fileDest, Dimension dimension) throws MagickException, - FileNotFoundException { - checkExist(fileOrig); - MagickImage imageOrig = readImage(fileOrig); - return scaleImage(imageOrig, fileDest, (int) dimension.getWidth(), (int) dimension.getHeight()); - } + /** + * http://en.wikipedia.org/wiki/Thumbnail + * + * @throws FileNotFoundException + * + */ + public static void createThumb(final String fileOrig, final String fileDest, final int cropDimension) + throws MagickException, FileNotFoundException { + createThumb(fileOrig, fileDest, cropDimension, cropDimension); + } - public static boolean scaleImage(String fileOrig, String fileDest, int width, int height) throws MagickException, - FileNotFoundException { - checkExist(fileOrig); - MagickImage imageOrig = readImage(fileOrig); - return scaleImage(imageOrig, fileDest, width, height); + public static void createThumb(final String fileOrig, final String fileDest, final int thumbDimension, + final int cropDimension) throws MagickException, FileNotFoundException { + checkExist(fileOrig); + if (thumbDimension < cropDimension) { + throw new IndexOutOfBoundsException("Thumb dimension must be bigger than crop dimension"); } + final MagickImage imageOrig = readImage(fileOrig); + final Dimension origDimension = imageOrig.getDimension(); + final int origHeight = origDimension.height; + final int origWidth = origDimension.width; + final Dimension proportionalDim = calculatePropDim(origWidth, origHeight, thumbDimension, true); + final MagickImage scaled = scaleImage(imageOrig, proportionalDim.width, proportionalDim.height); + final int x = calculateCenteredCoordinate(proportionalDim.width, cropDimension); + final int y = calculateCenteredCoordinate(proportionalDim.height, cropDimension); + cropImage(scaled, fileDest, x, y, cropDimension, cropDimension); + } - public static boolean scaleImageToMax(String fileOrig, String fileDest, int maxSize) throws MagickException, - FileNotFoundException { - checkExist(fileOrig); - MagickImage imageOrig = readImage(fileOrig); - Dimension origDimension = imageOrig.getDimension(); - int origHeight = origDimension.height; - int origWidth = origDimension.width; - Dimension proportionalDim = calculatePropDim(origWidth, origHeight, maxSize, false); - MagickImage scaled = scaleImage(imageOrig, proportionalDim.width, proportionalDim.height); + /** + * convert -density 300 -quality 100 -resize 720x file.pdf result.png + * + * @param pdfFile + * @param newPngFile + * @return + * @throws MagickException + */ + static public boolean createThumbFromPdf(final String pdfFile, final String newPngFile) + throws MagickException { + final MagickImage pdf = readImage(pdfFile); + final MagickImage pdf1 = pdf.breakFrames()[0]; + return writeImage(pdf1, newPngFile); + } - return writeImage(scaled, fileDest); - } + private static boolean cropImage(final MagickImage fileOrig, final String fileDest, final int x, + final int y, final int width, final int height) throws MagickException { + final Rectangle rectangle = new Rectangle(x, y, width, height); + return cropImage(fileOrig, fileDest, rectangle); + } - static int calculateCenteredCoordinate(int size, int crop) { - int i = (size - crop) / 2; - return i < 0 ? 0 : i; - } + private static boolean cropImage(final MagickImage fileOrig, final String fileDest, + final Rectangle rectangle) throws MagickException { + final MagickImage cropped = fileOrig.cropImage(rectangle); + cropped.setFileName(fileDest); + final ImageInfo imageInfo = createEmptyImageInfoWithNoPage(); + return cropped.writeImage(imageInfo); + } - static Dimension calculatePropDim(int origWidth, int origHeight, int maxSize) { - return calculatePropDim(origWidth, origHeight, maxSize, true); - } + public static boolean cropImage(final String fileOrig, final String fileDest, final int x, + final int y, final int width, final int height) throws MagickException, FileNotFoundException { + final Rectangle rectangle = new Rectangle(x, y, width, height); + return cropImage(fileOrig, fileDest, rectangle); + } - static Dimension calculatePropDim(int origWidth, int origHeight, int maxSize, boolean toShortest) { - boolean higher = origHeight > origWidth; - int propHeight = origHeight * maxSize / origWidth; - int propWidth = origWidth * maxSize / origHeight; - double height = toShortest ? (higher ? propHeight : maxSize) : (higher ? maxSize : propHeight); - double width = toShortest ? (!higher ? propWidth : maxSize) : (!higher ? maxSize : propWidth); - if ((higher && origHeight <= maxSize) || (!higher && origWidth <= maxSize)) { - return new Dimension(origWidth, origHeight); - } - return new Dimension((int) width, (int) height); - } + public static boolean cropImage(final String fileOrig, final String fileDest, final Rectangle rectangle) + throws MagickException, FileNotFoundException { + checkExist(fileOrig); + return cropImage(readImage(fileOrig), fileDest, rectangle); + } - private static void checkExist(String fileOrig) throws FileNotFoundException { - File file = new File(fileOrig); - if (!file.exists()) { - throw new FileNotFoundException(); - } - } + public static void generateThumbs(final String absDir, final String filename, final String extension, + final boolean isPdf, final int resizeWidth, final int thumbSize, final int cropSize, + final int iconSize) { + try { + final String fileOrig = absDir + filename; + final String withoutExtension = FileUtils.getFileNameWithoutExtension(filename, extension); - private static ImageInfo createEmptyImageInfo() throws MagickException { - ImageInfo imageInfo = new ImageInfo(); - return imageInfo; - } + final String resizeName = absDir + withoutExtension + "." + ImageSize.sized + "." + extension; + final String thumbName = absDir + withoutExtension + "." + ImageSize.thumb + "." + extension; + final String iconName = absDir + withoutExtension + "." + ImageSize.ico + "." + extension; + final String previewName = absDir + withoutExtension + "." + extension; - private static ImageInfo createEmptyImageInfoWithNoPage() throws MagickException { - ImageInfo imageInfo = createEmptyImageInfo(); - imageInfo.setPage("0x0+0+0"); - return imageInfo; + scaleImageToMax(fileOrig, resizeName, resizeWidth); + createThumb(fileOrig, thumbName, thumbSize, cropSize); + createThumb(fileOrig, iconName, iconSize); + if (isPdf) { + createThumbFromPdf(fileOrig, previewName); + } + } catch (final NumberFormatException e) { + LOG.error("Image sizes in kune.properties are not integers", e); + } catch (final MagickException e) { + LOG.info("Problem generating image thumb for " + filename, e); + } catch (final FileNotFoundException e) { + LOG.info("Original image not found generating image thumb for " + filename, e); } + } - private static boolean cropImage(MagickImage fileOrig, String fileDest, int x, int y, int width, int height) - throws MagickException { - Rectangle rectangle = new Rectangle(x, y, width, height); - return cropImage(fileOrig, fileDest, rectangle); - } + public static Dimension getDimension(final String file) throws MagickException { + final MagickImage imageOrig = readImage(file); + return imageOrig.getDimension(); + } - private static boolean cropImage(MagickImage fileOrig, String fileDest, Rectangle rectangle) throws MagickException { - MagickImage cropped = fileOrig.cropImage(rectangle); - cropped.setFileName(fileDest); - ImageInfo imageInfo = createEmptyImageInfoWithNoPage(); - return cropped.writeImage(imageInfo); - } + /** + * FIXME: Not working, returns null always (bug) + * + */ + public static String getPage(final String file) throws MagickException { + final ImageInfo imageInfo = new ImageInfo(file); + new MagickImage(imageInfo); + return imageInfo.getPage(); + } - private static MagickImage readImage(String file) throws MagickException { - ImageInfo imageInfo = new ImageInfo(file); - return new MagickImage(imageInfo); - } + private static MagickImage readImage(final String file) throws MagickException { + final ImageInfo imageInfo = new ImageInfo(file); + return new MagickImage(imageInfo); + } - private static MagickImage scaleImage(MagickImage imageOrig, int width, int height) throws MagickException { - return imageOrig.scaleImage(width, height); - } + private static MagickImage scaleImage(final MagickImage imageOrig, final int width, final int height) + throws MagickException { + return imageOrig.scaleImage(width, height); + } - private static boolean scaleImage(MagickImage imageOrig, String fileDest, int width, int height) - throws MagickException { - MagickImage imageDest = scaleImage(imageOrig, width, height); - return writeImage(imageDest, fileDest); - } + private static boolean scaleImage(final MagickImage imageOrig, final String fileDest, final int width, + final int height) throws MagickException { + final MagickImage imageDest = scaleImage(imageOrig, width, height); + return writeImage(imageDest, fileDest); + } - private static boolean writeImage(MagickImage imageDest, String fileDest) throws MagickException { - imageDest.setFileName(fileDest); - return imageDest.writeImage(createEmptyImageInfo()); - } + public static boolean scaleImage(final String fileOrig, final String fileDest, + final Dimension dimension) throws MagickException, FileNotFoundException { + checkExist(fileOrig); + final MagickImage imageOrig = readImage(fileOrig); + return scaleImage(imageOrig, fileDest, (int) dimension.getWidth(), (int) dimension.getHeight()); + } + + public static boolean scaleImage(final String fileOrig, final String fileDest, final int width, + final int height) throws MagickException, FileNotFoundException { + checkExist(fileOrig); + final MagickImage imageOrig = readImage(fileOrig); + return scaleImage(imageOrig, fileDest, width, height); + } + + public static boolean scaleImageToMax(final String fileOrig, final String fileDest, final int maxSize) + throws MagickException, FileNotFoundException { + checkExist(fileOrig); + final MagickImage imageOrig = readImage(fileOrig); + final Dimension origDimension = imageOrig.getDimension(); + final int origHeight = origDimension.height; + final int origWidth = origDimension.width; + final Dimension proportionalDim = calculatePropDim(origWidth, origHeight, maxSize, false); + final MagickImage scaled = scaleImage(imageOrig, proportionalDim.width, proportionalDim.height); + + return writeImage(scaled, fileDest); + } + + private static boolean writeImage(final MagickImage imageDest, final String fileDest) + throws MagickException { + imageDest.setFileName(fileDest); + return imageDest.writeImage(createEmptyImageInfo()); + } } Modified: trunk/src/main/java/cc/kune/core/server/manager/impl/GroupManagerDefault.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/manager/impl/GroupManagerDefault.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/server/manager/impl/GroupManagerDefault.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -33,12 +33,13 @@ import org.hibernate.exception.ConstraintViolationException; import cc.kune.core.client.errors.AccessViolationException; -import cc.kune.core.client.errors.DefaultException; import cc.kune.core.client.errors.EmailAddressInUseException; import cc.kune.core.client.errors.GroupNameInUseException; import cc.kune.core.client.errors.UserMustBeLoggedException; +import cc.kune.core.server.manager.FileManager; import cc.kune.core.server.manager.GroupManager; import cc.kune.core.server.manager.LicenseManager; +import cc.kune.core.server.manager.file.FileUtils; import cc.kune.core.server.properties.DatabaseProperties; import cc.kune.core.server.properties.KuneProperties; import cc.kune.core.server.tool.ServerTool; @@ -66,6 +67,7 @@ @Singleton public class GroupManagerDefault extends DefaultManager<Group, Long> implements GroupManager { + private final FileManager fileManager; private final GroupFinder finder; private final I18nTranslationService i18n; private final KuneProperties kuneProperties; @@ -81,7 +83,8 @@ final UserFinder userFinder, final KuneProperties kuneProperties, final DatabaseProperties properties, final ServerToolRegistry registry, final LicenseManager licenseManager, final LicenseFinder licenseFinder, - final ServerToolRegistry serverToolRegistry, final I18nTranslationService i18n) { + final FileManager fileManager, final ServerToolRegistry serverToolRegistry, + final I18nTranslationService i18n) { super(provider, Group.class); this.finder = finder; this.userFinder = userFinder; @@ -90,6 +93,7 @@ this.registry = registry; this.licenseManager = licenseManager; this.licenseFinder = licenseFinder; + this.fileManager = fileManager; this.serverToolRegistry = serverToolRegistry; this.i18n = i18n; } @@ -112,7 +116,12 @@ @Override public void clearGroupBackImage(final Group group) { - group.setGroupBackImage(null); + final String file = group.getBackgroundImage(); + if (file != null) { + fileManager.rm(FileUtils.groupToDir(group.getShortName()), file); + } + group.setBackgroundImage(null); + group.setBackgroundMime(null); } @Override @@ -271,12 +280,11 @@ } @Override - public void setGroupBackImage(final Group group, final Content content) { - if (content.getMimeType().isImage()) { - group.setGroupBackImage(content); - } else { - throw new DefaultException("Trying to set not a image as group logo"); - } + public void setGroupBackgroundImage(final Group group, final String backgroundFileName, + final String mime) { + clearGroupBackImage(group); + group.setBackgroundImage(backgroundFileName); + group.setBackgroundMime(mime); } @Override Modified: trunk/src/main/java/cc/kune/core/server/rpc/GroupRPC.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/rpc/GroupRPC.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/server/rpc/GroupRPC.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -26,7 +26,6 @@ import cc.kune.core.server.auth.Authenticated; import cc.kune.core.server.auth.Authorizated; import cc.kune.core.server.content.ContentManager; -import cc.kune.core.server.content.ContentUtils; import cc.kune.core.server.manager.GroupManager; import cc.kune.core.server.mapper.Mapper; import cc.kune.core.shared.domain.AccessRol; @@ -36,7 +35,6 @@ import cc.kune.core.shared.dto.GroupDTO; import cc.kune.core.shared.dto.LicenseDTO; import cc.kune.core.shared.i18n.I18nTranslationService; -import cc.kune.domain.Content; import cc.kune.domain.Group; import cc.kune.domain.User; import cc.kune.wave.server.KuneWaveManagerDefault; @@ -130,17 +128,6 @@ } @Override - @Authenticated - @Authorizated(actionLevel = ActionLevel.group, accessRolRequired = AccessRol.Administrator) - @Transactional - public GroupDTO setGroupBackImage(final String userHash, final StateToken token) { - final Group group = groupManager.findByShortName(token.getGroup()); - final Content content = contentManager.find(ContentUtils.parseId(token.getDocument())); - groupManager.setGroupBackImage(group, content); - return mapper.map(group, GroupDTO.class); - } - - @Override @Authenticated(mandatory = true) @Authorizated(accessRolRequired = AccessRol.Administrator, actionLevel = ActionLevel.group) @Transactional Modified: trunk/src/main/java/cc/kune/core/shared/dto/GroupDTO.java =================================================================== --- trunk/src/main/java/cc/kune/core/shared/dto/GroupDTO.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/core/shared/dto/GroupDTO.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -26,163 +26,163 @@ public class GroupDTO implements IsSerializable { - AdmissionType admissionType; - private ContentSimpleDTO defaultContent; - private LicenseDTO defaultLicense; - private ContentSimpleDTO groupBackImage; - private GroupType groupType; - private boolean hasLogo; - private Long id; - private String longName; - private String shortName; - private StateToken stateToken; - private String workspaceTheme; + AdmissionType admissionType; + private String backgroundImage; + private ContentSimpleDTO defaultContent; + private LicenseDTO defaultLicense; + private GroupType groupType; + private boolean hasLogo; + private Long id; + private String longName; + private String shortName; + private StateToken stateToken; + private String workspaceTheme; - public GroupDTO() { - this(null, null, GroupType.ORGANIZATION); - } + public GroupDTO() { + this(null, null, GroupType.ORGANIZATION); + } - public GroupDTO(final String shortName, final String longName, final GroupType type) { - this.shortName = shortName; - this.longName = longName; - this.groupType = type; - } + public GroupDTO(final String shortName, final String longName, final GroupType type) { + this.shortName = shortName; + this.longName = longName; + this.groupType = type; + } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final GroupDTO other = (GroupDTO) obj; - if (shortName == null) { - if (other.shortName != null) { - return false; - } - } else if (!shortName.equals(other.shortName)) { - return false; - } - return true; + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; } - - public AdmissionType getAdmissionType() { - return admissionType; + if (obj == null) { + return false; } - - public ContentSimpleDTO getDefaultContent() { - return defaultContent; + if (getClass() != obj.getClass()) { + return false; } - - public LicenseDTO getDefaultLicense() { - return defaultLicense; + final GroupDTO other = (GroupDTO) obj; + if (shortName == null) { + if (other.shortName != null) { + return false; + } + } else if (!shortName.equals(other.shortName)) { + return false; } + return true; + } - public ContentSimpleDTO getGroupBackImage() { - return groupBackImage; - } + public AdmissionType getAdmissionType() { + return admissionType; + } - public GroupType getGroupType() { - return groupType; - } + public String getBackgroundImage() { + return backgroundImage; + } - public boolean getHasLogo() { - return hasLogo; - } + public ContentSimpleDTO getDefaultContent() { + return defaultContent; + } - public Long getId() { - return id; - } + public LicenseDTO getDefaultLicense() { + return defaultLicense; + } - public String getLongName() { - return longName; - } + public GroupType getGroupType() { + return groupType; + } - public String getShortName() { - return shortName; - } + public boolean getHasLogo() { + return hasLogo; + } - public StateToken getStateToken() { - if (stateToken == null) { - stateToken = new StateToken(shortName); - } - return stateToken; - } + public Long getId() { + return id; + } - public String getWorkspaceTheme() { - return workspaceTheme; - } + public String getLongName() { + return longName; + } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (defaultLicense == null ? 0 : defaultLicense.hashCode()); - result = prime * result + (id == null ? 0 : id.hashCode()); - result = prime * result + (longName == null ? 0 : longName.hashCode()); - result = prime * result + (shortName == null ? 0 : shortName.hashCode()); - result = prime * result + (groupType == null ? 0 : groupType.hashCode()); - return result; - } + public String getShortName() { + return shortName; + } - public boolean hasLogo() { - return getHasLogo(); + public StateToken getStateToken() { + if (stateToken == null) { + stateToken = new StateToken(shortName); } + return stateToken; + } - public boolean isNotPersonal() { - return !isPersonal(); - } + public String getWorkspaceTheme() { + return workspaceTheme; + } - public boolean isPersonal() { - return groupType.equals(GroupType.PERSONAL); - } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (defaultLicense == null ? 0 : defaultLicense.hashCode()); + result = prime * result + (id == null ? 0 : id.hashCode()); + result = prime * result + (longName == null ? 0 : longName.hashCode()); + result = prime * result + (shortName == null ? 0 : shortName.hashCode()); + result = prime * result + (groupType == null ? 0 : groupType.hashCode()); + return result; + } - public void setAdmissionType(final AdmissionType admissionType) { - this.admissionType = admissionType; - } + public boolean hasLogo() { + return getHasLogo(); + } - public void setDefaultContent(final ContentSimpleDTO defaultContent) { - this.defaultContent = defaultContent; - } + public boolean isNotPersonal() { + return !isPersonal(); + } - public void setDefaultLicense(final LicenseDTO defaultLicense) { - this.defaultLicense = defaultLicense; - } + public boolean isPersonal() { + return groupType.equals(GroupType.PERSONAL); + } - public void setGroupBackImage(final ContentSimpleDTO groupBackImage) { - this.groupBackImage = groupBackImage; - } + public void setAdmissionType(final AdmissionType admissionType) { + this.admissionType = admissionType; + } - public void setGroupType(final GroupType groupType) { - this.groupType = groupType; - } + public void setBackgroundImage(final String backgroundImage) { + this.backgroundImage = backgroundImage; + } - public void setHasLogo(final boolean hasLogo) { - this.hasLogo = hasLogo; - } + public void setDefaultContent(final ContentSimpleDTO defaultContent) { + this.defaultContent = defaultContent; + } - public void setId(final Long id) { - this.id = id; - } + public void setDefaultLicense(final LicenseDTO defaultLicense) { + this.defaultLicense = defaultLicense; + } - public void setLongName(final String name) { - this.longName = name; - } + public void setGroupType(final GroupType groupType) { + this.groupType = groupType; + } - public void setShortName(final String shortName) { - this.shortName = shortName; - } + public void setHasLogo(final boolean hasLogo) { + this.hasLogo = hasLogo; + } - public void setWorkspaceTheme(final String workspaceTheme) { - this.workspaceTheme = workspaceTheme; - } + public void setId(final Long id) { + this.id = id; + } - @Override - public String toString() { - return "GroupDTO[" + shortName + "]"; - } + public void setLongName(final String name) { + this.longName = name; + } + + public void setShortName(final String shortName) { + this.shortName = shortName; + } + + public void setWorkspaceTheme(final String workspaceTheme) { + this.workspaceTheme = workspaceTheme; + } + + @Override + public String toString() { + return "GroupDTO[" + shortName + "]"; + } } Modified: trunk/src/main/java/cc/kune/domain/Group.java =================================================================== --- trunk/src/main/java/cc/kune/domain/Group.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/domain/Group.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -55,258 +55,268 @@ @Table(name = "groups") public class Group implements HasId { - // see: http://docs.codehaus.org/display/PICO/Good+Citizen: - // Never expect or return null - public static final Group NO_GROUP = null; - // public static final String PROPS_ID = "groupprops"; + // see: http://docs.codehaus.org/display/PICO/Good+Citizen: + // Never expect or return null + public static final Group NO_GROUP = null; + // public static final String PROPS_ID = "groupprops"; - @Enumerated(EnumType.STRING) - @Column(nullable = false) - AdmissionType admissionType; + @Enumerated(EnumType.STRING) + @Column(nullable = false) + AdmissionType admissionType; - @Basic(optional = false) - private final Long createdOn; + private String backgroundImage; - @OneToOne - private Content defaultContent; + private String backgroundMime; - @OneToOne - private License defaultLicense; + @Basic(optional = false) + private final Long createdOn; - @OneToOne - private Content groupBackImage; + @OneToOne + private Content defaultContent; - @Enumerated(EnumType.STRING) - @Column(nullable = false) - GroupType groupType; + @OneToOne + private License defaultLicense; - @Id - @DocumentId - @GeneratedValue - private Long id; + @Enumerated(EnumType.STRING) + @Column(nullable = false) + GroupType groupType; - @Lob - private byte[] logo; + @Id + @DocumentId + @GeneratedValue + private Long id; - @Embedded - private BasicMimeType logoMime; + @Lob + private byte[] logo; - @Field(index = Index.TOKENIZED, store = Store.NO) - @Column(unique = true) - @Length(min = 3, max = 50, message = "The longName must be between 3 and 50 characters of length") - private String longName; + @Embedded + private BasicMimeType logoMime; - @Field(index = Index.UN_TOKENIZED, store = Store.NO) - @Column(unique = true) - @Length(min = 3, max = 15, message = "The shortname must be between 3 and 15 characters of length") - @Pattern(regex = "^[a-z0-9]+$", message = "The name must be between 3 and 15 lowercase characters. It can only contain Western characters, numbers, and dashes") - private String shortName; + @Field(index = Index.TOKENIZED, store = Store.NO) + @Column(unique = true) + @Length(min = 3, max = 50, message = "The longName must be between 3 and 50 characters of length") + private String longName; - @OneToOne(cascade = CascadeType.ALL) - private SocialNetwork socialNetwork; + @Field(index = Index.UN_TOKENIZED, store = Store.NO) + @Column(unique = true) + @Length(min = 3, max = 15, message = "The shortname must be between 3 and 15 characters of length") + @Pattern(regex = "^[a-z0-9]+$", message = "The name must be between 3 and 15 lowercase characters. It can only contain Western characters, numbers, and dashes") + private String shortName; - @OneToMany - private final Map<String, ToolConfiguration> toolsConfig; + @OneToOne(cascade = CascadeType.ALL) + private SocialNetwork socialNetwork; - private String workspaceTheme; + @OneToMany + private final Map<String, ToolConfiguration> toolsConfig; - public Group() { - this(null, null, null, null); - } + private String workspaceTheme; - public Group(final String shortName, final String longName) { - this(shortName, longName, null, GroupType.PROJECT); - } + public Group() { + this(null, null, null, null); + } - public Group(final String shortName, final String longName, final License defaultLicense, final GroupType type) { - this.shortName = shortName; - this.longName = longName; - this.toolsConfig = new HashMap<String, ToolConfiguration>(); - this.socialNetwork = new SocialNetwork(); - this.defaultLicense = defaultLicense; - this.groupType = type; - this.admissionType = AdmissionType.Moderated; - this.createdOn = System.currentTimeMillis(); - } + public Group(final String shortName, final String longName) { + this(shortName, longName, null, GroupType.PROJECT); + } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Group other = (Group) obj; - if (shortName == null) { - if (other.shortName != null) { - return false; - } - } else if (!shortName.equals(other.shortName)) { - return false; - } - return true; - } + public Group(final String shortName, final String longName, final License defaultLicense, + final GroupType type) { + this.shortName = shortName; + this.longName = longName; + this.toolsConfig = new HashMap<String, ToolConfiguration>(); + this.socialNetwork = new SocialNetwork(); + this.defaultLicense = defaultLicense; + this.groupType = type; + this.admissionType = AdmissionType.Moderated; + this.createdOn = System.currentTimeMillis(); + } - public boolean existToolConfig(final String toolName) { - return toolsConfig.get(toolName) != null; + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; } - - @Transient - public AccessLists getAccessLists() { - return getSocialNetwork().getAccessLists(); + if (obj == null) { + return false; } - - public AdmissionType getAdmissionType() { - return admissionType; + if (getClass() != obj.getClass()) { + return false; } - - public Long getCreatedOn() { - return createdOn; + final Group other = (Group) obj; + if (shortName == null) { + if (other.shortName != null) { + return false; + } + } else if (!shortName.equals(other.shortName)) { + return false; } + return true; + } - public Content getDefaultContent() { - return defaultContent; - } + public boolean existToolConfig(final String toolName) { + return toolsConfig.get(toolName) != null; + } - public License getDefaultLicense() { - return defaultLicense; - } + @Transient + public AccessLists getAccessLists() { + return getSocialNetwork().getAccessLists(); + } - public Content getGroupBackImage() { - return groupBackImage; - } + public AdmissionType getAdmissionType() { + return admissionType; + } - public GroupType getGroupType() { - return groupType; - } + public String getBackgroundImage() { + return backgroundImage; + } - public boolean getHasLogo() { - return hasLogo(); - } + public String getBackgroundMime() { + return backgroundMime; + } - @Override - public Long getId() { - return id; - } + public Long getCreatedOn() { + return createdOn; + } - public byte[] getLogo() { - return logo; - } + public Content getDefaultContent() { + return defaultContent; + } - public BasicMimeType getLogoMime() { - return logoMime; - } + public License getDefaultLicense() { + return defaultLicense; + } - public String getLongName() { - return longName; - } + public GroupType getGroupType() { + return groupType; + } - public Container getRoot(final String toolName) { - return toolsConfig.get(toolName).getRoot(); - } + public boolean getHasLogo() { + return hasLogo(); + } - public String getShortName() { - return shortName; - } + @Override + public Long getId() { + return id; + } - public SocialNetwork getSocialNetwork() { - return socialNetwork; - } + public byte[] getLogo() { + return logo; + } - @Transient - public StateToken getStateToken() { - return new StateToken(shortName); - } + public BasicMimeType getLogoMime() { + return logoMime; + } - public ToolConfiguration getToolConfiguration(final String name) { - return toolsConfig.get(name); - } + public String getLongName() { + return longName; + } - public Map<String, ToolConfiguration> getToolsConfig() { - return toolsConfig; - } + public Container getRoot(final String toolName) { + return toolsConfig.get(toolName).getRoot(); + } - public String getWorkspaceTheme() { - return workspaceTheme; - } + public String getShortName() { + return shortName; + } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (shortName == null ? 0 : shortName.hashCode()); - return result; - } + public SocialNetwork getSocialNetwork() { + return socialNetwork; + } - @Transient - public boolean hasLogo() { - return (logo != null && logo.length > 0 && logoMime != null); - } + @Transient + public StateToken getStateToken() { + return new StateToken(shortName); + } - public boolean isPersonal() { - return getGroupType().equals(GroupType.PERSONAL); - } + public ToolConfiguration getToolConfiguration(final String name) { + return toolsConfig.get(name); + } - public void setAdmissionType(final AdmissionType admissionType) { - this.admissionType = admissionType; - } + public Map<String, ToolConfiguration> getToolsConfig() { + return toolsConfig; + } - public void setDefaultContent(final Content defaultContent) { - this.defaultContent = defaultContent; - } + public String getWorkspaceTheme() { + return workspaceTheme; + } - public void setDefaultLicense(final License defaultLicense) { - this.defaultLicense = defaultLicense; - } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (shortName == null ? 0 : shortName.hashCode()); + return result; + } - public void setGroupBackImage(final Content groupBackImage) { - this.groupBackImage = groupBackImage; - } + @Transient + public boolean hasLogo() { + return (logo != null && logo.length > 0 && logoMime != null); + } - public void setGroupType(final GroupType groupType) { - this.groupType = groupType; - } + public boolean isPersonal() { + return getGroupType().equals(GroupType.PERSONAL); + } - @Override - public void setId(final Long id) { - this.id = id; - } + public void setAdmissionType(final AdmissionType admissionType) { + this.admissionType = admissionType; + } - public void setLogo(final byte[] logo) { - this.logo = logo; - } + public void setBackgroundImage(final String backgroundImage) { + this.backgroundImage = backgroundImage; + } - public void setLogoMime(final BasicMimeType logoMime) { - this.logoMime = logoMime; - } + public void setBackgroundMime(final String backgroundMime) { + this.backgroundMime = backgroundMime; + } - public void setLongName(final String longName) { - this.longName = longName; - } + public void setDefaultContent(final Content defaultContent) { + this.defaultContent = defaultContent; + } - public void setShortName(final String shortName) { - this.shortName = shortName; - } + public void setDefaultLicense(final License defaultLicense) { + this.defaultLicense = defaultLicense; + } - public void setSocialNetwork(final SocialNetwork socialNetwork) { - this.socialNetwork = socialNetwork; - } + public void setGroupType(final GroupType groupType) { + this.groupType = groupType; + } - public ToolConfiguration setToolConfig(final String name, final ToolConfiguration config) { - toolsConfig.put(name, config); - return config; - } + @Override + public void setId(final Long id) { + this.id = id; + } - public void setWorkspaceTheme(final String workspaceTheme) { - this.workspaceTheme = workspaceTheme; - } + public void setLogo(final byte[] logo) { + this.logo = logo; + } - @Override - public String toString() { - return "Group[" + shortName + "]"; - } + public void setLogoMime(final BasicMimeType logoMime) { + this.logoMime = logoMime; + } + + public void setLongName(final String longName) { + this.longName = longName; + } + + public void setShortName(final String shortName) { + this.shortName = shortName; + } + + public void setSocialNetwork(final SocialNetwork socialNetwork) { + this.socialNetwork = socialNetwork; + } + + public ToolConfiguration setToolConfig(final String name, final ToolConfiguration config) { + toolsConfig.put(name, config); + return config; + } + + public void setWorkspaceTheme(final String workspaceTheme) { + this.workspaceTheme = workspaceTheme; + } + + @Override + public String toString() { + return "Group[" + shortName + "]"; + } } \ No newline at end of file Modified: trunk/src/main/java/cc/kune/gspace/client/GSpaceArmor.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/GSpaceArmor.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/GSpaceArmor.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -26,6 +26,8 @@ public interface GSpaceArmor { + void clearBackImage(); + ForIsWidget getDocContainer(); ForIsWidget getDocFooter(); @@ -64,5 +66,7 @@ void selectUserSpace(); + void setBackImage(String url); + void setContentVisible(boolean visible); } \ No newline at end of file Modified: trunk/src/main/java/cc/kune/gspace/client/GSpaceArmorImpl.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/GSpaceArmorImpl.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/GSpaceArmorImpl.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -19,6 +19,8 @@ */ package cc.kune.gspace.client; +import org.cobogw.gwt.user.client.CSS; + import cc.kune.common.client.actions.ui.ActionFlowPanel; import cc.kune.common.client.actions.ui.IsActionExtensible; @@ -96,7 +98,6 @@ public GSpaceArmorImpl(final Provider<ActionFlowPanel> toolbarProv) { initWidget(uiBinder.createAndBindUi(this)); groupSpace.setWidgetMinSize(splitEast, 150); - tabs.setStyleName("k-spaces"); homeSpace.add(RootPanel.get("k-home-wrapper")); DOM.setStyleAttribute((Element) groupSpace.getWidgetContainerElement(splitEast), "overflow", "visible"); @@ -110,9 +111,15 @@ getDocFooter().add(footerToolbar); entityToolsNorth.getElement().getStyle().setPosition(Position.RELATIVE); // entityToolsSouth.setVisible(false); + mainpanel.getWidgetContainerElement(tabs).addClassName("k-spaces"); } @Override + public void clearBackImage() { + DOM.setStyleAttribute(mainpanel.getElement(), CSS.A.BACKGROUND, "transparent"); + } + + @Override public ForIsWidget getDocContainer() { return docContainer; } @@ -208,6 +215,12 @@ } @Override + public void setBackImage(final String url) { + final String bodyProp = "#FFFFFF url('" + url + "') fixed no-repeat top left"; + DOM.setStyleAttribute(mainpanel.getElement(), CSS.A.BACKGROUND, bodyProp); + } + + @Override public void setContentVisible(final boolean visible) { // NotifyUser.info("Visible: " + visible); // docContainer.getElement().getStyle().setOpacity(visible ? 1d : .0d); Modified: trunk/src/main/java/cc/kune/gspace/client/GSpaceArmorImpl.ui.xml =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/GSpaceArmorImpl.ui.xml 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/GSpaceArmorImpl.ui.xml 2011-06-21 20:03:39 UTC (rev 1412) @@ -22,12 +22,12 @@ barUnit='PX' barHeight='0' ui:field="tabs"> <g:tab> <g:header size='0' /> - <g:SimplePanel ui:field="homeSpace" width="100%" + <g:SimplePanel styleName="k-space" ui:field="homeSpace" width="100%" height="100%"></g:SimplePanel> </g:tab> <g:tab> <g:header size='0' /> - <g:FlowPanel ui:field="userSpace" width="100%" + <g:FlowPanel ui:field="userSpace" styleName="k-space" width="100%" height="100%"> <!-- <g:Frame url="/" styleName="{style.frame}" --> <!-- ui:field="frame" width="100%" height="100%" /> --> @@ -35,7 +35,7 @@ </g:tab> <g:tab> <g:header size='0' /> - <g:SplitLayoutPanel width="100%" height="100%" + <g:SplitLayoutPanel width="100%" height="100%" styleName="k-space" ui:field="groupSpace"> <g:center size="1.0"> <g:DockLayoutPanel unit="PX" ui:field="splitCenter"> @@ -109,7 +109,7 @@ </g:tab> <g:tab> <g:header size='0' /> - <g:SimplePanel ui:field="publicSpace" width="100%" + <g:SimplePanel ui:field="publicSpace" width="100%" styleName="k-space" height="100%"></g:SimplePanel> </g:tab> </g:TabLayoutPanel> Modified: trunk/src/main/java/cc/kune/gspace/client/options/logo/CurrentLogoChangedEvent.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/options/logo/CurrentLogoChangedEvent.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/options/logo/CurrentLogoChangedEvent.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -26,49 +26,49 @@ public class CurrentLogoChangedEvent extends GwtEvent<CurrentLogoChangedEvent.CurrentLogoChangedHandler> { - public interface CurrentLogoChangedHandler extends EventHandler { - public void onCurrentLogoChanged(CurrentLogoChangedEvent event); - } + public interface CurrentLogoChangedHandler extends EventHandler { + public void onCurrentLogoChanged(CurrentLogoChangedEvent event); + } - public interface HasCurrentLogoChangedHandlers extends HasHandlers { - HandlerRegistration addCurrentLogoChangedHandler(CurrentLogoChangedHandler handler); - } + public interface HasCurrentLogoChangedHandlers extends HasHandlers { + HandlerRegistration addCurrentLogoChangedHandler(CurrentLogoChangedHandler handler); + } - private static final Type<CurrentLogoChangedHandler> TYPE = new Type<CurrentLogoChangedHandler>(); + private static final Type<CurrentLogoChangedHandler> TYPE = new Type<CurrentLogoChangedHandler>(); - public static void fire(final HasHandlers source) { - source.fireEvent(new CurrentLogoChangedEvent()); - } + public static void fire(final HasHandlers source) { + source.fireEvent(new CurrentLogoChangedEvent()); + } - public static Type<CurrentLogoChangedHandler> getType() { - return TYPE; - } + public static Type<CurrentLogoChangedHandler> getType() { + return TYPE; + } - public CurrentLogoChangedEvent() { - } + public CurrentLogoChangedEvent() { + } - @Override - protected void dispatch(final CurrentLogoChangedHandler handler) { - handler.onCurrentLogoChanged(this); - } + @Override + protected void dispatch(final CurrentLogoChangedHandler handler) { + handler.onCurrentLogoChanged(this); + } - @Override - public boolean equals(final Object obj) { - return super.equals(obj); - } + @Override + public boolean equals(final Object obj) { + return super.equals(obj); + } - @Override - public Type<CurrentLogoChangedHandler> getAssociatedType() { - return TYPE; - } + @Override + public Type<CurrentLogoChangedHandler> getAssociatedType() { + return TYPE; + } - @Override - public int hashCode() { - return super.hashCode(); - } + @Override + public int hashCode() { + return super.hashCode(); + } - @Override - public String toString() { - return "CurrentLogoChangedEvent[" + "]"; - } + @Override + public String toString() { + return "CurrentLogoChangedEvent[" + "]"; + } } Modified: trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityOptionsLogoPanel.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityOptionsLogoPanel.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityOptionsLogoPanel.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -19,12 +19,10 @@ \*/ package cc.kune.gspace.client.options.logo; -import gwtupload.client.IFileInput.FileInputType; import gwtupload.client.IUploader.OnCancelUploaderHandler; import gwtupload.client.IUploader.OnChangeUploaderHandler; import gwtupload.client.IUploader.OnFinishUploaderHandler; import gwtupload.client.IUploader.OnStartUploaderHandler; -import gwtupload.client.MultiUploader; import cc.kune.common.client.ui.IconLabel; import cc.kune.common.client.utils.OnAcceptCallback; import cc.kune.core.client.resources.CoreMessages; @@ -33,46 +31,17 @@ import cc.kune.core.shared.i18n.I18nTranslationService; import cc.kune.gspace.client.options.EntityOptionsView; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.ClickHandler; -import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.shared.EventBus; import com.google.gwt.event.shared.HandlerRegistration; -import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.DecoratorPanel; -import com.google.gwt.user.client.ui.FlowPanel; -import com.google.gwt.user.client.ui.Hidden; import com.google.gwt.user.client.ui.IsWidget; -import com.google.gwt.user.client.ui.Label; public class EntityOptionsLogoPanel extends Composite implements EntityOptionsLogoView { - public class UploadButton extends Composite implements HasClickHandlers { - DecoratorPanel widget = new DecoratorPanel(); - - public UploadButton() { - final DecoratorPanel widget = new DecoratorPanel(); - final Button btn = new Button(i18n.t("Choose")); - btn.addStyleName("k-button"); - initWidget(widget); - widget.setWidget(btn); - widget.setHeight("50px"); - } - - @Override - public HandlerRegistration addClickHandler(final ClickHandler handler) { - return addDomHandler(handler, ClickEvent.getType()); - } - } - public static final String ICON_UPLD_SERVLET = "servlets/EntityLogoUploadManager"; - private final Label dialogInfoLabel; + private final EntityUploaderForm uploader; private final I18nTranslationService i18n; private final IconLabel tabTitle; - private final Hidden tokenField; - private final MultiUploader uploader; - private final Hidden userhashField; public EntityOptionsLogoPanel(final EventBus eventBus, final I18nTranslationService i18n, final String panelId, final String buttonId, final String inputId, final NavResources res) { @@ -80,29 +49,11 @@ this.i18n = i18n; tabTitle = new IconLabel(res.picture(), ""); - final UploadButton btn = new UploadButton(); - uploader = new MultiUploader(FileInputType.CUSTOM.with(btn)); - uploader.setServletPath(ICON_UPLD_SERVLET); - uploader.setMaximumFiles(1); - dialogInfoLabel = new Label(); - dialogInfoLabel.setWordWrap(true); - dialogInfoLabel.addStyleName("kune-Margin-20-tb"); - uploader.setValidExtensions("png", "jpg", "gif", "jpeg", "bmp"); + uploader = new EntityUploaderForm(ICON_UPLD_SERVLET, i18n.t("Choose")); - userhashField = new Hidden(FileConstants.HASH, FileConstants.HASH); - tokenField = new Hidden(FileConstants.TOKEN, FileConstants.TOKEN); - - final FlowPanel holder = new FlowPanel(); - - uploader.add(userhashField); - uploader.add(tokenField); - holder.add(dialogInfoLabel); - holder.add(uploader); - - initWidget(holder); + initWidget(uploader); setHeight(String.valueOf(EntityOptionsView.HEIGHT) + "px"); setWidth(String.valueOf(EntityOptionsView.WIDTH) + "px"); - // uploader.setHeight("100px"); addStyleName("k-overflow-y-auto"); addStyleName("k-tab-panel"); @@ -144,7 +95,7 @@ @Override public void setNormalGroupsLabels() { - dialogInfoLabel.setText(i18n.t("Select an image in your computer as the logo for this group. " + uploader.setLabelText(i18n.t("Select an image in your computer as the logo for this group. " + "For best results use a [%d]x[%d] pixel image. We will automatically resize bigger images.", FileConstants.LOGO_DEF_HEIGHT, FileConstants.LOGO_DEF_HEIGHT)); tabTitle.setText(CoreMessages.ENT_LOGO_SELECTOR_NORMAL_TITLE); @@ -152,7 +103,7 @@ @Override public void setPersonalGroupsLabels() { - dialogInfoLabel.setText(i18n.t("Select an image in your computer as your avatar. " + uploader.setLabelText(i18n.t("Select an image in your computer as your avatar. " + "For best results use a [%d]x[%d] pixel image. We will automatically resize bigger images.", FileConstants.LOGO_DEF_HEIGHT, FileConstants.LOGO_DEF_HEIGHT)); tabTitle.setText(CoreMessages.ENT_LOGO_SELECTOR_PERSON_TITLE); @@ -160,8 +111,7 @@ @Override public void setUploadParams(final String userHash, final String token) { - userhashField.setValue(userHash); - tokenField.setValue(token); + uploader.setUploadParams(userHash, token); } } Modified: trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityOptionsLogoPresenter.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityOptionsLogoPresenter.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityOptionsLogoPresenter.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -26,7 +26,7 @@ import cc.kune.common.client.notify.NotifyUser; import cc.kune.core.client.rpcservices.UserServiceAsync; import cc.kune.core.client.state.Session; -import cc.kune.core.client.ws.entheader.EntityHeader; +import cc.kune.core.shared.i18n.I18nTranslationService; import cc.kune.gspace.client.options.EntityOptions; import com.google.gwt.event.shared.EventBus; @@ -34,21 +34,21 @@ import com.google.inject.Provider; public abstract class EntityOptionsLogoPresenter implements GroupOptionsLogo, UserOptionsLogo { - private final EntityHeader entityLogo; private final EntityOptions entityOptions; protected final EventBus eventBus; + private final I18nTranslationService i18n; protected final Session session; protected final Provider<UserServiceAsync> userService; protected EntityOptionsLogoView view; public EntityOptionsLogoPresenter(final EventBus eventBus, final Session session, - final EntityHeader entityLogo, final EntityOptions entityOptions, - final Provider<UserServiceAsync> userService) { + final EntityOptions entityOptions, final Provider<UserServiceAsync> userService, + final I18nTranslationService i18n) { this.eventBus = eventBus; this.session = session; - this.entityLogo = entityLogo; this.entityOptions = entityOptions; this.userService = userService; + this.i18n = i18n; } public IsWidget getView() { @@ -66,7 +66,6 @@ } }); view.addOnFinishUploadHandler(new OnFinishUploaderHandler() { - @Override public void onFinish(final IUploader uploader) { onSubmitComplete(uploader); @@ -87,7 +86,7 @@ } public void onSubmitFailed(final String responseText) { - NotifyUser.error("Error setting the logo: " + responseText); + NotifyUser.error(i18n.t("Error setting the logo", responseText)); } protected abstract void setState(); Added: trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityOptionsUploadButton.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityOptionsUploadButton.java (rev 0) +++ trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityOptionsUploadButton.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -0,0 +1,27 @@ +package cc.kune.gspace.client.options.logo; + +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.HasClickHandlers; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.DecoratorPanel; + +public class EntityOptionsUploadButton extends Composite implements HasClickHandlers { + DecoratorPanel widget = new DecoratorPanel(); + + public EntityOptionsUploadButton(final String text) { + final DecoratorPanel widget = new DecoratorPanel(); + final Button btn = new Button(text); + btn.addStyleName("k-button"); + initWidget(widget); + widget.setWidget(btn); + widget.setHeight("50px"); + } + + @Override + public HandlerRegistration addClickHandler(final ClickHandler handler) { + return addDomHandler(handler, ClickEvent.getType()); + } +} \ No newline at end of file Property changes on: trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityOptionsUploadButton.java ___________________________________________________________________ Name: svn:mime-type + text/plain Added: trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityUploaderForm.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityUploaderForm.java (rev 0) +++ trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityUploaderForm.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -0,0 +1,75 @@ +package cc.kune.gspace.client.options.logo; + +import gwtupload.client.IFileInput.FileInputType; +import gwtupload.client.IUploader.OnCancelUploaderHandler; +import gwtupload.client.IUploader.OnChangeUploaderHandler; +import gwtupload.client.IUploader.OnFinishUploaderHandler; +import gwtupload.client.IUploader.OnStartUploaderHandler; +import gwtupload.client.MultiUploader; +import cc.kune.core.client.services.FileConstants; + +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.Hidden; +import com.google.gwt.user.client.ui.Label; + +public class EntityUploaderForm extends Composite { + + private final Label dialogInfoLabel; + private final Hidden tokenField; + private final MultiUploader uploader; + private final Hidden userhashField; + + public EntityUploaderForm(final String servlet, final String btnText) { + final EntityOptionsUploadButton btn = new EntityOptionsUploadButton(btnText); + uploader = new MultiUploader(FileInputType.CUSTOM.with(btn)); + uploader.setServletPath(servlet); + uploader.setMaximumFiles(1); + dialogInfoLabel = new Label(); + dialogInfoLabel.setWordWrap(true); + dialogInfoLabel.addStyleName("kune-Margin-20-tb"); + uploader.setValidExtensions("png", "jpg", "gif", "jpeg", "bmp"); + + userhashField = new Hidden(FileConstants.HASH, FileConstants.HASH); + tokenField = new Hidden(FileConstants.TOKEN, FileConstants.TOKEN); + + final FlowPanel holder = new FlowPanel(); + + uploader.add(userhashField); + uploader.add(tokenField); + holder.add(dialogInfoLabel); + holder.add(uploader); + initWidget(holder); + } + + public HandlerRegistration addOnCancelUploadHandler(final OnCancelUploaderHandler handler) { + return uploader.addOnCancelUploadHandler(handler); + } + + public HandlerRegistration addOnChangeUploadHandler(final OnChangeUploaderHandler handler) { + return uploader.addOnChangeUploadHandler(handler); + } + + public HandlerRegistration addOnFinishUploadHandler(final OnFinishUploaderHandler handler) { + return uploader.addOnFinishUploadHandler(handler); + } + + public HandlerRegistration addOnStartUploadHandler(final OnStartUploaderHandler handler) { + return uploader.addOnStartUploadHandler(handler); + } + + public void reset() { + uploader.reset(); + } + + public void setLabelText(final String text) { + dialogInfoLabel.setText(text); + } + + public void setUploadParams(final String userHash, final String token) { + userhashField.setValue(userHash); + tokenField.setValue(token); + } + +} Property changes on: trunk/src/main/java/cc/kune/gspace/client/options/logo/EntityUploaderForm.java ___________________________________________________________________ Name: svn:mime-type + text/plain Modified: trunk/src/main/java/cc/kune/gspace/client/options/logo/GroupOptionsLogoPresenter.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/options/logo/GroupOptionsLogoPresenter.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/options/logo/GroupOptionsLogoPresenter.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -24,7 +24,7 @@ import cc.kune.core.client.state.GroupChangedEvent.GroupChangedHandler; import cc.kune.core.client.state.Session; import cc.kune.core.client.state.StateManager; -import cc.kune.core.client.ws.entheader.EntityHeader; +import cc.kune.core.shared.i18n.I18nTranslationService; import cc.kune.gspace.client.options.GroupOptions; import com.google.gwt.event.shared.EventBus; @@ -35,9 +35,10 @@ @Inject public GroupOptionsLogoPresenter(final EventBus eventBus, final Session session, - final EntityHeader entityLogo, final GroupOptions entityOptions, final StateManager stateManager, - final Provider<UserServiceAsync> userService, final GroupOptionsLogoView view) { - super(eventBus, session, entityLogo, entityOptions, userService); + final GroupOptions entityOptions, final StateManager stateManager, + final Provider<UserServiceAsync> userService, final GroupOptionsLogoView view, + final I18nTranslationService i18n) { + super(eventBus, session, entityOptions, userService, i18n); init(view); stateManager.onGroupChanged(true, new GroupChangedHandler() { @Override Modified: trunk/src/main/java/cc/kune/gspace/client/options/logo/UserOptionsLogoPresenter.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/options/logo/UserOptionsLogoPresenter.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/options/logo/UserOptionsLogoPresenter.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -27,8 +27,8 @@ import cc.kune.core.client.state.StateManager; import cc.kune.core.client.state.UserSignInEvent; import cc.kune.core.client.state.UserSignInEvent.UserSignInHandler; -import cc.kune.core.client.ws.entheader.EntityHeader; import cc.kune.core.shared.dto.GroupDTO; +import cc.kune.core.shared.i18n.I18nTranslationService; import cc.kune.gspace.client.options.UserOptions; import com.google.gwt.event.shared.EventBus; @@ -39,9 +39,10 @@ @Inject public UserOptionsLogoPresenter(final EventBus eventBus, final Session session, - final EntityHeader entityLogo, final UserOptions entityOptions, final StateManager stateManager, - final Provider<UserServiceAsync> userService, final UserOptionsLogoView view) { - super(eventBus, session, entityLogo, entityOptions, userService); + final UserOptions entityOptions, final StateManager stateManager, + final Provider<UserServiceAsync> userService, final UserOptionsLogoView view, + final I18nTranslationService i18n) { + super(eventBus, session, entityOptions, userService, i18n); init(view); session.onUserSignIn(true, new UserSignInHandler() { @Override Modified: trunk/src/main/java/cc/kune/gspace/client/options/style/EntityOptionsStyleConfPanel.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/options/style/EntityOptionsStyleConfPanel.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/options/style/EntityOptionsStyleConfPanel.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -19,22 +19,25 @@ */ package cc.kune.gspace.client.options.style; +import gwtupload.client.IUploader.OnCancelUploaderHandler; +import gwtupload.client.IUploader.OnChangeUploaderHandler; +import gwtupload.client.IUploader.OnFinishUploaderHandler; +import gwtupload.client.IUploader.OnStartUploaderHandler; import cc.kune.common.client.notify.NotifyUser; import cc.kune.common.client.tooltip.Tooltip; import cc.kune.common.client.ui.BasicThumb; import cc.kune.common.client.ui.IconLabel; import cc.kune.common.client.utils.TextUtils; import cc.kune.core.client.resources.CoreResources; -import cc.kune.core.client.services.FileDownloadUtils; -import cc.kune.core.client.services.ImageSize; -import cc.kune.core.shared.domain.utils.StateToken; import cc.kune.core.shared.i18n.I18nTranslationService; import cc.kune.gspace.client.options.EntityOptionsView; +import cc.kune.gspace.client.options.logo.EntityUploaderForm; import cc.kune.gspace.client.themes.GSpaceThemeSelectorPanel; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.HasClickHandlers; +import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Image; @@ -44,42 +47,50 @@ public class EntityOptionsStyleConfPanel extends FlowPanel implements EntityOptionsStyleConfView { + public static final String ICON_UPLD_SERVLET = "servlets/EntityBackgroundUploadManager"; private final Image backImage; private final Button clearBtn; private final Label currentBackLabel; - private final FileDownloadUtils downUtils; private final Label noBackLabel; private final IconLabel tabTitle; + private final EntityUploaderForm uploader; - public EntityOptionsStyleConfPanel(final I18nTranslationService i18n, - final FileDownloadUtils downUtils, final CoreResources res, + public EntityOptionsStyleConfPanel(final I18nTranslationService i18n, final CoreResources res, final GSpaceThemeSelectorPanel styleSelector) { - this.downUtils = downUtils; + ; tabTitle = new IconLabel(res.themeChoose(), i18n.t("Style")); super.setHeight(String.valueOf(EntityOptionsView.HEIGHT) + "px"); super.setWidth(String.valueOf(EntityOptionsView.WIDTH) + "px"); - final FlowPanel wsHP = new FlowPanel(); + final FlowPanel flow = new FlowPanel(); final Label wsThemeInfo = new Label(i18n.t("Change this workspace theme:")); - wsThemeInfo.addStyleName("kune-Margin-20-tb"); + flow.addStyleName("kune-Margin-20-tb"); + wsThemeInfo.addStyleName("k-fl"); styleSelector.addStyleName("k-fl"); - wsHP.add(wsThemeInfo); - wsHP.add(styleSelector); - add(wsHP); - final VerticalPanel backPanel = new VerticalPanel(); + styleSelector.addStyleName("kune-Margin-10-trbl"); + flow.add(wsThemeInfo); + flow.add(styleSelector); currentBackLabel = new Label(i18n.t("Current background image: ")); - noBackLabel = new Label(i18n.t("Also you can upload any image and select it later as background.")); + noBackLabel = new Label(i18n.t("Also you can upload a background:")); + currentBackLabel.addStyleName("k-clear"); + noBackLabel.addStyleName("k-clear"); + uploader = new EntityUploaderForm(ICON_UPLD_SERVLET, i18n.t("Choose")); + uploader.addStyleName("k-fl"); backImage = new Image(); backImage.addStyleName("kune-Margin-Medium-trbl"); noBackLabel.addStyleName("kune-Margin-Medium-tb"); clearBtn = new Button(i18n.t("Clear")); + clearBtn.setStyleName("k-button"); + clearBtn.addStyleName("k-fl"); Tooltip.to(clearBtn, i18n.t("Remove current background image")); - // backPanel.add(noBackLabel); - backPanel.add(currentBackLabel); - backPanel.add(backImage); - backPanel.add(clearBtn); - backPanel.addStyleName("oc-clean"); - // add(backPanel); + flow.add(noBackLabel); + flow.add(currentBackLabel); + flow.add(backImage); + flow.add(uploader); + flow.add(clearBtn); + flow.addStyleName("oc-clean"); + backImage.addStyleName("k-fr"); + add(flow); final Label wsInfo = new Label(i18n.t("Select and configure the public space theme of this group:")); wsInfo.addStyleName("kune-Margin-Medium-tb"); // add(wsInfo); @@ -106,6 +117,26 @@ } @Override + public HandlerRegistration addOnCancelUploadHandler(final OnCancelUploaderHandler handler) { + return uploader.addOnCancelUploadHandler(handler); + } + + @Override + public HandlerRegistration addOnChangeUploadHandler(final OnChangeUploaderHandler handler) { + return uploader.addOnChangeUploadHandler(handler); + } + + @Override + public HandlerRegistration addOnFinishUploadHandler(final OnFinishUploaderHandler handler) { + return uploader.addOnFinishUploadHandler(handler); + } + + @Override + public HandlerRegistration addOnStartUploadHandler(final OnStartUploaderHandler handler) { + return uploader.addOnStartUploadHandler(handler); + } + + @Override public void clearBackImage() { setBackImageVisibleImpl(false); } @@ -121,8 +152,14 @@ } @Override - public void setBackImage(final StateToken token) { - backImage.setUrl(downUtils.getImageResizedUrl(token, ImageSize.thumb)); + public void reset() { + uploader.reset(); + } + + @Override + public void setBackImage(final String url) { + // backImage.setUrl(downUtils.getImageResizedUrl(token, ImageSize.thumb)); + backImage.setUrl(url); setBackImageVisibleImpl(true); } @@ -132,4 +169,9 @@ clearBtn.setVisible(visible); noBackLabel.setVisible(!visible); } + + @Override + public void setUploadParams(final String userHash, final String token) { + uploader.setUploadParams(userHash, token); + } } Modified: trunk/src/main/java/cc/kune/gspace/client/options/style/EntityOptionsStyleConfPresenter.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/options/style/EntityOptionsStyleConfPresenter.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/options/style/EntityOptionsStyleConfPresenter.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -19,15 +19,24 @@ */ package cc.kune.gspace.client.options.style; +import gwtupload.client.IUploadStatus.Status; +import gwtupload.client.IUploader; +import gwtupload.client.IUploader.OnFinishUploaderHandler; +import gwtupload.client.IUploader.OnStartUploaderHandler; +import cc.kune.common.client.notify.NotifyUser; +import cc.kune.common.client.utils.TextUtils; import cc.kune.core.client.rpcservices.AsyncCallbackSimple; import cc.kune.core.client.rpcservices.GroupServiceAsync; +import cc.kune.core.client.services.FileDownloadUtils; +import cc.kune.core.client.services.ImageSize; import cc.kune.core.client.state.Session; import cc.kune.core.client.state.StateChangedEvent; import cc.kune.core.client.state.StateChangedEvent.StateChangedHandler; import cc.kune.core.client.state.StateManager; -import cc.kune.core.shared.dto.ContentSimpleDTO; +import cc.kune.core.shared.domain.utils.StateToken; import cc.kune.core.shared.dto.GroupDTO; import cc.kune.core.shared.dto.StateAbstractDTO; +import cc.kune.core.shared.i18n.I18nTranslationService; import cc.kune.gspace.client.options.EntityOptions; import cc.kune.gspace.client.style.ClearBackImageEvent; import cc.kune.gspace.client.style.GSpaceBackManager; @@ -44,7 +53,9 @@ private final GSpaceBackManager backManager; private final EntityOptions entityOptions; private final EventBus eventBus; + private final FileDownloadUtils fileDownloadUtils; private final Provider<GroupServiceAsync> groupService; + private final I18nTranslationService i18n; private final Session session; private final StateManager stateManager; private EntityOptionsStyleConfView view; @@ -52,22 +63,26 @@ protected EntityOptionsStyleConfPresenter(final EventBus eventBus, final Session session, final StateManager stateManager, final EntityOptions entityOptions, final Provider<GroupServiceAsync> groupService, final GSpaceBackManager backManager, - final GSpaceThemeSelectorPresenter styleSelector) { + final GSpaceThemeSelectorPresenter styleSelector, final I18nTranslationService i18n, + final FileDownloadUtils fileDownloadUtils) { this.eventBus = eventBus; this.session = session; this.stateManager = stateManager; this.entityOptions = entityOptions; this.groupService = groupService; this.backManager = backManager; + this.i18n = i18n; + this.fileDownloadUtils = fileDownloadUtils; } - public void clearBackImage() { + private void clearBackImage() { groupService.get().clearGroupBackImage(session.getUserHash(), session.getCurrentStateToken(), new AsyncCallbackSimple<GroupDTO>() { @Override public void onSuccess(final GroupDTO result) { view.clearBackImage(); backManager.clearBackImage(); + ClearBackImageEvent.fire(eventBus); } }); } @@ -79,7 +94,7 @@ public void init(final EntityOptionsStyleConfView view) { this.view = view; entityOptions.addTab(view, view.getTabTitle()); - setBackImage(session.getCurrentState().getGroup().getGroupBackImage()); + setState(); view.getClearBtn().addClickHandler(new ClickHandler() { @Override public void onClick(final ClickEvent event) { @@ -89,15 +104,15 @@ stateManager.onStateChanged(true, new StateChangedHandler() { @Override public void onStateChanged(final StateChangedEvent event) { - final StateAbstractDTO state = event.getState(); - final ContentSimpleDTO backImage = state.getGroup().getGroupBackImage(); - setBackImage(backImage); + setState(); } }); eventBus.addHandler(SetBackImageEvent.getType(), new SetBackImageEvent.SetBackImageHandler() { @Override public void onSetBackImage(final SetBackImageEvent event) { - view.setBackImage(event.getToken()); + final StateToken token = event.getToken(); + backManager.setBackImage(token); + setBackImage(event.getToken()); } }); eventBus.addHandler(ClearBackImageEvent.getType(), new ClearBackImageEvent.ClearBackImageHandler() { @@ -106,13 +121,49 @@ view.clearBackImage(); } }); + view.addOnStartUploadHandler(new OnStartUploaderHandler() { + @Override + public void onStart(final IUploader uploader) { + setState(); + } + }); + view.addOnFinishUploadHandler(new OnFinishUploaderHandler() { + @Override + public void onFinish(final IUploader uploader) { + onSubmitComplete(uploader); + } + }); } - private void setBackImage(final ContentSimpleDTO backImage) { - if (backImage == null) { + private void onSubmitComplete(final IUploader uploader) { + final String response = uploader.getServerInfo().message; + if (uploader.getStatus() == Status.SUCCESS) { + if (!TextUtils.empty(response)) { + NotifyUser.info(response); + } + SetBackImageEvent.fire(eventBus, session.getCurrentState().getGroup().getStateToken()); + } else { + onSubmitFailed(response); + } + } + + private void onSubmitFailed(final String responseText) { + NotifyUser.error(i18n.t("Error setting the background"), responseText); + } + + private void setBackImage(final StateToken token) { + view.setBackImage(fileDownloadUtils.getBackgroundResizedUrl(token, ImageSize.thumb)); + } + + private void setState() { + final StateAbstractDTO state = session.getCurrentState(); + final GroupDTO group = state.getGroup(); + if (group.getBackgroundImage() == null) { view.clearBackImage(); } else { - view.setBackImage(backImage.getStateToken()); + setBackImage(group.getStateToken()); } + view.setUploadParams(session.getUserHash(), session.getCurrentStateToken().toString()); } + } Modified: trunk/src/main/java/cc/kune/gspace/client/options/style/EntityOptionsStyleConfView.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/options/style/EntityOptionsStyleConfView.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/options/style/EntityOptionsStyleConfView.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -19,17 +19,31 @@ */ package cc.kune.gspace.client.options.style; -import cc.kune.core.shared.domain.utils.StateToken; +import gwtupload.client.IUploader; +import gwtupload.client.IUploader.OnCancelUploaderHandler; import cc.kune.gspace.client.options.EntityOptionsTabView; import com.google.gwt.event.dom.client.HasClickHandlers; +import com.google.gwt.event.shared.HandlerRegistration; public interface EntityOptionsStyleConfView extends EntityOptionsTabView { - public void clearBackImage(); + HandlerRegistration addOnCancelUploadHandler(OnCancelUploaderHandler handler); - HasClickHandlers getClearBtn(); + HandlerRegistration addOnChangeUploadHandler(IUploader.OnChangeUploaderHandler handler); - public void setBackImage(final StateToken token); + HandlerRegistration addOnFinishUploadHandler(IUploader.OnFinishUploaderHandler handler); + HandlerRegistration addOnStartUploadHandler(IUploader.OnStartUploaderHandler handler); + + public void clearBackImage(); + + HasClickHandlers getClearBtn(); + + void reset(); + + public void setBackImage(final String url); + + void setUploadParams(String userHash, String token); + } Modified: trunk/src/main/java/cc/kune/gspace/client/options/style/GroupOptionsStyleConfPanel.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/options/style/GroupOptionsStyleConfPanel.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/options/style/GroupOptionsStyleConfPanel.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -20,7 +20,6 @@ package cc.kune.gspace.client.options.style; import cc.kune.core.client.resources.CoreResources; -import cc.kune.core.client.services.FileDownloadUtils; import cc.kune.core.shared.i18n.I18nTranslationService; import cc.kune.gspace.client.themes.GSpaceThemeSelectorPanel; @@ -30,10 +29,9 @@ GroupOptionsStyleConfView { @Inject - public GroupOptionsStyleConfPanel(final I18nTranslationService i18n, - final FileDownloadUtils downUtils, final CoreResources res, + public GroupOptionsStyleConfPanel(final I18nTranslationService i18n, final CoreResources res, final GSpaceThemeSelectorPanel styleSelector) { - super(i18n, downUtils, res, styleSelector); + super(i18n, res, styleSelector); } } Modified: trunk/src/main/java/cc/kune/gspace/client/options/style/GroupOptionsStyleConfPresenter.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/options/style/GroupOptionsStyleConfPresenter.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/options/style/GroupOptionsStyleConfPresenter.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -20,10 +20,10 @@ package cc.kune.gspace.client.options.style; import cc.kune.core.client.rpcservices.GroupServiceAsync; +import cc.kune.core.client.services.FileDownloadUtils; import cc.kune.core.client.state.Session; -import cc.kune.core.client.state.StateChangedEvent; -import cc.kune.core.client.state.StateChangedEvent.StateChangedHandler; import cc.kune.core.client.state.StateManager; +import cc.kune.core.shared.i18n.I18nTranslationService; import cc.kune.gspace.client.options.GroupOptions; import cc.kune.gspace.client.style.GSpaceBackManager; import cc.kune.gspace.client.themes.GSpaceThemeSelectorPresenter; @@ -39,17 +39,11 @@ public GroupOptionsStyleConfPresenter(final EventBus eventBus, final Session session, final StateManager stateManager, final GroupOptions entityOptions, final Provider<GroupServiceAsync> groupService, final GSpaceBackManager backManager, - final GroupOptionsStyleConfView view, final GSpaceThemeSelectorPresenter styleSelector) { - super(eventBus, session, stateManager, entityOptions, groupService, backManager, styleSelector); + final GroupOptionsStyleConfView view, final GSpaceThemeSelectorPresenter styleSelector, + final I18nTranslationService i18n, final FileDownloadUtils fileDownUtils) { + super(eventBus, session, stateManager, entityOptions, groupService, backManager, styleSelector, + i18n, fileDownUtils); init(view); - stateManager.onStateChanged(true, new StateChangedHandler() { - - @Override - public void onStateChanged(final StateChangedEvent event) { - // final String theme = state.getGroup().getWorkspaceTheme(); - // themeSelector.select(theme); - } - }); } } \ No newline at end of file Modified: trunk/src/main/java/cc/kune/gspace/client/options/style/UserOptionsStyleConfPanel.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/options/style/UserOptionsStyleConfPanel.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/options/style/UserOptionsStyleConfPanel.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -20,7 +20,6 @@ package cc.kune.gspace.client.options.style; import cc.kune.core.client.resources.CoreResources; -import cc.kune.core.client.services.FileDownloadUtils; import cc.kune.core.shared.i18n.I18nTranslationService; import cc.kune.gspace.client.themes.GSpaceThemeSelectorPanel; @@ -30,9 +29,9 @@ UserOptionsStyleConfView { @Inject - public UserOptionsStyleConfPanel(final I18nTranslationService i18n, final FileDownloadUtils downUtils, - final CoreResources res, final GSpaceThemeSelectorPanel styleSelector) { - super(i18n, downUtils, res, styleSelector); + public UserOptionsStyleConfPanel(final I18nTranslationService i18n, final CoreResources res, + final GSpaceThemeSelectorPanel styleSelector) { + super(i18n, res, styleSelector); } } Modified: trunk/src/main/java/cc/kune/gspace/client/options/style/UserOptionsStyleConfPresenter.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/options/style/UserOptionsStyleConfPresenter.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/options/style/UserOptionsStyleConfPresenter.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -20,11 +20,10 @@ package cc.kune.gspace.client.options.style; import cc.kune.core.client.rpcservices.GroupServiceAsync; +import cc.kune.core.client.services.FileDownloadUtils; import cc.kune.core.client.state.Session; import cc.kune.core.client.state.StateManager; -import cc.kune.core.client.state.UserSignInEvent; -import cc.kune.core.client.state.UserSignInEvent.UserSignInHandler; -import cc.kune.core.shared.dto.UserInfoDTO; +import cc.kune.core.shared.i18n.I18nTranslationService; import cc.kune.gspace.client.options.UserOptions; import cc.kune.gspace.client.style.GSpaceBackManager; import cc.kune.gspace.client.themes.GSpaceThemeSelectorPresenter; @@ -42,30 +41,10 @@ public UserOptionsStyleConfPresenter(final EventBus eventBus, final Session session, final StateManager stateManager, final UserOptions entityOptions, final Provider<GroupServiceAsync> groupService, final GSpaceBackManager backManager, - final UserOptionsStyleConfView view, final GSpaceThemeSelectorPresenter styleSelector) { - super(eventBus, session, stateManager, entityOptions, groupService, backManager, styleSelector); - // this.themeSelector = themeSelector; - // themeSelector.addThemeSelected(new Listener<WsTheme>() { - // public void onEvent(final WsTheme theme) { - // themeManager.changeTheme(session.getCurrentUser().getStateToken(), - // theme); - // } - // }); - final UserInfoDTO userInfo = session.getCurrentUserInfo(); - if (userInfo != null) { - setSelector(userInfo); - } + final UserOptionsStyleConfView view, final GSpaceThemeSelectorPresenter styleSelector, + final I18nTranslationService i18n, final FileDownloadUtils fileDownUtils) { + super(eventBus, session, stateManager, entityOptions, groupService, backManager, styleSelector, + i18n, fileDownUtils); init(view); - session.onUserSignIn(true, new UserSignInHandler() { - @Override - public void onUserSignIn(final UserSignInEvent event) { - // setSelector(userInfo); - } - }); } - - private void setSelector(final UserInfoDTO userInfo) { - // themeSelector.select(userInfo.getUserGroup().getWorkspaceTheme()); - } - } Modified: trunk/src/main/java/cc/kune/gspace/client/resources/gSpaceArmor.css =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/resources/gSpaceArmor.css 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/resources/gSpaceArmor.css 2011-06-21 20:03:39 UTC (rev 1412) @@ -7,17 +7,31 @@ .mainPanel { border-top: 2px solid white; - border-bottom: 7px solid white; - border-right: 7px solid white; - border-left: 7px solid white; +/* border-bottom: 7px solid transparent; + border-right: 17px solid transparent; + border-left: 17px solid transparent; */ } +.k-spaces { + margin: 5px 17px 7px 17px; + border-collapse: separate; +} + +.k-space { +} + .floatRight { float: right; } .siteBar { overflow: hidden; + background-color: #fff !important; + padding: 0px 5px; + /*kfilter: alpha(opacity = 38) !important; + -moz-opacity: 0.38 !important; + -khtml-opacity: 0.38 !important; + opacity: 0.38 !important; */ } .entityHeader { Modified: trunk/src/main/java/cc/kune/gspace/client/style/GSpaceBackManager.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/style/GSpaceBackManager.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/style/GSpaceBackManager.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -23,8 +23,9 @@ public interface GSpaceBackManager { - void clearBackImage(); + void clearBackImage(); - void setBackImage(StateToken token); + void restoreBackImage(); + void setBackImage(StateToken token); } Modified: trunk/src/main/java/cc/kune/gspace/client/style/GSpaceBackManagerImpl.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/style/GSpaceBackManagerImpl.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/style/GSpaceBackManagerImpl.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -19,46 +19,50 @@ */ package cc.kune.gspace.client.style; -import org.cobogw.gwt.user.client.CSS; +import javax.annotation.Nonnull; import cc.kune.core.client.services.FileDownloadUtils; import cc.kune.core.shared.domain.utils.StateToken; +import cc.kune.gspace.client.GSpaceArmor; -import com.google.gwt.event.shared.EventBus; -import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.ui.RootPanel; import com.google.inject.Inject; public class GSpaceBackManagerImpl implements GSpaceBackManager { - private static final StateToken NO_TOKEN = new StateToken("none.none.0.0"); - private final FileDownloadUtils downloadUtils; - private final EventBus eventBus; - private StateToken lastToken; + private static final StateToken NO_TOKEN = new StateToken("none.none.0.0"); + private final FileDownloadUtils downloadUtils; + private final GSpaceArmor gSpaceArmor; + private StateToken lastToken; - @Inject - public GSpaceBackManagerImpl(final EventBus eventBus, final FileDownloadUtils downloadUtils) { - this.eventBus = eventBus; - this.downloadUtils = downloadUtils; - lastToken = NO_TOKEN; + @Inject + public GSpaceBackManagerImpl(final FileDownloadUtils downloadUtils, final GSpaceArmor gSpaceArmor) { + this.downloadUtils = downloadUtils; + this.gSpaceArmor = gSpaceArmor; + lastToken = NO_TOKEN; + } + + @Override + public void clearBackImage() { + if (!lastToken.equals(NO_TOKEN)) { + gSpaceArmor.clearBackImage(); + lastToken = NO_TOKEN; } + } - @Override - public void clearBackImage() { - if (!lastToken.equals(NO_TOKEN)) { - DOM.setStyleAttribute(RootPanel.getBodyElement(), CSS.A.BACKGROUND, "transparent"); - lastToken = NO_TOKEN; - } - ClearBackImageEvent.fire(eventBus); + @Override + public void restoreBackImage() { + if (!lastToken.equals(NO_TOKEN)) { + gSpaceArmor.setBackImage(downloadUtils.getBackgroundImageUrl(lastToken)); } + } - @Override - public void setBackImage(final StateToken token) { - if (!token.equals(lastToken)) { - final String bodyProp = "#FFFFFF url('" + downloadUtils.getImageUrl(token) + "') fixed no-repeat top left"; - DOM.setStyleAttribute(RootPanel.getBodyElement(), CSS.A.BACKGROUND, bodyProp); - lastToken = token; - } - SetBackImageEvent.fire(eventBus, token); + @Override + public void setBackImage(final @Nonnull StateToken token) { + final StateToken tokenNoGroup = token.clearDocument().clearDocument(); + if (!tokenNoGroup.equals(lastToken)) { + gSpaceArmor.setBackImage(downloadUtils.getBackgroundImageUrl(tokenNoGroup)); + lastToken = tokenNoGroup; } + + } } Modified: trunk/src/main/java/cc/kune/gspace/client/themes/GSpaceThemeManager.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/themes/GSpaceThemeManager.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/gspace/client/themes/GSpaceThemeManager.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -27,13 +27,13 @@ import cc.kune.core.client.init.AppStartEvent.AppStartHandler; import cc.kune.core.client.rpcservices.AsyncCallbackSimple; import cc.kune.core.client.rpcservices.GroupServiceAsync; +import cc.kune.core.client.state.GroupChangedEvent; +import cc.kune.core.client.state.GroupChangedEvent.GroupChangedHandler; import cc.kune.core.client.state.Session; -import cc.kune.core.client.state.StateChangedEvent; -import cc.kune.core.client.state.StateChangedEvent.StateChangedHandler; import cc.kune.core.client.state.StateManager; import cc.kune.core.shared.domain.utils.StateToken; -import cc.kune.core.shared.dto.ContentSimpleDTO; import cc.kune.core.shared.dto.GSpaceTheme; +import cc.kune.core.shared.dto.GroupDTO; import cc.kune.core.shared.dto.InitDataDTO; import cc.kune.core.shared.dto.StateAbstractDTO; import cc.kune.gspace.client.resources.GSpaceArmorResources; @@ -69,10 +69,10 @@ public void onAppStart(final AppStartEvent event) { final InitDataDTO initdata = session.getInitData(); themes = initdata.getgSpaceThemes(); - stateManager.onStateChanged(true, new StateChangedHandler() { + stateManager.onGroupChanged(true, new GroupChangedHandler() { @Override - public void onStateChanged(final StateChangedEvent event) { - setState(event.getState()); + public void onGroupChanged(final GroupChangedEvent event) { + setState(session.getCurrentState()); } }); } @@ -117,11 +117,12 @@ private void setState(final StateAbstractDTO state) { setTheme(themes.get(state.getGroup().getWorkspaceTheme())); - final ContentSimpleDTO groupBackImage = state.getGroup().getGroupBackImage(); + final GroupDTO group = state.getGroup(); + final String groupBackImage = group.getBackgroundImage(); if (groupBackImage == null) { wsBackManager.clearBackImage(); } else { - wsBackManager.setBackImage(groupBackImage.getStateToken()); + wsBackManager.setBackImage(state.getGroup().getStateToken()); } } Modified: trunk/src/main/java/cc/kune/pspace/client/PSpaceInDevelopment.ui.xml =================================================================== --- trunk/src/main/java/cc/kune/pspace/client/PSpaceInDevelopment.ui.xml 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/cc/kune/pspace/client/PSpaceInDevelopment.ui.xml 2011-06-21 20:03:39 UTC (rev 1412) @@ -5,7 +5,7 @@ .container { margin: 10px; font-family: 'Ubuntu', Arial; - background-color: white; + background-color: transparent; } .entityLogo { Modified: trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientActions.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientActions.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/org/ourproject/kune/gallery/client/GalleryClientActions.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -46,68 +46,71 @@ import com.calclab.suco.client.ioc.Provider; public class GalleryClientActions extends OldAbstractFoldableContentActions { - public GalleryClientActions(final I18nUITranslationService i18n, final ContextNavigator contextNavigator, - final Session session, final StateManager stateManager, final SchedulerManager deferredCommandWrapper, - final Provider<ContentServiceAsync> contentServiceProvider, - final Provider<GroupServiceAsync> groupServiceProvider, final Provider<FileUploader> fileUploaderProvider, - final ContentActionRegistry contentActionRegistry, final ContextActionRegistry contextActionRegistry, - final Provider<FileDownloadUtils> fileDownloadProvider, final EntityHeader entityLogo, - final Provider<ContentEditor> textEditorProvider, final ErrorHandler errorHandler, - final GalleryViewer documentViewer, final Provider<ContextPropEditor> contextProvEditorProvider, - final GSpaceBackManager wsBackManager) { - super(session, stateManager, i18n, errorHandler, deferredCommandWrapper, groupServiceProvider, - contentServiceProvider, fileUploaderProvider, contextNavigator, contentActionRegistry, - contextActionRegistry, fileDownloadProvider, textEditorProvider, contextProvEditorProvider, - documentViewer, entityLogo, wsBackManager); - } + public GalleryClientActions(final I18nUITranslationService i18n, + final ContextNavigator contextNavigator, final Session session, final StateManager stateManager, + final SchedulerManager deferredCommandWrapper, + final Provider<ContentServiceAsync> contentServiceProvider, + final Provider<GroupServiceAsync> groupServiceProvider, + final Provider<FileUploader> fileUploaderProvider, + final ContentActionRegistry contentActionRegistry, + final ContextActionRegistry contextActionRegistry, + final Provider<FileDownloadUtils> fileDownloadProvider, final EntityHeader entityLogo, + final Provider<ContentEditor> textEditorProvider, final ErrorHandler errorHandler, + final GalleryViewer documentViewer, final Provider<ContextPropEditor> contextProvEditorProvider, + final GSpaceBackManager wsBackManager) { + super(session, stateManager, i18n, errorHandler, deferredCommandWrapper, groupServiceProvider, + contentServiceProvider, fileUploaderProvider, contextNavigator, contentActionRegistry, + contextActionRegistry, fileDownloadProvider, textEditorProvider, contextProvEditorProvider, + documentViewer, entityLogo, wsBackManager); + } - @Override - protected void createActions() { - final String[] all = { TYPE_ROOT, TYPE_ALBUM, TYPE_UPLOADEDFILE }; - final String[] containers = { TYPE_ROOT, TYPE_ALBUM }; - final String[] contentsModerated = { TYPE_UPLOADEDFILE }; - final String[] containersNoRoot = { TYPE_ALBUM }; - final String[] contents = { TYPE_UPLOADEDFILE }; + @Override + protected void createActions() { + final String[] all = { TYPE_ROOT, TYPE_ALBUM, TYPE_UPLOADEDFILE }; + final String[] containers = { TYPE_ROOT, TYPE_ALBUM }; + final String[] contentsModerated = { TYPE_UPLOADEDFILE }; + final String[] containersNoRoot = { TYPE_ALBUM }; + final String[] contents = { TYPE_UPLOADEDFILE }; - final String parentMenuTitle = i18n.t("File"); - final String parentMenuTitleCtx = i18n.t("Album"); + final String parentMenuTitle = i18n.t("File"); + final String parentMenuTitleCtx = i18n.t("Album"); - createNewContainerAction(TYPE_ALBUM, "images/nav/gallery_add.png", i18n.t("New sub-album"), parentMenuTitleCtx, - i18n.t("New"), i18n.t("New sub-album"), Position.ctx, TYPE_ALBUM); - createNewContainerAction(TYPE_ALBUM, "images/nav/gallery_add.png", i18n.t("New album"), parentMenuTitleCtx, - i18n.t("New"), i18n.t("New album"), Position.ctx, TYPE_ROOT); + createNewContainerAction(TYPE_ALBUM, "images/nav/gallery_add.png", i18n.t("New sub-album"), + parentMenuTitleCtx, i18n.t("New"), i18n.t("New sub-album"), Position.ctx, TYPE_ALBUM); + createNewContainerAction(TYPE_ALBUM, "images/nav/gallery_add.png", i18n.t("New album"), + parentMenuTitleCtx, i18n.t("New"), i18n.t("New album"), Position.ctx, TYPE_ROOT); - createContentRenameAction(parentMenuTitle, i18n.t("Rename"), contents); - createContentModeratedActions(parentMenuTitle, contentsModerated); - createRenameContentInCtxAction(parentMenuTitleCtx, i18n.t("Rename"), containersNoRoot); + createContentRenameAction(parentMenuTitle, i18n.t("Rename"), contents); + createContentModeratedActions(parentMenuTitle, contentsModerated); + createRenameContentInCtxAction(parentMenuTitleCtx, i18n.t("Rename"), containersNoRoot); - // final ActionToolbarMenuDescriptor<StateToken> setAsDefGroupCxt = - // createSetAsDefContent(parentMenuTitleCtx); + // final ActionToolbarMenuDescriptor<StateToken> setAsDefGroupCxt = + // createSetAsDefContent(parentMenuTitleCtx); - createRefreshCntAction(parentMenuTitle, contents); - createRefreshCxtAction(parentMenuTitleCtx, containers); + createRefreshCntAction(parentMenuTitle, contents); + createRefreshCxtAction(parentMenuTitleCtx, containers); - createSetAsDefContent(parentMenuTitle, contents); - createSetGroupBackImageAction(parentMenuTitle, TYPE_UPLOADEDFILE); + createSetAsDefContent(parentMenuTitle, contents); + // createSetGroupBackImageAction(parentMenuTitle, TYPE_UPLOADEDFILE); - // createUploadAction(i18n.t("Upload file"), "images/nav/upload.png", - // i18n.t("Upload some files (images, PDFs, ...)"), null, containers); + // createUploadAction(i18n.t("Upload file"), "images/nav/upload.png", + // i18n.t("Upload some files (images, PDFs, ...)"), null, containers); - createDownloadActions(TYPE_UPLOADEDFILE); + createDownloadActions(TYPE_UPLOADEDFILE); - createGoAction(all); + createGoAction(all); - createGoHomeAction(containers); + createGoHomeAction(containers); - // createTranslateAction(TYPE_ALBUM, TYPE_UPLOADEDFILE); + // createTranslateAction(TYPE_ALBUM, TYPE_UPLOADEDFILE); - createDelContainerAction("Delete folder", parentMenuTitleCtx, containersNoRoot); - createDelContentAction(parentMenuTitle, i18n.t("Delete"), contents); - createShowDeletedItems(parentMenuTitleCtx, all); - } + createDelContainerAction("Delete folder", parentMenuTitleCtx, containersNoRoot); + createDelContentAction(parentMenuTitle, i18n.t("Delete"), contents); + createShowDeletedItems(parentMenuTitleCtx, all); + } - @Override - protected void createPostSessionInitActions() { - super.createUploadMediaAction(TYPE_ALBUM); - } + @Override + protected void createPostSessionInitActions() { + super.createUploadMediaAction(TYPE_ALBUM); + } } Modified: trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientActions.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientActions.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/org/ourproject/kune/wiki/client/WikiClientActions.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -47,69 +47,72 @@ import com.calclab.suco.client.ioc.Provider; public class WikiClientActions extends OldAbstractFoldableContentActions { - public WikiClientActions(final I18nUITranslationService i18n, final ContextNavigator contextNavigator, - final Session session, final StateManager stateManager, final SchedulerManager deferredCommandWrapper, - final Provider<ContentServiceAsync> contentServiceProvider, - final Provider<GroupServiceAsync> groupServiceProvider, final Provider<FileUploader> fileUploaderProvider, - final ContentActionRegistry contentActionRegistry, final ContextActionRegistry contextActionRegistry, - final Provider<FileDownloadUtils> fileDownloadProvider, final EntityHeader entityLogo, - final Provider<ContentEditor> textEditorProvider, final ErrorHandler errorHandler, - final WikiViewer documentViewer, final Provider<ContextPropEditor> contextProvEditorProvider, - final GSpaceBackManager wsBackManager) { - super(session, stateManager, i18n, errorHandler, deferredCommandWrapper, groupServiceProvider, - contentServiceProvider, fileUploaderProvider, contextNavigator, contentActionRegistry, - contextActionRegistry, fileDownloadProvider, textEditorProvider, contextProvEditorProvider, - documentViewer, entityLogo, wsBackManager); - } + public WikiClientActions(final I18nUITranslationService i18n, final ContextNavigator contextNavigator, + final Session session, final StateManager stateManager, + final SchedulerManager deferredCommandWrapper, + final Provider<ContentServiceAsync> contentServiceProvider, + final Provider<GroupServiceAsync> groupServiceProvider, + final Provider<FileUploader> fileUploaderProvider, + final ContentActionRegistry contentActionRegistry, + final ContextActionRegistry contextActionRegistry, + final Provider<FileDownloadUtils> fileDownloadProvider, final EntityHeader entityLogo, + final Provider<ContentEditor> textEditorProvider, final ErrorHandler errorHandler, + final WikiViewer documentViewer, final Provider<ContextPropEditor> contextProvEditorProvider, + final GSpaceBackManager wsBackManager) { + super(session, stateManager, i18n, errorHandler, deferredCommandWrapper, groupServiceProvider, + contentServiceProvider, fileUploaderProvider, contextNavigator, contentActionRegistry, + contextActionRegistry, fileDownloadProvider, textEditorProvider, contextProvEditorProvider, + documentViewer, entityLogo, wsBackManager); + } - @Override - protected void createActions() { - final String[] all = { TYPE_ROOT, TYPE_FOLDER, TYPE_WIKIPAGE, TYPE_UPLOADEDFILE }; - final String[] containers = { TYPE_ROOT, TYPE_FOLDER }; - // final String[] contentsModerated = { }; - final String[] containersNoRoot = { TYPE_FOLDER }; - final String[] contents = { TYPE_WIKIPAGE, TYPE_UPLOADEDFILE }; + @Override + protected void createActions() { + final String[] all = { TYPE_ROOT, TYPE_FOLDER, TYPE_WIKIPAGE, TYPE_UPLOADEDFILE }; + final String[] containers = { TYPE_ROOT, TYPE_FOLDER }; + // final String[] contentsModerated = { }; + final String[] containersNoRoot = { TYPE_FOLDER }; + final String[] contents = { TYPE_WIKIPAGE, TYPE_UPLOADEDFILE }; - final String parentMenuTitle = i18n.t("Wikipage"); - final String parentMenuTitleCtx = i18n.t("Wiki"); + final String parentMenuTitle = i18n.t("Wikipage"); + final String parentMenuTitleCtx = i18n.t("Wiki"); - createNewContainerAction(TYPE_FOLDER, "images/nav/folder_add.png", i18n.t("New folder"), parentMenuTitleCtx, - i18n.t("New"), i18n.t("New folder"), Position.ctx, TYPE_ROOT, TYPE_FOLDER); + createNewContainerAction(TYPE_FOLDER, "images/nav/folder_add.png", i18n.t("New folder"), + parentMenuTitleCtx, i18n.t("New"), i18n.t("New folder"), Position.ctx, TYPE_ROOT, TYPE_FOLDER); - createNewContentAction(TYPE_WIKIPAGE, "images/nav/wikipage_add.png", i18n.t("New wikipage"), - parentMenuTitleCtx, Position.ctx, TYPE_ROOT, TYPE_FOLDER); + createNewContentAction(TYPE_WIKIPAGE, "images/nav/wikipage_add.png", i18n.t("New wikipage"), + parentMenuTitleCtx, Position.ctx, TYPE_ROOT, TYPE_FOLDER); - // createContentModeratedActions(parentMenuTitle, contentsModerated); - createTranslateAction(parentMenuTitle, TYPE_FOLDER, TYPE_WIKIPAGE); - createContentRenameAction(parentMenuTitle, i18n.t("Rename"), contents); - createRenameContentInCtxAction(parentMenuTitleCtx, i18n.t("Rename"), containersNoRoot); - createEditAction(parentMenuTitle, TYPE_WIKIPAGE); + // createContentModeratedActions(parentMenuTitle, contentsModerated); + createTranslateAction(parentMenuTitle, TYPE_FOLDER, TYPE_WIKIPAGE); + createContentRenameAction(parentMenuTitle, i18n.t("Rename"), contents); + createRenameContentInCtxAction(parentMenuTitleCtx, i18n.t("Rename"), containersNoRoot); + createEditAction(parentMenuTitle, TYPE_WIKIPAGE); - // final ActionToolbarMenuDescriptor<StateToken> setAsDefGroupCxt = - // createSetAsDefContent(parentMenuTitleCtx); + // final ActionToolbarMenuDescriptor<StateToken> setAsDefGroupCxt = + // createSetAsDefContent(parentMenuTitleCtx); - createRefreshCntAction(parentMenuTitle, contents); - createRefreshCxtAction(parentMenuTitleCtx, containers); + createRefreshCntAction(parentMenuTitle, contents); + createRefreshCxtAction(parentMenuTitleCtx, containers); - createSetAsDefContent(parentMenuTitle, contents); - createSetGroupBackImageAction(parentMenuTitle, TYPE_UPLOADEDFILE); + createSetAsDefContent(parentMenuTitle, contents); + // createSetGroupBackImageAction(parentMenuTitle, TYPE_UPLOADEDFILE); - createUploadAction(i18n.t("Upload file"), "images/nav/upload.png", - i18n.t("Upload some files (images, PDFs, ...)"), null, containers); + createUploadAction(i18n.t("Upload file"), "images/nav/upload.png", + i18n.t("Upload some files (images, PDFs, ...)"), null, containers); - createDownloadActions(TYPE_UPLOADEDFILE); + createDownloadActions(TYPE_UPLOADEDFILE); - createGoAction(all); + createGoAction(all); - createGoHomeAction(containers); + createGoHomeAction(containers); - createDelContainerAction("Delete folder", parentMenuTitleCtx, containersNoRoot); - createDelContentAction(parentMenuTitle, i18n.t("Delete"), contents); - createShowDeletedItems(parentMenuTitleCtx, all); - } + createDelContainerAction("Delete folder", parentMenuTitleCtx, containersNoRoot); + createDelContentAction(parentMenuTitle, i18n.t("Delete"), contents); + createShowDeletedItems(parentMenuTitleCtx, all); + } - @Override - protected void createPostSessionInitActions() { - // super.createUploadMediaAction(); - } + @Override + protected void createPostSessionInitActions() { + // super.createUploadMediaAction(); + } } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/OldAbstractFoldableContentActions.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/OldAbstractFoldableContentActions.java 2011-06-18 21:57:55 UTC (rev 1411) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/OldAbstractFoldableContentActions.java 2011-06-21 20:03:39 UTC (rev 1412) @@ -55,7 +55,6 @@ import cc.kune.core.shared.domain.utils.StateToken; import cc.kune.core.shared.dto.AccessRolDTO; import cc.kune.core.shared.dto.ContentSimpleDTO; -import cc.kune.core.shared.dto.GroupDTO; import cc.kune.core.shared.dto.InitDataDTO; import cc.kune.core.shared.dto.StateAbstractDTO; import cc.kune.core.shared.dto.StateContainerDTO; @@ -70,603 +69,616 @@ public abstract class OldAbstractFoldableContentActions { - protected enum Position { - cnt, ctx - } + protected enum Position { + cnt, ctx + } - public static final ActionToolbarPosition CONTENT_BOTTOMBAR = new ActionToolbarPosition("afca-ctn-bottom"); + public static final ActionToolbarPosition CONTENT_BOTTOMBAR = new ActionToolbarPosition( + "afca-ctn-bottom"); - public static final ActionToolbarPosition CONTENT_TOPBAR = new ActionToolbarPosition("afca-ctn-top"); - public static final ActionToolbarPosition CONTEXT_BOTTOMBAR = new ActionToolbarPosition("afca-ctx-bottom"); - public static final ActionToolbarPosition CONTEXT_TOPBAR = new ActionToolbarPosition("afca-ctx-top"); - private static final String PUBLICATION_MENU = "Publication"; + public static final ActionToolbarPosition CONTENT_TOPBAR = new ActionToolbarPosition("afca-ctn-top"); + public static final ActionToolbarPosition CONTEXT_BOTTOMBAR = new ActionToolbarPosition( + "afca-ctx-bottom"); + public static final ActionToolbarPosition CONTEXT_TOPBAR = new ActionToolbarPosition("afca-ctx-top"); + private static final String PUBLICATION_MENU = "Publication"; - protected final ContentActionRegistry contentActionRegistry; - protected final Provider<ContentServiceAsync> contentServiceProvider; - protected final ContextActionRegistry contextActionRegistry; - protected final ContextNavigator contextNavigator; - protected final Provider<ContextPropEditor> contextPropEditorProvider; - protected final SchedulerManager deferredCommandWrapper; - protected final EntityHeader entityLogo; - protected final ErrorHandler errorHandler; - protected final Provider<FileDownloadUtils> fileDownloadProvider; - protected final Provider<FileUploader> fileUploaderProvider; - protected final FoldableContent foldableContent; - protected final Provider<GroupServiceAsync> groupServiceProvider; - protected final I18nUITranslationService i18n; + protected final ContentActionRegistry contentActionRegistry; + protected final Provider<ContentServiceAsync> contentServiceProvider; + protected final ContextActionRegistry contextActionRegistry; + protected final ContextNavigator contextNavigator; + protected final Provider<ContextPropEditor> contextPropEditorProvider; + protected final SchedulerManager deferredCommandWrapper; + protected final EntityHeader entityLogo; + protected final ErrorHandler errorHandler; + protected final Provider<FileDownloadUtils> fileDownloadProvider; + protected final Provider<FileUploader> fileUploaderProvider; + protected final FoldableContent foldableContent; + protected final Provider<GroupServiceAsync> groupServiceProvider; + protected final I18nUITranslationService i18n; - protected final Session session; - protected final StateManager stateManager; - protected final Provider<ContentEditor> textEditorProvider; + protected final Session session; + protected final StateManager stateManager; + protected final Provider<ContentEditor> textEditorProvider; - private final GSpaceBackManager wsBackManager; + private final GSpaceBackManager wsBackManager; - public OldAbstractFoldableContentActions(final Session session, final StateManager stateManager, - final I18nUITranslationService i18n, final ErrorHandler errorHandler, - final SchedulerManager deferredCommandWrapper, final Provider<GroupServiceAsync> groupServiceProvider, - final Provider<ContentServiceAsync> contentServiceProvider, - final Provider<FileUploader> fileUploaderProvider, final ContextNavigator contextNavigator, - final ContentActionRegistry contentActionRegistry, final ContextActionRegistry contextActionRegistry, - final Provider<FileDownloadUtils> fileDownloadProvider, final Provider<ContentEditor> textEditorProvider, - final Provider<ContextPropEditor> contextPropEditorProvider, final FoldableContent foldableContent, - final EntityHeader entityLogo, final GSpaceBackManager wsBackManager) { - 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; - this.wsBackManager = wsBackManager; - createActions(); - session.onInitDataReceived(new Listener<InitDataDTO>() { - @Override - public void onEvent(final InitDataDTO parameter) { - createPostSessionInitActions(); - } - }); - } + public OldAbstractFoldableContentActions(final Session session, final StateManager stateManager, + final I18nUITranslationService i18n, final ErrorHandler errorHandler, + final SchedulerManager deferredCommandWrapper, + final Provider<GroupServiceAsync> groupServiceProvider, + final Provider<ContentServiceAsync> contentServiceProvider, + final Provider<FileUploader> fileUploaderProvider, final ContextNavigator contextNavigator, + final ContentActionRegistry contentActionRegistry, + final ContextActionRegistry contextActionRegistry, + final Provider<FileDownloadUtils> fileDownloadProvider, + final Provider<ContentEditor> textEditorProvider, + final Provider<ContextPropEditor> contextPropEditorProvider, + final FoldableContent foldableContent, final EntityHeader entityLogo, + final GSpaceBackManager wsBackManager) { + 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; + this.wsBackManager = wsBackManager; + createActions(); + session.onInitDataReceived(new Listener<InitDataDTO>() { + @Override + public void onEvent(final InitDataDTO parameter) { + createPostSessionInitActions(); + } + }); + } - protected abstract void createActions(); + protected abstract void createActions(); - protected void createContentModeratedActions(final String parentMenuTitle, final String... contentsModerated) { - createSetStatusAction(AccessRolDTO.Administrator, i18n.t("Published online"), ContentStatus.publishedOnline, - contentsModerated); - createSetStatusAction(AccessRolDTO.Editor, i18n.t("Editing in progress"), ContentStatus.editingInProgress, - contentsModerated); - createSetStatusAction(AccessRolDTO.Administrator, i18n.t("Rejected"), ContentStatus.rejected, contentsModerated); - createSetStatusAction(AccessRolDTO.Editor, i18n.t("Submitted for publish"), - ContentStatus.submittedForEvaluation, contentsModerated); - createSetStatusAction(AccessRolDTO.Administrator, i18n.t("In the rubbish bin"), ContentStatus.inTheDustbin, - contentsModerated); - } + protected void createContentModeratedActions(final String parentMenuTitle, + final String... contentsModerated) { + createSetStatusAction(AccessRolDTO.Administrator, i18n.t("Published online"), + ContentStatus.publishedOnline, contentsModerated); + createSetStatusAction(AccessRolDTO.Editor, i18n.t("Editing in progress"), + ContentStatus.editingInProgress, contentsModerated); + createSetStatusAction(AccessRolDTO.Administrator, i18n.t("Rejected"), ContentStatus.rejected, + contentsModerated); + createSetStatusAction(AccessRolDTO.Editor, i18n.t("Submitted for publish"), + ContentStatus.submittedForEvaluation, contentsModerated); + createSetStatusAction(AccessRolDTO.Administrator, i18n.t("In the rubbish bin"), + ContentStatus.inTheDustbin, contentsModerated); + } - protected void createContentRenameAction(final String parentMenuTitle, final String textDescription, - final String... registerInTypes) { - final ActionToolbarMenuAndItemDescriptor<StateToken> renameCtn = new ActionToolbarMenuAndItemDescriptor<StateToken>( - AccessRolDTO.Editor, CONTENT_TOPBAR, new Listener<StateToken>() { - @Override - public void onEvent(final StateToken stateToken) { - contextNavigator.editItem(stateToken); - } - }); - renameCtn.setTextDescription(textDescription); - renameCtn.setParentMenuTitle(parentMenuTitle); - renameCtn.setEnableCondition(notDeleted()); + protected void createContentRenameAction(final String parentMenuTitle, final String textDescription, + final String... registerInTypes) { + final ActionToolbarMenuAndItemDescriptor<StateToken> renameCtn = new ActionToolbarMenuAndItemDescriptor<StateToken>( + AccessRolDTO.Editor, CONTENT_TOPBAR, new Listener<StateToken>() { + @Override + public void onEvent(final StateToken stateToken) { + contextNavigator.editItem(stateToken); + } + }); + renameCtn.setTextDescription(textDescription); + renameCtn.setParentMenuTitle(parentMenuTitle); + renameCtn.setEnableCondition(notDeleted()); - // contentActionRegistry.addAction(renameCtn, registerInTypes); - } + // contentActionRegistry.addAction(renameCtn, registerInTypes); + } - protected void createDelContainerAction(final String text, final String parentMenuTitle, - final String... registerInTypes) { - final ActionToolbarMenuAndItemDescriptor<StateToken> delContainer = new ActionToolbarMenuAndItemDescriptor<StateToken>( - AccessRolDTO.Administrator, CONTENT_TOPBAR, new Listener<StateToken>() { - @Override - public void onEvent(final StateToken token) { - OldNotifyUser.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 with all its contents. Are you sure?")); - contextActionRegistry.addAction(delContainer, registerInTypes); - } + protected void createDelContainerAction(final String text, final String parentMenuTitle, + final String... registerInTypes) { + final ActionToolbarMenuAndItemDescriptor<StateToken> delContainer = new ActionToolbarMenuAndItemDescriptor<StateToken>( + AccessRolDTO.Administrator, CONTENT_TOPBAR, new Listener<StateToken>() { + @Override + public void onEvent(final StateToken token) { + OldNotifyUser.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 with all its contents. Are you sure?")); + contextActionRegistry.addAction(delContainer, registerInTypes); + } - protected void createDelContentAction(final String parentMenuTitle, final String textDescription, - final String... registerInTypes) { - final ActionToolbarMenuAndItemDescriptor<StateToken> delContent = new ActionToolbarMenuAndItemDescriptor<StateToken>( - AccessRolDTO.Administrator, CONTENT_TOPBAR, new Listener<StateToken>() { - @Override - public void onEvent(final StateToken token) { - contentServiceProvider.get().delContent(session.getUserHash(), token, - new AsyncCallbackSimple<StateContentDTO>() { - @Override - public void onSuccess(final StateContentDTO state) { - session.setCurrentState(state); - final StateToken parent = token.copy().clearDocument(); - stateManager.gotoStateToken(parent); - contextNavigator.clear(); - contextNavigator.refreshState(); - } - }); - } + protected void createDelContentAction(final String parentMenuTitle, final String textDescription, + final String... registerInTypes) { + final ActionToolbarMenuAndItemDescriptor<StateToken> delContent = new ActionToolbarMenuAndItemDescriptor<StateToken>( + AccessRolDTO.Administrator, CONTENT_TOPBAR, new Listener<StateToken>() { + @Override + public void onEvent(final StateToken token) { + contentServiceProvider.get().delContent(session.getUserHash(), token, + new AsyncCallbackSimple<StateContentDTO>() { + @Override + public void onSuccess(final StateContentDTO state) { + session.setCurrentState(state); + final StateToken parent = token.copy().clearDocument(); + stateManager.gotoStateToken(parent); + contextNavigator.clear(); + contextNavigator.refreshState(); + } }); - delContent.setParentMenuTitle(parentMenuTitle); - delContent.setTextDescription(textDescription); - delContent.setMustBeConfirmed(true); - delContent.setConfirmationTitle(i18n.t("Please confirm")); - delContent.setConfirmationText(i18n.t("Are you sure?")); - delContent.setEnableCondition(notDefAndNotDeleted()); - // contentActionRegistry.addAction(delContent, registerInTypes); - } + } + }); + delContent.setParentMenuTitle(parentMenuTitle); + delContent.setTextDescription(textDescription); + delContent.setMustBeConfirmed(true); + delContent.setConfirmationTitle(i18n.t("Please confirm")); + delContent.setConfirmationText(i18n.t("Are you sure?")); + delContent.setEnableCondition(notDefAndNotDeleted()); + // contentActionRegistry.addAction(delContent, registerInTypes); + } - protected void createDownloadActions(final String typeUploadedfile) { - final ActionToolbarButtonDescriptor<StateToken> download = new ActionToolbarButtonDescriptor<StateToken>( - AccessRolDTO.Viewer, CONTENT_TOPBAR, new Listener<StateToken>() { - @Override - 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"); + protected void createDownloadActions(final String typeUploadedfile) { + final ActionToolbarButtonDescriptor<StateToken> download = new ActionToolbarButtonDescriptor<StateToken>( + AccessRolDTO.Viewer, CONTENT_TOPBAR, new Listener<StateToken>() { + @Override + 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>() { - @Override - public void onEvent(final StateToken token) { - downloadContent(token); - } - }); - downloadCtx.setMustBeAuthenticated(false); - downloadCtx.setTextDescription(i18n.t("Download")); - downloadCtx.setIconUrl("images/nav/download.png"); + final ActionMenuItemDescriptor<StateToken> downloadCtx = new ActionMenuItemDescriptor<StateToken>( + AccessRolDTO.Viewer, new Listener<StateToken>() { + @Override + public void onEvent(final StateToken token) { + downloadContent(token); + } + }); + downloadCtx.setMustBeAuthenticated(false); + downloadCtx.setTextDescription(i18n.t("Download")); + downloadCtx.setIconUrl("images/nav/download.png"); - // contentActionRegistry.addAction(download, typeUploadedfile); - contextActionRegistry.addAction(downloadCtx, typeUploadedfile); - } + // contentActionRegistry.addAction(download, typeUploadedfile); + contextActionRegistry.addAction(downloadCtx, typeUploadedfile); + } - protected ActionToolbarButtonDescriptor<StateToken> createEditAction(final String fileMenuTitle, - final String... registerInTypes) { - final ActionToolbarButtonDescriptor<StateToken> editContent = new ActionToolbarButtonDescriptor<StateToken>( - AccessRolDTO.Editor, CONTENT_TOPBAR, new Listener<StateToken>() { - @Override - public void onEvent(final StateToken stateToken) { - OldNotifyUser.showProgressProcessing(); - session.check(new AsyncCallbackSimple<Void>() { - @Override - public void onSuccess(final Void result) { - final ContentEditor editor = textEditorProvider.get(); - foldableContent.detach(); - contextNavigator.detach(); - contextPropEditorProvider.get().attach(); - editor.edit(session.getContentState().getContent(), new Listener<String>() { - @Override - public void onEvent(final String html) { - OldNotifyUser.showProgressSaving(); - contentServiceProvider.get().save(session.getUserHash(), stateToken, html, - new AsyncCallback<Void>() { - @Override - public void onFailure(final Throwable caught) { - OldNotifyUser.hideProgress(); - if (caught instanceof SessionExpiredException) { - errorHandler.doSessionExpired(); - } else { - OldNotifyUser.error(i18n.t("Error saving document. Retrying...")); - errorHandler.process(caught); - editor.onSaveFailed(); - } - } + protected ActionToolbarButtonDescriptor<StateToken> createEditAction(final String fileMenuTitle, + final String... registerInTypes) { + final ActionToolbarButtonDescriptor<StateToken> editContent = new ActionToolbarButtonDescriptor<StateToken>( + AccessRolDTO.Editor, CONTENT_TOPBAR, new Listener<StateToken>() { + @Override + public void onEvent(final StateToken stateToken) { + OldNotifyUser.showProgressProcessing(); + session.check(new AsyncCallbackSimple<Void>() { + @Override + public void onSuccess(final Void result) { + final ContentEditor editor = textEditorProvider.get(); + foldableContent.detach(); + contextNavigator.detach(); + contextPropEditorProvider.get().attach(); + editor.edit(session.getContentState().getContent(), new Listener<String>() { + @Override + public void onEvent(final String html) { + OldNotifyUser.showProgressSaving(); + contentServiceProvider.get().save(session.getUserHash(), stateToken, html, + new AsyncCallback<Void>() { + @Override + public void onFailure(final Throwable caught) { + OldNotifyUser.hideProgress(); + if (caught instanceof SessionExpiredException) { + errorHandler.doSessionExpired(); + } else { + OldNotifyUser.error(i18n.t("Error saving document. Retrying...")); + errorHandler.process(caught); + editor.onSaveFailed(); + } + } - @Override - public void onSuccess(final Void param) { - OldNotifyUser.hideProgress(); - session.getContentState().setContent(html); - editor.onSavedSuccessful(); - } - }); - } - }, new Listener0() { - @Override - public void onEvent() { - // onClose - deferredCommandWrapper.addCommand(new ScheduledCommand() { - @Override - public void execute() { - foldableContent.attach(); - contextPropEditorProvider.get().detach(); - contextNavigator.attach(); - if (session.inSameToken(stateToken)) { - contextNavigator.refreshState(); - foldableContent.refreshState(); - } - } - }); - } - }); - editor.setFileMenuTitle(fileMenuTitle); - OldNotifyUser.hideProgress(); - } + @Override + public void onSuccess(final Void param) { + OldNotifyUser.hideProgress(); + session.getContentState().setContent(html); + editor.onSavedSuccessful(); + } }); - } + } + }, new Listener0() { + @Override + public void onEvent() { + // onClose + deferredCommandWrapper.addCommand(new ScheduledCommand() { + @Override + public void execute() { + foldableContent.attach(); + contextPropEditorProvider.get().detach(); + contextNavigator.attach(); + if (session.inSameToken(stateToken)) { + contextNavigator.refreshState(); + foldableContent.refreshState(); + } + } + }); + } }); - editContent.setTextDescription(i18n.tWithNT("Edit", "used in button")); - editContent.setIconUrl("images/content_edit.png"); - editContent.setLeftSeparator(ActionToolbarButtonSeparator.spacer); - editContent.setEnableCondition(notDeleted()); - // contentActionRegistry.addAction(editContent, registerInTypes); - return editContent; - } + editor.setFileMenuTitle(fileMenuTitle); + OldNotifyUser.hideProgress(); + } + }); + } + }); + editContent.setTextDescription(i18n.tWithNT("Edit", "used in button")); + editContent.setIconUrl("images/content_edit.png"); + editContent.setLeftSeparator(ActionToolbarButtonSeparator.spacer); + editContent.setEnableCondition(notDeleted()); + // contentActionRegistry.addAction(editContent, registerInTypes); + return editContent; + } - protected ActionMenuItemDescriptor<StateToken> createGoAction(final String... registerInTypes) { - final ActionMenuItemDescriptor<StateToken> go = new ActionMenuItemDescriptor<StateToken>(AccessRolDTO.Viewer, - new Listener<StateToken>() { - @Override - public void onEvent(final StateToken token) { - stateManager.gotoStateToken(token); - } - }); - go.setMustBeAuthenticated(false); - go.setTextDescription(i18n.t("Open")); - go.setIconUrl("images/nav/go.png"); - contextActionRegistry.addAction(go, registerInTypes); - return go; - } + protected ActionMenuItemDescriptor<StateToken> createGoAction(final String... registerInTypes) { + final ActionMenuItemDescriptor<StateToken> go = new ActionMenuItemDescriptor<StateToken>( + AccessRolDTO.Viewer, new Listener<StateToken>() { + @Override + public void onEvent(final StateToken token) { + stateManager.gotoStateToken(token); + } + }); + go.setMustBeAuthenticated(false); + go.setTextDescription(i18n.t("Open")); + go.setIconUrl("images/nav/go.png"); + contextActionRegistry.addAction(go, registerInTypes); + return go; + } - protected ActionToolbarButtonDescriptor<StateToken> createGoHomeAction(final String... registerInTypes) { - final ActionToolbarButtonDescriptor<StateToken> goGroupHome = new ActionToolbarButtonDescriptor<StateToken>( - AccessRolDTO.Viewer, CONTEXT_TOPBAR, new Listener<StateToken>() { - @Override - public void onEvent(final StateToken token) { - stateManager.gotoHistoryToken(token.getGroup()); - } - }); - goGroupHome.setMustBeAuthenticated(false); - goGroupHome.setIconUrl("images/group-home.png"); - goGroupHome.setEnableCondition(new ActionEnableCondition<StateToken>() { - @Override - public boolean mustBeEnabled(final StateToken token) { - final StateToken defContentToken = session.getCurrentState().getGroup().getDefaultContent().getStateToken(); - return !session.getCurrentStateToken().equals(defContentToken); - } + protected ActionToolbarButtonDescriptor<StateToken> createGoHomeAction(final String... registerInTypes) { + final ActionToolbarButtonDescriptor<StateToken> goGroupHome = new ActionToolbarButtonDescriptor<StateToken>( + AccessRolDTO.Viewer, CONTEXT_TOPBAR, new Listener<StateToken>() { + @Override + public void onEvent(final StateToken token) { + stateManager.gotoHistoryToken(token.getGroup()); + } }); - goGroupHome.setLeftSeparator(ActionToolbarButtonSeparator.fill); - contextActionRegistry.addAction(goGroupHome, registerInTypes); - return goGroupHome; - } + goGroupHome.setMustBeAuthenticated(false); + goGroupHome.setIconUrl("images/group-home.png"); + goGroupHome.setEnableCondition(new ActionEnableCondition<StateToken>() { + @Override + public boolean mustBeEnabled(final StateToken token) { + final StateToken defContentToken = session.getCurrentState().getGroup().getDefaultContent().getStateToken(); + return !session.getCurrentStateToken().equals(defContentToken); + } + }); + goGroupHome.setLeftSeparator(ActionToolbarButtonSeparator.fill); + contextActionRegistry.addAction(goGroupHome, registerInTypes); + return goGroupHome; + } - protected void createNewContainerAction(final String contentTypeId, final String iconUrl, - final String textDescription, final String parentMenuTitle, final String parentMenuSubtitle, - final String defaultName, final Position position, final String... registerInTypes) { - final ActionToolbarMenuAndItemDescriptor<StateToken> addFolder; - addFolder = new ActionToolbarMenuAndItemDescriptor<StateToken>(AccessRolDTO.Editor, CONTEXT_TOPBAR, - new Listener<StateToken>() { - @Override - public void onEvent(final StateToken stateToken) { - OldNotifyUser.showProgressProcessing(); - contentServiceProvider.get().addFolder(session.getUserHash(), stateToken, defaultName, - contentTypeId, new AsyncCallbackSimple<StateContainerDTO>() { - @Override - public void onSuccess(final StateContainerDTO state) { - contextNavigator.setEditOnNextStateChange(true); - stateManager.setRetrievedStateAndGo(state); - } - }); - } + protected void createNewContainerAction(final String contentTypeId, final String iconUrl, + final String textDescription, final String parentMenuTitle, final String parentMenuSubtitle, + final String defaultName, final Position position, final String... registerInTypes) { + final ActionToolbarMenuAndItemDescriptor<StateToken> addFolder; + addFolder = new ActionToolbarMenuAndItemDescriptor<StateToken>(AccessRolDTO.Editor, CONTEXT_TOPBAR, + new Listener<StateToken>() { + @Override + public void onEvent(final StateToken stateToken) { + OldNotifyUser.showProgressProcessing(); + contentServiceProvider.get().addFolder(session.getUserHash(), stateToken, defaultName, + contentTypeId, new AsyncCallbackSimple<StateContainerDTO>() { + @Override + public void onSuccess(final StateContainerDTO state) { + contextNavigator.setEditOnNextStateChange(true); + stateManager.setRetrievedStateAndGo(state); + } }); - addFolder.setTextDescription(textDescription); - addFolder.setParentMenuTitle(parentMenuTitle); - addFolder.setParentSubMenuTitle(parentMenuSubtitle); - addFolder.setIconUrl(iconUrl); - register(addFolder, position, registerInTypes); - } + } + }); + addFolder.setTextDescription(textDescription); + addFolder.setParentMenuTitle(parentMenuTitle); + addFolder.setParentSubMenuTitle(parentMenuSubtitle); + addFolder.setIconUrl(iconUrl); + register(addFolder, position, registerInTypes); + } - protected ActionToolbarMenuAndItemDescriptor<StateToken> createNewContentAction(final String typeId, - final String iconUrl, final String description, final String parentMenuTitle, final Position position, - final String... registerInTypes) { - final ActionToolbarMenuAndItemDescriptor<StateToken> addContent = new ActionToolbarMenuAndItemDescriptor<StateToken>( - AccessRolDTO.Editor, CONTEXT_TOPBAR, new Listener0() { - @Override - public void onEvent() { - OldNotifyUser.showProgressProcessing(); - contentServiceProvider.get().addContent(session.getUserHash(), - session.getCurrentState().getStateToken(), description, typeId, - new AsyncCallbackSimple<StateContentDTO>() { - @Override - public void onSuccess(final StateContentDTO state) { - contextNavigator.setEditOnNextStateChange(true); - stateManager.setRetrievedStateAndGo(state); - } - }); - } + protected ActionToolbarMenuAndItemDescriptor<StateToken> createNewContentAction(final String typeId, + final String iconUrl, final String description, final String parentMenuTitle, + final Position position, final String... registerInTypes) { + final ActionToolbarMenuAndItemDescriptor<StateToken> addContent = new ActionToolbarMenuAndItemDescriptor<StateToken>( + AccessRolDTO.Editor, CONTEXT_TOPBAR, new Listener0() { + @Override + public void onEvent() { + OldNotifyUser.showProgressProcessing(); + contentServiceProvider.get().addContent(session.getUserHash(), + session.getCurrentState().getStateToken(), description, typeId, + new AsyncCallbackSimple<StateContentDTO>() { + @Override + public void onSuccess(final StateContentDTO state) { + contextNavigator.setEditOnNextStateChange(true); + stateManager.setRetrievedStateAndGo(state); + } }); - addContent.setTextDescription(description); - addContent.setParentMenuTitle(parentMenuTitle); - addContent.setParentSubMenuTitle(i18n.t("New")); - addContent.setIconUrl(iconUrl); - register(addContent, position, registerInTypes); - return addContent; - } + } + }); + addContent.setTextDescription(description); + addContent.setParentMenuTitle(parentMenuTitle); + addContent.setParentSubMenuTitle(i18n.t("New")); + addContent.setIconUrl(iconUrl); + register(addContent, position, registerInTypes); + return addContent; + } - protected abstract void createPostSessionInitActions(); + protected abstract void createPostSessionInitActions(); - protected ActionToolbarMenuDescriptor<StateToken> createRefreshCntAction(final String parentMenuTitle, - final String... registerInTypes) { - final ActionToolbarMenuDescriptor<StateToken> refreshCnt = new ActionToolbarMenuDescriptor<StateToken>( - AccessRolDTO.Editor, CONTENT_TOPBAR, new Listener<StateToken>() { - @Override - 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"); - // contentActionRegistry.addAction(refreshCnt, registerInTypes); - return refreshCnt; - } + protected ActionToolbarMenuDescriptor<StateToken> createRefreshCntAction(final String parentMenuTitle, + final String... registerInTypes) { + final ActionToolbarMenuDescriptor<StateToken> refreshCnt = new ActionToolbarMenuDescriptor<StateToken>( + AccessRolDTO.Editor, CONTENT_TOPBAR, new Listener<StateToken>() { + @Override + 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"); + // contentActionRegistry.addAction(refreshCnt, registerInTypes); + return refreshCnt; + } - protected ActionToolbarMenuDescriptor<StateToken> createRefreshCxtAction(final String parentMenuTitleCtx, - final String... registerInTypes) { - final ActionToolbarMenuDescriptor<StateToken> refreshCtx = new ActionToolbarMenuDescriptor<StateToken>( - AccessRolDTO.Editor, CONTEXT_TOPBAR, new Listener<StateToken>() { - @Override - 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"); - contextActionRegistry.addAction(refreshCtx, registerInTypes); - return refreshCtx; - } + protected ActionToolbarMenuDescriptor<StateToken> createRefreshCxtAction( + final String parentMenuTitleCtx, final String... registerInTypes) { + final ActionToolbarMenuDescriptor<StateToken> refreshCtx = new ActionToolbarMenuDescriptor<StateToken>( + AccessRolDTO.Editor, CONTEXT_TOPBAR, new Listener<StateToken>() { + @Override + 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"); + contextActionRegistry.addAction(refreshCtx, registerInTypes); + return refreshCtx; + } - protected ActionToolbarMenuAndItemDescriptor<StateToken> createRenameContentInCtxAction( - final String parentMenuTitleCtx, final String textDescription, final String... registerInTypes) { - final ActionToolbarMenuAndItemDescriptor<StateToken> renameCtx = new ActionToolbarMenuAndItemDescriptor<StateToken>( - AccessRolDTO.Editor, CONTEXT_TOPBAR, new Listener<StateToken>() { - @Override - public void onEvent(final StateToken stateToken) { - contextNavigator.editItem(stateToken); - } - }); - renameCtx.setTextDescription(textDescription); - renameCtx.setParentMenuTitle(parentMenuTitleCtx); - contextActionRegistry.addAction(renameCtx, registerInTypes); - return renameCtx; - } + protected ActionToolbarMenuAndItemDescriptor<StateToken> createRenameContentInCtxAction( + final String parentMenuTitleCtx, final String textDescription, final String... registerInTypes) { + final ActionToolbarMenuAndItemDescriptor<StateToken> renameCtx = new ActionToolbarMenuAndItemDescriptor<StateToken>( + AccessRolDTO.Editor, CONTEXT_TOPBAR, new Listener<StateToken>() { + @Override + public void onEvent(final StateToken stateToken) { + contextNavigator.editItem(stateToken); + } + }); + renameCtx.setTextDescription(textDescription); + renameCtx.setParentMenuTitle(parentMenuTitleCtx); + contextActionRegistry.addAction(renameCtx, registerInTypes); + return renameCtx; + } - protected ActionToolbarMenuDescriptor<StateToken> createSetAsDefContent(final String parentMenuTitle, - final String... registerInTypes) { - final ActionToolbarMenuDescriptor<StateToken> setAsDefGroupContent; - setAsDefGroupContent = new ActionToolbarMenuDescriptor<StateToken>(AccessRolDTO.Administrator, CONTENT_TOPBAR, - new Listener<StateToken>() { - @Override - public void onEvent(final StateToken token) { - OldNotifyUser.showProgressProcessing(); - contentServiceProvider.get().setAsDefaultContent(session.getUserHash(), token, - new AsyncCallbackSimple<ContentSimpleDTO>() { - @Override - public void onSuccess(final ContentSimpleDTO defContent) { - session.getCurrentState().getGroup().setDefaultContent(defContent); - OldNotifyUser.hideProgress(); - OldNotifyUser.info(i18n.t("Content selected as the group homepage")); - } - }); - } + protected ActionToolbarMenuDescriptor<StateToken> createSetAsDefContent(final String parentMenuTitle, + final String... registerInTypes) { + final ActionToolbarMenuDescriptor<StateToken> setAsDefGroupContent; + setAsDefGroupContent = new ActionToolbarMenuDescriptor<StateToken>(AccessRolDTO.Administrator, + CONTENT_TOPBAR, new Listener<StateToken>() { + @Override + public void onEvent(final StateToken token) { + OldNotifyUser.showProgressProcessing(); + contentServiceProvider.get().setAsDefaultContent(session.getUserHash(), token, + new AsyncCallbackSimple<ContentSimpleDTO>() { + @Override + public void onSuccess(final ContentSimpleDTO defContent) { + session.getCurrentState().getGroup().setDefaultContent(defContent); + OldNotifyUser.hideProgress(); + OldNotifyUser.info(i18n.t("Content selected as the group homepage")); + } }); - setAsDefGroupContent.setTextDescription(i18n.t("Set this as the default group page")); - setAsDefGroupContent.setIconUrl("images/group-home.png"); - setAsDefGroupContent.setEnableCondition(notDefAndNotDeleted()); - setAsDefGroupContent.setParentMenuTitle(parentMenuTitle); - // contentActionRegistry.addAction(setAsDefGroupContent, - // registerInTypes); - return setAsDefGroupContent; - } + } + }); + setAsDefGroupContent.setTextDescription(i18n.t("Set this as the default group page")); + setAsDefGroupContent.setIconUrl("images/group-home.png"); + setAsDefGroupContent.setEnableCondition(notDefAndNotDeleted()); + setAsDefGroupContent.setParentMenuTitle(parentMenuTitle); + // contentActionRegistry.addAction(setAsDefGroupContent, + // registerInTypes); + return setAsDefGroupContent; + } - protected void createSetGroupBackImageAction(final String parentMenuTitle, final String... registerInTypes) { - final ActionToolbarMenuAndItemDescriptor<StateToken> setGroupBackImage = new ActionToolbarMenuAndItemDescriptor<StateToken>( - AccessRolDTO.Administrator, CONTENT_TOPBAR, new Listener<StateToken>() { - @Override - public void onEvent(final StateToken token) { - groupServiceProvider.get().setGroupBackImage(session.getUserHash(), token, - new AsyncCallbackSimple<GroupDTO>() { - @Override - public void onSuccess(final GroupDTO newGroup) { - if (session.getCurrentState().getGroup().getShortName().equals( - newGroup.getShortName())) { - session.getCurrentState().setGroup(newGroup); - wsBackManager.clearBackImage(); - wsBackManager.setBackImage(newGroup.getGroupBackImage().getStateToken()); - } - } - }); - } - }); - setGroupBackImage.setParentMenuTitle(parentMenuTitle); - setGroupBackImage.setTextDescription(i18n.t("Set this as the group background image")); - setGroupBackImage.setIconUrl("images/nav/picture.png"); - setGroupBackImage.setEnableCondition(new ActionEnableCondition<StateToken>() { - @Override - public boolean mustBeEnabled(final StateToken token) { - return session.getContentState().getMimeType().isImage(); + // + // protected void createSetGroupBackImageAction(final String parentMenuTitle, + // final String... registerInTypes) { + // final ActionToolbarMenuAndItemDescriptor<StateToken> setGroupBackImage = + // new ActionToolbarMenuAndItemDescriptor<StateToken>( + // AccessRolDTO.Administrator, CONTENT_TOPBAR, new Listener<StateToken>() { + // @Override + // public void onEvent(final StateToken token) { + // groupServiceProvider.get().setGroupBackImage(session.getUserHash(), token, + // new AsyncCallbackSimple<GroupDTO>() { + // @Override + // public void onSuccess(final GroupDTO newGroup) { + // if (session.getCurrentState().getGroup().getShortName().equals( + // newGroup.getShortName())) { + // session.getCurrentState().setGroup(newGroup); + // wsBackManager.clearBackImage(); + // wsBackManager.setBackImage(newGroup.getGroupBackImage().getStateToken()); + // } + // } + // }); + // } + // }); + // setGroupBackImage.setParentMenuTitle(parentMenuTitle); + // setGroupBackImage.setTextDescription(i18n.t("Set this as the group background image")); + // setGroupBackImage.setIconUrl("images/nav/picture.png"); + // setGroupBackImage.setEnableCondition(new + // ActionEnableCondition<StateToken>() { + // @Override + // public boolean mustBeEnabled(final StateToken token) { + // return session.getContentState().getMimeType().isImage(); + // } + // }); + // // contentActionRegistry.addAction(setGroupBackImage, registerInTypes); + // } + + protected void createSetStatusAction(final AccessRolDTO rol, final String textDescription, + final ContentStatus status, final String[] contentsModerated) { + final ActionToolbarMenuRadioDescriptor<StateToken> action = new ActionToolbarMenuRadioDescriptor<StateToken>( + rol, CONTENT_TOPBAR, new Listener<StateToken>() { + @Override + public void onEvent(final StateToken stateToken) { + setContentStatus(status, stateToken); + } + }, "ContentRadioStatus", new RadioMustBeChecked() { + @Override + public boolean mustBeChecked() { + if (session.getContainerState() instanceof StateContentDTO) { + final ContentStatus currentStatus = session.getContentState().getStatus(); + return status.equals(currentStatus); } + return false; + } }); - // contentActionRegistry.addAction(setGroupBackImage, registerInTypes); - } + action.setTextDescription(textDescription); + action.setParentMenuTitle(PUBLICATION_MENU); + action.setParentMenuIconUrl("images/anybody.png"); + // contentActionRegistry.addAction(action, contentsModerated); + } - protected void createSetStatusAction(final AccessRolDTO rol, final String textDescription, - final ContentStatus status, final String[] contentsModerated) { - final ActionToolbarMenuRadioDescriptor<StateToken> action = new ActionToolbarMenuRadioDescriptor<StateToken>( - rol, CONTENT_TOPBAR, new Listener<StateToken>() { - @Override - public void onEvent(final StateToken stateToken) { - setContentStatus(status, stateToken); - } - }, "ContentRadioStatus", new RadioMustBeChecked() { - @Override - public boolean mustBeChecked() { - if (session.getContainerState() instanceof StateContentDTO) { - final ContentStatus currentStatus = session.getContentState().getStatus(); - return status.equals(currentStatus); - } - return false; - } - }); - action.setTextDescription(textDescription); - action.setParentMenuTitle(PUBLICATION_MENU); - action.setParentMenuIconUrl("images/anybody.png"); - // contentActionRegistry.addAction(action, contentsModerated); - } + protected void createShowDeletedItems(final String parentMenuTitle, final String... registerInTypes) { + final ActionToolbarMenuCheckItemDescriptor<StateToken> showDeletedItems = new ActionToolbarMenuCheckItemDescriptor<StateToken>( + AccessRolDTO.Editor, CONTEXT_TOPBAR, new Listener0() { + @Override + public void onEvent() { + final boolean mustShow = !session.getCurrentUserInfo().getShowDeletedContent(); + session.getCurrentUserInfo().setShowDeletedContent(mustShow); + if (!mustShow && session.isCurrentStateAContent() + && session.getContentState().getStatus().equals(ContentStatus.inTheDustbin)) { + stateManager.gotoHistoryToken(session.getCurrentStateToken().getGroup()); + } + contextNavigator.clear(); + contextNavigator.refreshState(); + } + }, new ActionCheckedCondition() { + @Override + public boolean mustBeChecked() { + return session.getShowDeletedContent(); + } + }); + showDeletedItems.setParentMenuTitle(parentMenuTitle); + showDeletedItems.setTextDescription("Show deleted items"); + showDeletedItems.setMustBeAuthenticated(true); + contextActionRegistry.addAction(showDeletedItems, registerInTypes); + } - protected void createShowDeletedItems(final String parentMenuTitle, final String... registerInTypes) { - final ActionToolbarMenuCheckItemDescriptor<StateToken> showDeletedItems = new ActionToolbarMenuCheckItemDescriptor<StateToken>( - AccessRolDTO.Editor, CONTEXT_TOPBAR, new Listener0() { - @Override - public void onEvent() { - final boolean mustShow = !session.getCurrentUserInfo().getShowDeletedContent(); - session.getCurrentUserInfo().setShowDeletedContent(mustShow); - if (!mustShow && session.isCurrentStateAContent() - && session.getContentState().getStatus().equals(ContentStatus.inTheDustbin)) { - stateManager.gotoHistoryToken(session.getCurrentStateToken().getGroup()); - } - contextNavigator.clear(); - contextNavigator.refreshState(); - } - }, new ActionCheckedCondition() { - @Override - public boolean mustBeChecked() { - return session.getShowDeletedContent(); - } - }); - showDeletedItems.setParentMenuTitle(parentMenuTitle); - showDeletedItems.setTextDescription("Show deleted items"); - showDeletedItems.setMustBeAuthenticated(true); - contextActionRegistry.addAction(showDeletedItems, registerInTypes); - } + protected ActionToolbarMenuDescriptor<StateToken> createTranslateAction(final String fileMenuTitle, + final String... registerInTypes) { + final ActionToolbarMenuDescriptor<StateToken> translateContent = new ActionToolbarMenuDescriptor<StateToken>( + AccessRolDTO.Editor, CONTENT_TOPBAR, new Listener<StateToken>() { + @Override + public void onEvent(final StateToken stateToken) { + OldNotifyUser.important(i18n.t("Sorry, this functionality is currently in development")); + } + }); + translateContent.setParentMenuTitle(fileMenuTitle); + translateContent.setTextDescription(i18n.tWithNT("Translate", "used in button")); + translateContent.setToolTip(i18n.t("Translate this document to other languages")); + translateContent.setIconUrl("images/language.gif"); + translateContent.setEnableCondition(notDeleted()); + // contentActionRegistry.addAction(translateContent, registerInTypes); + return translateContent; + } - protected ActionToolbarMenuDescriptor<StateToken> createTranslateAction(final String fileMenuTitle, - final String... registerInTypes) { - final ActionToolbarMenuDescriptor<StateToken> translateContent = new ActionToolbarMenuDescriptor<StateToken>( - AccessRolDTO.Editor, CONTENT_TOPBAR, new Listener<StateToken>() { - @Override - public void onEvent(final StateToken stateToken) { - OldNotifyUser.important(i18n.t("Sorry, this functionality is currently in development")); - } - }); - translateContent.setParentMenuTitle(fileMenuTitle); - translateContent.setTextDescription(i18n.tWithNT("Translate", "used in button")); - translateContent.setToolTip(i18n.t("Translate this document to other languages")); - translateContent.setIconUrl("images/language.gif"); - translateContent.setEnableCondition(notDeleted()); - // contentActionRegistry.addAction(translateContent, registerInTypes); - return translateContent; - } + protected ActionToolbarButtonAndItemDescriptor<StateToken> createUploadAction( + final String textDescription, final String iconUrl, final String toolTip, + final String permitedExtensions, final String... registerInTypes) { + final ActionToolbarButtonAndItemDescriptor<StateToken> uploadFile; + uploadFile = new ActionToolbarButtonAndItemDescriptor<StateToken>(AccessRolDTO.Editor, + CONTEXT_BOTTOMBAR, new Listener0() { + @Override + public void onEvent() { + 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); + contextActionRegistry.addAction(uploadFile, registerInTypes); + return uploadFile; + } - protected ActionToolbarButtonAndItemDescriptor<StateToken> createUploadAction(final String textDescription, - final String iconUrl, final String toolTip, final String permitedExtensions, - final String... registerInTypes) { - final ActionToolbarButtonAndItemDescriptor<StateToken> uploadFile; - uploadFile = new ActionToolbarButtonAndItemDescriptor<StateToken>(AccessRolDTO.Editor, CONTEXT_BOTTOMBAR, - new Listener0() { - @Override - public void onEvent() { - 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); - contextActionRegistry.addAction(uploadFile, registerInTypes); - return uploadFile; - } + protected ActionToolbarButtonAndItemDescriptor<StateToken> createUploadMediaAction( + final String... registerInTypes) { + 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, registerInTypes); + return uploadMedia; + } - protected ActionToolbarButtonAndItemDescriptor<StateToken> createUploadMediaAction(final String... registerInTypes) { - 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, registerInTypes); - return uploadMedia; - } + protected void downloadContent(final StateToken token) { + fileDownloadProvider.get().downloadFile(token); + } - protected void downloadContent(final StateToken token) { - fileDownloadProvider.get().downloadFile(token); - } + private ActionEnableCondition<StateToken> notDefAndNotDeleted() { + return new ActionEnableCondition<StateToken>() { + @Override + public boolean mustBeEnabled(final StateToken token) { + final boolean isNotDefContentToken = !session.getCurrentState().getGroup().getDefaultContent().getStateToken().equals( + session.getCurrentStateToken()); + return isNotDefContentToken && notDeleted().mustBeEnabled(token); + } + }; + } - private ActionEnableCondition<StateToken> notDefAndNotDeleted() { - return new ActionEnableCondition<StateToken>() { - @Override - public boolean mustBeEnabled(final StateToken token) { - final boolean isNotDefContentToken = !session.getCurrentState().getGroup().getDefaultContent().getStateToken().equals( - session.getCurrentStateToken()); - return isNotDefContentToken && notDeleted().mustBeEnabled(token); - } - }; - } + private ActionEnableCondition<StateToken> notDeleted() { + return new ActionEnableCondition<StateToken>() { + @Override + public boolean mustBeEnabled(final StateToken token) { + final boolean isNotDeleted = !(session.isCurrentStateAContent() && session.getContentState().getStatus().equals( + ContentStatus.inTheDustbin)); + return isNotDeleted; + } + }; + } - private ActionEnableCondition<StateToken> notDeleted() { - return new ActionEnableCondition<StateToken>() { - @Override - public boolean mustBeEnabled(final StateToken token) { - final boolean isNotDeleted = !(session.isCurrentStateAContent() && session.getContentState().getStatus().equals( - ContentStatus.inTheDustbin)); - return isNotDeleted; - } - }; + private void register(final ActionToolbarMenuAndItemDescriptor<StateToken> action, + final Position position, final String... registerInTypes) { + if (position.equals(Position.ctx)) { + contextActionRegistry.addAction(action, registerInTypes); + } else if (position.equals(Position.cnt)) { + // contentActionRegistry.addAction(action, registerInTypes); } + } - private void register(final ActionToolbarMenuAndItemDescriptor<StateToken> action, final Position position, - final String... registerInTypes) { - if (position.equals(Position.ctx)) { - contextActionRegistry.addAction(action, registerInTypes); - } else if (position.equals(Position.cnt)) { - // contentActionRegistry.addAction(action, registerInTypes); + private void setContentStatus(final ContentStatus status, final StateToken stateToken) { + final AsyncCallbackSimple<StateAbstractDTO> callback = new AsyncCallbackSimple<StateAbstractDTO>() { + @Override + public void onSuccess(final StateAbstractDTO state) { + if (session.inSameToken(stateToken)) { + session.setCurrentState(state); + // publicLink.setState(state); + foldableContent.refreshState(); } + contextNavigator.setItemStatus(stateToken, status); + } + }; + if (status.equals(ContentStatus.publishedOnline) || status.equals(ContentStatus.rejected) + || status.equals(ContentStatus.inTheDustbin)) { + contentServiceProvider.get().setStatusAsAdmin(session.getUserHash(), stateToken, status, callback); + } else { + contentServiceProvider.get().setStatus(session.getUserHash(), stateToken, status, callback); } + } - private void setContentStatus(final ContentStatus status, final StateToken stateToken) { - final AsyncCallbackSimple<StateAbstractDTO> callback = new AsyncCallbackSimple<StateAbstractDTO>() { - @Override - public void onSuccess(final StateAbstractDTO state) { - if (session.inSameToken(stateToken)) { - session.setCurrentState(state); - // publicLink.setState(state); - foldableContent.refreshState(); - } - contextNavigator.setItemStatus(stateToken, status); - } - }; - if (status.equals(ContentStatus.publishedOnline) || status.equals(ContentStatus.rejected) - || status.equals(ContentStatus.inTheDustbin)) { - contentServiceProvider.get().setStatusAsAdmin(session.getUserHash(), stateToken, status, callback); - } else { - contentServiceProvider.get().setStatus(session.getUserHash(), stateToken, status, callback); - } - } - }