You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2014/10/04 11:43:13 UTC

svn commit: r1629368 - in /openmeetings/trunk/singlewebapp: openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ openmeetings-db/src/main/java/org/apache/openmeetings...

Author: solomax
Date: Sat Oct  4 09:43:12 2014
New Revision: 1629368

URL: http://svn.apache.org/r1629368
Log:
[OPENMEETINGS-1097] room chat is added

Added:
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/chat.css
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/images/page_edit.png   (with props)
Modified:
    openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
    openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
    openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/room.css
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css

Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java Sat Oct  4 09:43:12 2014
@@ -38,8 +38,30 @@ public class ChatDao {
 				.getSingleResult();
 	}
 
-	//TODO additional methods should be added to get messages by external email
-	public List<ChatMessage> get(long userId, int start, int count) {
+	//for export
+	public List<ChatMessage> get(int start, int count) {
+		return em.createNamedQuery("getGlobalChatMessages", ChatMessage.class)
+				.setFirstResult(start)
+				.setMaxResults(count)
+				.getResultList();
+	}
+
+	public List<ChatMessage> getGlobal(int start, int count) {
+		return em.createNamedQuery("getGlobalChatMessages", ChatMessage.class)
+				.setFirstResult(start)
+				.setMaxResults(count)
+				.getResultList();
+	}
+	
+	public List<ChatMessage> getRoom(long roomId, int start, int count) {
+		return em.createNamedQuery("getChatMessagesByRoom", ChatMessage.class)
+				.setParameter("roomId", roomId)
+				.setFirstResult(start)
+				.setMaxResults(count)
+				.getResultList();
+	}
+	
+	public List<ChatMessage> getUser(long userId, int start, int count) {
 		return em.createNamedQuery("getChatMessagesByUser", ChatMessage.class)
 				.setParameter("userId", userId)
 				.setFirstResult(start)
@@ -47,8 +69,10 @@ public class ChatDao {
 				.getResultList();
 	}
 
-	public List<ChatMessage> get(int start, int count) {
-		return em.createNamedQuery("getGlobalChatMessages", ChatMessage.class)
+	public List<ChatMessage> getUserRecent(long userId, Date date, int start, int count) {
+		return em.createNamedQuery("getChatMessagesByUserTime", ChatMessage.class)
+				.setParameter("userId", userId)
+				.setParameter("date", date)
 				.setFirstResult(start)
 				.setMaxResults(count)
 				.getResultList();

Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java Sat Oct  4 09:43:12 2014
@@ -42,8 +42,13 @@ import org.simpleframework.xml.Root;
 @Entity
 @NamedQueries({
 	@NamedQuery(name = "getChatMessageById", query = "SELECT c FROM ChatMessage c WHERE c.id = :id")
-	, @NamedQuery(name = "getChatMessagesByUser", query = "SELECT DISTINCT c FROM ChatMessage c WHERE c.fromUser.id = :userId OR c.toUser.id = :userId ORDER BY c.sent ASC")
-	, @NamedQuery(name = "getGlobalChatMessages", query = "SELECT DISTINCT c FROM ChatMessage c WHERE c.toUser IS NULL ORDER BY c.sent ASC")
+	, @NamedQuery(name = "getChatMessages", query = "SELECT c FROM ChatMessage c ORDER BY c.id")
+	, @NamedQuery(name = "getGlobalChatMessages", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom IS NULL ORDER BY c.sent ASC")
+	, @NamedQuery(name = "getChatMessagesByRoom", query = "SELECT c FROM ChatMessage c WHERE c.toUser.id IS NULL AND c.toRoom.id = :roomId ORDER BY c.sent ASC")
+	, @NamedQuery(name = "getChatMessagesByUser", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NOT NULL AND c.toRoom IS NULL AND "
+			+ "(c.fromUser.id = :userId OR c.toUser.id = :userId) ORDER BY c.sent ASC")
+	, @NamedQuery(name = "getChatMessagesByUserTime", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NOT NULL AND c.toRoom IS NULL AND "
+			+ "(c.fromUser.id = :userId OR c.toUser.id = :userId) AND c.sent > :date ORDER BY c.sent ASC")
 })
 @Table(name = "chat")
 @Root(name = "ChatMessage")

Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/room/Room.java Sat Oct  4 09:43:12 2014
@@ -191,8 +191,8 @@ public class Room implements IDataProvid
 	private Boolean hideTopBar = false;
 
 	@Column(name = "hide_chat")
-	@Element(data = true, required = false)
-	private Boolean hideChat = false;
+	@Element(name = "hideChat", data = true, required = false)
+	private boolean hideChat = false;
 
 	@Column(name = "hide_activities_and_actions")
 	@Element(data = true, required = false)
@@ -461,11 +461,11 @@ public class Room implements IDataProvid
 		this.hideTopBar = hideTopBar;
 	}
 
-	public Boolean getHideChat() {
+	public boolean isHideChat() {
 		return hideChat;
 	}
 
-	public void setHideChat(Boolean hideChat) {
+	public void setHideChat(boolean hideChat) {
 		this.hideChat = hideChat;
 	}
 

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java Sat Oct  4 09:43:12 2014
@@ -82,9 +82,9 @@ import org.apache.wicket.request.mapper.
 import org.apache.wicket.settings.PageSettings;
 import org.apache.wicket.util.collections.ConcurrentHashSet;
 import org.apache.wicket.util.tester.WicketTester;
-import org.wicketstuff.select2.ApplicationSettings;
 import org.slf4j.Logger;
 import org.springframework.web.context.support.XmlWebApplicationContext;
+import org.wicketstuff.select2.ApplicationSettings;
 
 import ro.fortsoft.wicket.dashboard.WidgetRegistry;
 import ro.fortsoft.wicket.dashboard.web.DashboardContext;
@@ -268,10 +268,38 @@ public class Application extends Authent
 		return ROOMS.containsKey(roomId) ? ROOMS.get(roomId) : new HashSet<Client>();
 	}
 	
+	public static Set<Long> getUserRooms(long userId) {
+		Set<Long> result = new HashSet<Long>();
+		for (Entry<Long, Set<Client>> me : ROOMS.entrySet()) {
+			for (Client c : me.getValue()) {
+				if (c.getUserId() == userId) {
+					result.add(me.getKey());
+				}
+			}
+		}
+		return result;
+	}
+	
+	public static boolean isUserInRoom(long roomId, long userId) {
+		if (ROOMS.containsKey(roomId)) {
+			Set<Client> clients = ROOMS.get(roomId);
+			for (Client c : clients) {
+				if (c.getUserId() == userId) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+	
 	public static boolean isUserOnline(long userId) {
 		return ONLINE_USERS.containsKey(userId);
 	}
 	
+	public static Set<Client> getClients(long userId) {
+		return ONLINE_USERS.containsKey(userId) ? ONLINE_USERS.get(userId) : new HashSet<Client>();
+	}
+	
 	//TODO need more safe way FIXME
 	public <T> T _getBean(Class<T> clazz) {
 		return getWebApplicationContext(getServletContext()).getBean(clazz);

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/BasePage.html Sat Oct  4 09:43:12 2014
@@ -26,6 +26,7 @@
 		<title wicket:id="pageTitle">[title]</title>
 		<link media="screen" type="text/css" rel="stylesheet" href="css/theme_om/jquery-ui-1.10.4.custom.css"/>
 		<link media="screen" type="text/css" rel="stylesheet" href="css/theme.css"/>
+		<link media="screen" type="text/css" rel="stylesheet" href="css/chat.css"/>
 		<link media="screen" type="text/css" rel="stylesheet" href="css/forms.css"/>
 		<link media="screen" type="text/css" rel="stylesheet" href="css/calendar.css"/>
 		<link media="screen" type="text/css" rel="stylesheet" href="css/admin.css"/>

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/MainPage.java Sat Oct  4 09:43:12 2014
@@ -78,6 +78,7 @@ public class MainPage extends BaseInited
 	private final MarkupContainer contents;
 	private final AbstractAjaxTimerBehavior areaBehavior;
 	private final Component dev;
+	private final ChatPanel chat;
 	
 	public MainPage(PageParameters pp) {
 		super();
@@ -128,7 +129,7 @@ public class MainPage extends BaseInited
 		}		
 		topLinks.add(new ExternalLink("bug", "https://issues.apache.org/jira/browse/OPENMEETINGS"));//FIXME hardcoded
 		
-		add(new ChatPanel("chatPanel"));
+		add(chat = new ChatPanel("chatPanel"));
 		add(new WebSocketBehavior() {
 			private static final long serialVersionUID = 1L;
 
@@ -226,4 +227,8 @@ public class MainPage extends BaseInited
 	public WebMarkupContainer getTopLinks() {
 		return topLinks;
 	}
+
+	public ChatPanel getChat() {
+		return chat;
+	}
 }

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.html Sat Oct  4 09:43:12 2014
@@ -42,7 +42,13 @@
 			</ul>
 			<div id="utab">
 				<div wicket:id="userList" class="user list">
-					<div wicket:id="user" class="user ui-corner-all ui-widget-content"><span wicket:id="name"></span></div>
+					<div wicket:id="user" class="user ui-corner-all ui-widget-content">
+						<div wicket:id="name" class="user name"></div>
+						<div class="user actions">
+							<span wicket:id="privateChat" class="private-chat om-icon align-right clickable" wicket:ommessage="title:1493" onclick="startPrivateChat($(this));"></span>
+							<div class="clear"></div>
+						</div>
+					</div>
 				</div>
 			</div>
 			<div wicket:id="ftab" id="ftab"><div class="file list" wicket:id="tree"></div></div>

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java Sat Oct  4 09:43:12 2014
@@ -71,7 +71,6 @@ import org.apache.openmeetings.web.room.
 import org.apache.openmeetings.web.room.poll.CreatePollDialog;
 import org.apache.openmeetings.web.room.poll.PollResultsDialog;
 import org.apache.openmeetings.web.room.poll.VoteDialog;
-import org.apache.openmeetings.web.user.ChatPanel;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -142,6 +141,7 @@ public class RoomPanel extends BasePanel
 						.toString()
 						));
 				broadcast(new RoomMessage(roomId, c.getUserId(), RoomMessage.Type.roomEnter));
+				getMainPage().getChat().roomEnter(roomId, target);
 			} catch (MalformedURLException e) {
 				log.error("Error while constructing room parameters", e);
 			}
@@ -293,6 +293,8 @@ public class RoomPanel extends BasePanel
 				RoomClient rc = item.getModelObject();
 				item.setMarkupId(String.format("user%s", rc.c.getUid()));
 				item.add(new Label("name", rc.u.getFirstname() + " " + rc.u.getLastname()));
+				item.add(AttributeAppender.append("data-userid", rc.u.getId()));
+				item.add(new WebMarkupContainer("privateChat").setVisible(getUserId() != rc.u.getId()));
 				if (c != null && rc.c.getUid().equals(c.getUid())) {
 					item.add(AttributeAppender.append("class", "current"));
 				}
@@ -343,7 +345,6 @@ public class RoomPanel extends BasePanel
 						updateUserMenuIcons(wsEvent.getHandler());
 						break;
 					case roomEnter:
-						wsEvent.getHandler().appendJavaScript(String.format("addChatTab('%1$s%2$d', '%3$s %2$d');", ChatPanel.ID_ROOM_PREFIX, roomId, WebSession.getString(406)));
 						updateUserMenuIcons(wsEvent.getHandler());
 					case roomExit:
 						//TODO check user/remove tab
@@ -410,7 +411,7 @@ public class RoomPanel extends BasePanel
 					}
 				});
 			} catch (Exception e) {
-				log.error("Error while sending message", e);
+				log.error("Error while broadcasting message to room", e);
 			}
 		}
 	}
@@ -421,7 +422,7 @@ public class RoomPanel extends BasePanel
 			try {
 				reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId())).sendMessage(msg);
 			} catch (Exception e) {
-				log.error("Error while sending message", e);
+				log.error("Error while sending message to room", e);
 			}
 		}
 	}
@@ -486,7 +487,7 @@ public class RoomPanel extends BasePanel
 	@Override
 	public void cleanup(AjaxRequestTarget target) {
 		target.add(getMainPage().getHeader().setVisible(true), getMainPage().getMenu().setVisible(true)
-				, getMainPage().getTopLinks().setVisible(true));
+				, getMainPage().getTopLinks().setVisible(true), getMainPage().getChat().setVisible(true));
 		target.appendJavaScript("$(window).off('resize.openmeetings'); $('.room.video').dialog('destroy');");
 	}
 

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/room.js Sat Oct  4 09:43:12 2014
@@ -16,64 +16,6 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-function getUserId(uid) { return 'user' + uid; }
-
-function addUser(u, uld) {
-	var s = u.firstname + ' ' + u.lastname;
-	var d = $('<div class="user ui-corner-all ui-widget-content"></div>').attr('id', getUserId(u.uid))
-		.attr('data-id', u.id).text(s);
-	if (u.current) {
-		d.addClass('current');
-	}
-	uld.append(d);
-	//TODO add activity
-}
-
-function removeUser(id) {
-	$('#' + id).remove();//TODO replace with 'ends-with-id'
-	//TODO add activity
-}
-
-function roomMessage(m) {
-	if (m && m.type == "room") {
-		//TODO add timestamp support
-		switch (m.msg) {
-			case "users":
-				var uld = $('.user.list');
-				var ulist = [];
-				uld.children('[id^="user"]').each(function() {
-					ulist.push(this.id); 
-				});
-				for (var i = 0; i < m.users.length; ++i) {
-					var u = m.users[i];
-					var id = getUserId(u.uid);
-					if ($('#' + id).length == 0) {
-						addUser(u, uld);
-					} else {
-						var idx = ulist.indexOf(id);
-						if (idx > -1) {
-							ulist.splice(idx, 1);
-						}
-					}
-				}
-				for (var i = 0; i < ulist.length; ++i) {
-					removeUser(ulist[i]);
-				}
-				break;
-			case "addUser":
-				var id = getUserId(m.user.uid);
-				if ($('#' + id).length == 0) {
-					addUser(m.user, $('.user.list'));
-				}
-				break;
-			case "removeUser":
-				removeUser(getUserId(m.uid));
-				break;
-		}
-	}
-}
-
 function initVideo(_options) {
 	var options = $.extend({bgcolor: "#ffffff", width: 570, height: 900
 		, resolutions: JSON.stringify([{label: "4:3 (~6 KByte/sec)", width: 40, height: 30}
@@ -142,4 +84,9 @@ function roomLoad() {
 			$(".room.wb.area .wb").width(w);
 		}
 	});
-}
\ No newline at end of file
+}
+function startPrivateChat(el) {
+	addChatTab('chatTab-u' + el.parent().parent().data("userid"), el.parent().parent().find('.user.name').text());
+	openChat();
+	$('#chatMessage .wysiwyg-editor').click();
+}

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.html Sat Oct  4 09:43:12 2014
@@ -33,7 +33,10 @@
 			<table style="width: 100%">
 				<tr>
 					<td><div id="chatMessage" wicket:id="chatMessage"></div></td>
-					<td style="width: 50px"><div wicket:id="send"><wicket:ommessage key="220"/></div></td>
+					<td style="width: 50px">
+						<div wicket:id="send"><wicket:ommessage key="220"/></div>
+						<input type="hidden" wicket:id="activeTab" id="activeChatTab"/>
+					</td>
 				</tr>
 			</table>
 		</form>

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java Sat Oct  4 09:43:12 2014
@@ -21,15 +21,25 @@ package org.apache.openmeetings.web.user
 import static org.apache.commons.lang3.StringEscapeUtils.unescapeXml;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.Application.getUserRooms;
+import static org.apache.openmeetings.web.app.Application.isUserInRoom;
 import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
+import java.util.Calendar;
 import java.util.Date;
 
 import org.apache.openmeetings.db.dao.basic.ChatDao;
+import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.basic.ChatMessage;
+import org.apache.openmeetings.db.entity.room.Room;
+import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.app.Client;
+import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.BasePanel;
+import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.json.JSONException;
@@ -41,10 +51,12 @@ import org.apache.wicket.markup.head.Jav
 import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
 import org.apache.wicket.markup.head.PriorityHeaderItem;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.HiddenField;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.protocol.ws.WebSocketSettings;
 import org.apache.wicket.protocol.ws.api.IWebSocketConnection;
 import org.apache.wicket.protocol.ws.api.registry.IWebSocketConnectionRegistry;
+import org.apache.wicket.protocol.ws.api.registry.PageIdKey;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.red5.logging.Red5LoggerFactory;
@@ -63,33 +75,42 @@ public class ChatPanel extends BasePanel
 	public static final String ID_ROOM_PREFIX = ID_TAB_PREFIX + "r";
 	private static final String ID_ALL = ID_TAB_PREFIX + "all";
 	
-	private String getScope(ChatMessage m) {
+	private JSONObject setScope(JSONObject o, ChatMessage m, long curUserId) {
+		String scope, scopeName;
 		if (m.getToUser() != null) {
-			return ID_USER_PREFIX + m.getToUser().getId();
+			User u = curUserId == m.getToUser().getId() ? m.getFromUser() : m.getToUser();
+			scope = ID_USER_PREFIX + u.getId();
+			scopeName = String.format("%s %s", u.getFirstname(), u.getLastname());
 		} else if (m.getToRoom() != null) {
-			return ID_ROOM_PREFIX + m.getToRoom().getId();
+			scope = ID_ROOM_PREFIX + m.getToRoom().getId();
+			scopeName = String.format("%s %s", WebSession.getString(406), m.getToRoom().getId());
 		} else {
-			return ID_ALL;
+			scope = ID_ALL;
+			scopeName = WebSession.getString(1494);
 		}
+		return o.put("scope", scope).put("scopeName", scopeName);
 	}
 	
 	private JSONObject getMessage(ChatMessage m) throws JSONException {
-		String msg = m.getMessage();
-		msg = msg == null ? msg : " " + msg.replaceAll("&nbsp;", " ") + " ";
+		return getMessage(m, getUserId());
+	}
+	
+	private JSONObject getMessage(ChatMessage m, long curUserId) throws JSONException {
+		String smsg = m.getMessage();
+		smsg = smsg == null ? smsg : " " + smsg.replaceAll("&nbsp;", " ") + " ";
 		return new JSONObject()
 			.put("type", "chat")
-			.put("msg", new JSONObject()
-				.put("id", m.getId())
-				.put("scope", getScope(m))
-				.put("message", msg)
-				.put("from", m.getFromUser().getFirstname() + " " + m.getFromUser().getLastname())
-				.put("sent", getDateFormat().format(m.getSent()))
-			);
+			.put("msg", setScope(new JSONObject(), m, curUserId)
+					.put("id", m.getId())
+					.put("message", smsg)
+					.put("from", m.getFromUser().getFirstname() + " " + m.getFromUser().getLastname())
+					.put("sent", getDateFormat().format(m.getSent())));
 	}
 
 	public ChatPanel(String id) {
 		super(id);
 		setOutputMarkupId(true);
+		setOutputMarkupPlaceholderTag(true);
 		setMarkupId(id);
 
 		add(new Behavior() {
@@ -101,7 +122,17 @@ public class ChatPanel extends BasePanel
 				try {				
 					StringBuilder sb = new StringBuilder();
 					//FIXME limited count should be loaded with "earlier" link
-					for (ChatMessage m : dao.get(0, 30)) {
+					for (ChatMessage m : dao.getGlobal(0, 30)) {
+						sb.append("addChatMessageInternal(").append(getMessage(m).toString()).append(");");
+					}
+					for(Long roomId : getUserRooms(getUserId())) {
+						for (ChatMessage m : dao.getRoom(roomId, 0, 30)) {
+							sb.append("addChatMessageInternal(").append(getMessage(m).toString()).append(");");
+						}
+					}
+					Calendar c = WebSession.getCalendar();
+					c.add(Calendar.HOUR_OF_DAY, -1);
+					for (ChatMessage m : dao.getUserRecent(getUserId(), c.getTime(), 0, 30)) {
 						sb.append("addChatMessageInternal(").append(getMessage(m).toString()).append(");");
 					}
 					if (sb.length() > 0) {
@@ -115,10 +146,48 @@ public class ChatPanel extends BasePanel
 			}
 		});
 		add(new EmoticonsBehavior(".messageArea"));
-		ChatToolbar toolbar = new ChatToolbar("toolbarContainer");
-		final WysiwygEditor chatMessage = new WysiwygEditor("chatMessage", Model.of(""), toolbar);
-		add(new Form<Void>("sendForm").add(
-				toolbar
+		add(new ChatForm("sendForm"));
+	}
+
+	public void roomEnter(long roomId, AjaxRequestTarget target) {
+		Room r = getBean(RoomDao.class).get(roomId);
+		if (r.isHideChat()) {
+			target.add(setVisible(false));
+			return;
+		}
+		StringBuilder sb = new StringBuilder(String.format("addChatTab('%1$s%2$d', '%3$s %2$d');", ID_ROOM_PREFIX, roomId, WebSession.getString(406)));
+		boolean added = false;
+		sb.append(r.isChatOpened() ? "openChat();" : "closeChat();");
+		for (ChatMessage m : getBean(ChatDao.class).getRoom(roomId, 0, 30)) {
+			added = true;
+			sb.append("addChatMessageInternal(").append(getMessage(m).toString()).append(");");
+		}
+		if (added) {
+			sb.append("$('.messageArea').emoticonize();");
+		}
+		target.appendJavaScript(sb);
+	}
+	
+	private ResourceReference newResourceReference() {
+		return new JavaScriptResourceReference(ChatPanel.class, "chat.js");
+	}
+	
+	@Override
+	public void renderHead(IHeaderResponse response) {
+		super.renderHead(response);
+		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(newResourceReference())));
+	}
+	
+	private class ChatForm extends Form<Void> {
+		private static final long serialVersionUID = 1L;
+		private final ChatToolbar toolbar = new ChatToolbar("toolbarContainer");
+		private final WysiwygEditor chatMessage = new WysiwygEditor("chatMessage", Model.of(""), toolbar);
+		private final HiddenField<String> activeTab = new HiddenField<String>("activeTab", Model.of(""));
+		
+		ChatForm(String id) {
+			super(id);
+			add(toolbar
+				, activeTab
 				, chatMessage.setOutputMarkupId(true)
 				, new AjaxButton("send") {
 					private static final long serialVersionUID = 1L;
@@ -130,28 +199,62 @@ public class ChatPanel extends BasePanel
 						m.setMessage(unescapeXml(chatMessage.getDefaultModelObjectAsString()));
 						m.setSent(new Date());
 						m.setFromUser(getBean(UserDao.class).get(getUserId()));
+						try {
+							String scope = activeTab.getModelObject();
+							if (scope != null) {
+								if (ID_ALL.equals(scope)) {
+									//we done
+								} else if (scope.startsWith(ID_ROOM_PREFIX)) {
+									Room r = getBean(RoomDao.class).get(Long.parseLong(scope.substring(ID_ROOM_PREFIX.length())));
+									if (isUserInRoom(r.getId(), getUserId())) {
+										m.setToRoom(r);
+									} else {
+										log.error("It seems like we being hacked!!!!");
+										return;
+									}
+								} else if (scope.startsWith(ID_USER_PREFIX)) {
+									User u = getBean(UserDao.class).get(Long.parseLong(scope.substring(ID_USER_PREFIX.length())));
+									m.setToUser(u);
+								}
+							}
+						} catch (Exception e) {
+							//no-op
+						}
 						dao.update(m);
-						IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(getApplication()).getConnectionRegistry();
-						for (IWebSocketConnection c : reg.getConnections(getApplication())) {
-							try {
-								c.sendMessage(getMessage(m).toString());
-							} catch(Exception e) {
-								log.error("Error while sending message", e);
+						String msg = getMessage(m).toString();
+						if (m.getToRoom() != null) {
+							RoomPanel.sendRoom(m.getToRoom().getId(), msg);
+						} else if (m.getToUser() != null) {
+							IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(Application.get()).getConnectionRegistry();
+							for (Client c : Application.getClients(getUserId())) {
+								try {
+									reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId())).sendMessage(msg);
+								} catch (Exception e) {
+									log.error("Error while sending message to room", e);
+								}
+							}
+							msg = getMessage(m, m.getToUser().getId()).toString();
+							for (Client c : Application.getClients(m.getToUser().getId())) {
+								try {
+									reg.getConnection(Application.get(), c.getSessionId(), new PageIdKey(c.getPageId())).sendMessage(msg);
+								} catch (Exception e) {
+									log.error("Error while sending message to room", e);
+								}
+							}
+						} else {
+							IWebSocketConnectionRegistry reg = WebSocketSettings.Holder.get(getApplication()).getConnectionRegistry();
+							for (IWebSocketConnection c : reg.getConnections(getApplication())) {
+								try {
+									c.sendMessage(msg);
+								} catch(Exception e) {
+									log.error("Error while sending message", e);
+								}
 							}
 						}
 						chatMessage.setDefaultModelObject("");
 						target.add(chatMessage);
 					};
-				}));
-	}
-
-	private ResourceReference newResourceReference() {
-		return new JavaScriptResourceReference(ChatPanel.class, "chat.js");
-	}
-	
-	@Override
-	public void renderHead(IHeaderResponse response) {
-		super.renderHead(response);
-		response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(newResourceReference())));
+				});
+		}
 	}
 }

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js Sat Oct  4 09:43:12 2014
@@ -16,7 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var chatTabs, tabTemplate = "<li><a href='#{href}'>#{label}</a> <span class='ui-icon ui-icon-close' role='presentation'></span></li>";
+var chatTabs, tabTemplate = "<li><a href='#{href}'>#{label}</a></li>", closeBlock = "<span class='ui-icon ui-icon-close' role='presentation'></span>"
+	, closedHeight = "16px", openedHeight = "345px";
 $(function() {
 	Wicket.Event.subscribe("/websocket/message", function(jqEvent, msg) {
 		var m = jQuery.parseJSON(msg);
@@ -25,15 +26,14 @@ $(function() {
 				case "chat":
 					addChatMessage(m);
 					break;
-				case "room":
-					if (typeof(roomMessage) == "function") {
-						roomMessage(m);
-					}
-					break;
 			}
 		}
 	});
-	chatTabs = $("#chatTabs").tabs();
+	chatTabs = $("#chatTabs").tabs({
+		activate: function(event, ui) {
+			$('#activeChatTab').val(ui.newPanel[0].id);
+		}
+	});
 	// close icon: removing the tab on click
 	chatTabs.delegate("span.ui-icon-close", "click", function() {
 		var panelId = $(this).closest("li").remove().attr("aria-controls");
@@ -41,25 +41,49 @@ $(function() {
 		chatTabs.tabs("refresh");
 	});
 });
+function openChat() {
+	if ($('#chatPanel').height() < 20) {
+		$('#chat #controlBlock #control').removeClass('ui-icon-carat-1-n').addClass('ui-icon-carat-1-s');
+		$('#chatPanel, #chat').animate({height: openedHeight}, 1000);
+	}
+}
+function closeChat() {
+	var chat = $('#chatPanel');
+	if ($('#chatPanel').height() > 20) {
+		$('#chat #controlBlock #control').removeClass('ui-icon-carat-1-s').addClass('ui-icon-carat-1-n');
+		chat.animate({height: "16px"}, 1000);
+		$('#chatPanel, #chat').animate({height: closedHeight}, 1000);
+	}
+}
 function toggleChat() {
-	var chat = $('#chat');
-	$('#chat #controlBlock #control')
-		.removeClass('ui-icon-carat-1-' + (chat.height() < 20 ? 'n' : 's'))
-		.addClass('ui-icon-carat-1-' + (chat.height() < 20 ? 's' : 'n'));
-	chat.animate({ height: chat.height() < 20 ? "380px" : "16px" }, 1000);
+	if ($('#chatPanel').height() < 20) {
+		openChat();
+	} else {
+		closeChat();
+	}
+}
+function activateTab(id) {
+	chatTabs.tabs("option", "active", chatTabs.find('a[href="#' + id + '"]').parent().index());
 }
 function addChatTab(id, label) {
+	if ($('#' + id).length) {
+		return;
+	}
 	var li = $(tabTemplate.replace(/#\{href\}/g, "#" + id).replace(/#\{label\}/g, label));
+	if (id.indexOf("chatTab-r") != 0) {
+		li.append(closeBlock);
+	}
 	chatTabs.find(".ui-tabs-nav").append(li);
 	chatTabs.append("<div class='messageArea' id='" + id + "'></div>");
 	chatTabs.tabs("refresh");
+	activateTab(id);
 }
 function addChatMessageInternal(m) {
 	if (m && m.type == "chat") {
 		var msg = $('<div><span class="from">' + m.msg.from + '</span><span class="date">'
 				+ m.msg.sent + '</span>' + m.msg.message + '</div>');
 		if (!$('#' + m.msg.scope).length) {
-			addChatTab(m.scope, 'Test');
+			addChatTab(m.msg.scope, m.msg.scopeName);
 		}
 		$('#' + m.msg.scope).append(msg);
 		msg[0].scrollIntoView();

Added: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/chat.css
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/chat.css?rev=1629368&view=auto
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/chat.css (added)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/chat.css Sat Oct  4 09:43:12 2014
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+#chatPanel {
+	position: fixed;
+	z-index: 2000;
+	bottom: 0px;
+	right: 10px;
+	width: 600px;
+	height: 16px;
+}
+#chatPanel #chat {
+	height: 16px;
+	background-color: #F2FAFF; /*FIXME should be replaced with "ui" classes*/
+}
+#chatPanel #chat .btn-toolbar {
+	margin-top: 2px;
+	margin-bottom: 0;
+	margin-left: 5px;
+}
+#chatPanel #chat #chatTabs.ui-tabs {
+	padding: 0;
+}
+#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav {
+	padding: 0;
+}
+#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav li {
+	margin: 0;
+}
+#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav li .ui-icon.ui-icon-close {
+	float: left;
+}
+#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
+	padding: 2px .5em;
+	float: left;
+}
+#chatPanel #chat #controlBlock {
+	background-color: #5294BB; /*FIXME should be replaced with "ui" classes*/
+}
+#chatPanel #chat #controlBlock:hover {
+	background-color: #2779aa; /*FIXME should be replaced with "ui" classes*/
+}
+#chatPanel #chat #controlBlock #control {
+	text-align: center;
+	margin-left: 50%;
+	margin-right: 50%;
+}
+#chatPanel #chat .messageArea .date {
+    margin-right: 5px;
+    font-style: italic;
+    font-size: smaller;
+}
+#chatPanel #chat .messageArea .from {
+	margin-left: 5px;
+    margin-right: 5px;
+	font-weight: bold;
+}
+.ui-tabs .ui-tabs-panel.messageArea {
+	height: 165px;
+	overflow-y: auto;
+	padding: 5px;
+}
+#chatMessage .wysiwyg-editor {
+	height: 70px;
+	max-height: 70px;
+}

Added: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/images/page_edit.png
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/images/page_edit.png?rev=1629368&view=auto
==============================================================================
Binary file - no diff available.

Propchange: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/images/page_edit.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/room.css
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/room.css?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/room.css (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/room.css Sat Oct  4 09:43:12 2014
@@ -75,6 +75,19 @@
 	padding-left: 5px;
     padding-top: 5px;
 }
+.room.sidebar.left .user.list .user .user.name {
+	line-height: 18px;
+	height: 18px;
+	padding: 0;
+}
+.room.sidebar.left .user.list .user .user.actions {
+	position: relative;
+	height: 18px;
+	padding: 0;
+}
+.private-chat.om-icon {
+	background-image: url(images/page_edit.png);
+}
 .room.sidebar.left .tabs, .room.sidebar.left .tabs #utab, .room.sidebar.left .tabs #ftab {
 	padding: 0;
 }

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css?rev=1629368&r1=1629367&r2=1629368&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/webapp/css/theme.css Sat Oct  4 09:43:12 2014
@@ -75,59 +75,6 @@ html, body {
 	font-size: 1em;
 	color: #FF0000;
 }
-
-#chatPanel {
-	position: fixed;
-	z-index: 2000;
-	bottom: 0px;
-	right: 10px;
-	width: 600px;
-}
-#chatPanel #chat {
-	height: 10px;
-	background-color: #F2FAFF;
-}
-#chatPanel #chat #chatTabs.ui-tabs {
-	padding: 0;
-}
-#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav {
-	padding: 0;
-}
-#chatPanel #chat #chatTabs..ui-tabs .ui-tabs-nav li {
-	margin: 0;
-}
-#chatPanel #chat #chatTabs.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
-	padding: 2px .5em;
-}
-#chatPanel #chat #controlBlock {
-	background-color: #5294BB;
-}
-#chatPanel #chat #controlBlock:hover {
-	background-color: #2779aa;
-}
-#chatPanel #chat #controlBlock #control {
-	text-align: center;
-	margin-left: 50%;
-	margin-right: 50%;
-}
-#chatPanel #chat .messageArea .date {
-    margin-right: 5px;
-    font-style: italic;
-    font-size: smaller;
-}
-#chatPanel #chat .messageArea .from {
-	margin-left: 5px;
-    margin-right: 5px;
-	font-weight: bold;
-}
-.messageArea {
-	height: 165px;
-	overflow-y: auto;
-}
-#chatMessage .wysiwyg-editor {
-	height: 70px;
-	max-height: 70px;
-}
 .clickable {
 	cursor: pointer;
 }