/* * DrakkarKeel - An Enterprise Collaborative Search Platform * * The contents of this file are subject under the terms described in the * DRAKKARKEEL_LICENSE file included in this distribution; you may not use this * file except in compliance with the License. * * 2013-2014 DrakkarKeel Platform. */ package drakkar.cover.swing; import drakkar.prow.facade.desktop.event.ProwAdapter; import drakkar.prow.facade.desktop.event.CollaborativeEnvironmentAdapter; import drakkar.prow.facade.desktop.event.CollaborativeEnvironmentEvent; import drakkar.prow.facade.desktop.event.SeekerEvent; import drakkar.prow.facade.desktop.event.SynchronousAwarenessAdapter; import drakkar.prow.facade.desktop.event.SynchronousAwarenessEvent; import drakkar.oar.Response; import drakkar.oar.ScorePQT; import drakkar.oar.Seeker; import drakkar.oar.facade.event.FacadeDesktopListener; import drakkar.oar.util.ImageUtil; import drakkar.oar.util.KeyAwareness; import static drakkar.oar.util.KeyAwareness.*; import drakkar.oar.util.KeySession; import static drakkar.oar.util.KeySession.*; import static drakkar.oar.util.KeyTransaction.*; import drakkar.oar.util.NotifyAction; import static drakkar.oar.util.SeekerAction.*; import drakkar.cover.swing.facade.PQTFacade; import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.plaf.basic.BasicBorders; public class JCollabQueryPanel extends JPanel { private Map<String, Integer> users; private DefaultPQTModel model; private JButton btnSearch; private String alternativeText; private List<FacadeDesktopListener> listener; /** Creates new form JCollabQuery */ public JCollabQueryPanel() { initComponents(); this.users = new HashMap<>(); this.model = new DefaultPQTModel(); this.btnSearch = null; this.listener = new ArrayList<>(); listener.add(syncAwaraness); listener.add(clientAdapter); listener.add(collabAdapter); } /** Creates new form JCollabQuery * @param model */ public JCollabQueryPanel(DefaultPQTModel model) { initComponents(); qFieldSingleQuery.setVisible(true); panelCollabQuery.setBorder(BasicBorders.getTextFieldBorder()); this.model = model; this.btnSearch = null; this.listener = new ArrayList<>(); listener.add(syncAwaraness); listener.add(clientAdapter); listener.add(collabAdapter); } /** Creates new form JCollabQuery * @param model * @param btnSearch */ public JCollabQueryPanel(DefaultPQTModel model, JButton btnSearch) { initComponents(); panelCollabQuery.setBorder(BasicBorders.getTextFieldBorder()); this.model = model; this.btnSearch = btnSearch; this.listener = new ArrayList<>(); listener.add(syncAwaraness); listener.add(clientAdapter); listener.add(collabAdapter); } /** * * @param model */ public void setModel(DefaultPQTModel model) { this.model = model; this.users = new HashMap<>(); this.panelCollabQuery.removeAll(); ImageIcon icon = new ImageIcon(ImageUtil.toBufferedImage(model.getSeeker().getAvatar())); BufferedImage resized = ImageUtil.getFasterScaledInstance(ImageUtil.makeBufferedImage(icon.getImage()), 16, 16, java.awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR, false); icon = new ImageIcon(resized); this.panelCollabQuery.add(new JCollabQueryField(model.getSeeker().getUser(), icon, true, model.getMenuPQTFacade())); int count = 0; this.users.put(model.getSeeker().getUser(), count); for (Seeker item : model.getSeekerList()) { BufferedImage resized1 = ImageUtil.getFasterScaledInstance(ImageUtil.makeBufferedImage(new ImageIcon(ImageUtil.toBufferedImage(item.getAvatar())).getImage()), 16, 16, java.awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR, false); this.panelCollabQuery.add(new JCollabQueryField(item.getUser(), new ImageIcon(resized1), getColor(), false, model.getMenuPQTFacade())); count++; this.users.put(item.getUser(), count); } } private SynchronousAwarenessAdapter syncAwaraness = new SynchronousAwarenessAdapter() { @Override public void notifyPuttingQueryTermsTogether(SynchronousAwarenessEvent evt) { Response response = evt.getResponse(); String sessionName = response.get(SESSION_NAME).toString(); int event = (Integer) response.get(DISTRIBUTED_EVENT); switch (event) { case KeyAwareness.ENABLE_PQT: boolean flag = (Boolean) response.get(IS_CHAIRMAN); ArrayList<Seeker> seekersList = (ArrayList<Seeker>) response.get(SEEKERS_SESSION); setModel(new DefaultPQTModel(sessionName, model.getSeeker(), seekersList, model.getMenuPQTFacade())); panelCollabQuery.setVisible(true); qFieldSingleQuery.setVisible(false); btnSearch.setEnabled(flag); revalidate(); break; case KeyAwareness.DISABLE_PQT: panelCollabQuery.setVisible(false); qFieldSingleQuery.setVisible(true); model.setSeekerList(null); model.setSessionName(""); btnSearch.setEnabled(true); qFieldSingleQuery.setText(""); revalidate(); break; } } @Override public void notifyQueryChange(SynchronousAwarenessEvent evt) { Response response = evt.getResponse(); String session = response.get(SESSION_NAME).toString(); String query = response.get(QUERY).toString(); String user = response.get(SEEKER_NICKNAME).toString(); Map<String, ScorePQT> statistics = (Map<String, ScorePQT>) response.get(SCORE_PQT); if (model.getSessionName().equals(session)) { JCollabQueryField item = getJCollabQueryField(user); if (item != null) { item.setQuery(query); item.setStatistics(statistics); } } } @Override public void notifyQueryTyped(SynchronousAwarenessEvent evt) { Response response = evt.getResponse(); String session = response.get(SESSION_NAME).toString(); String user = response.get(SEEKER_NICKNAME).toString(); boolean typed = (Boolean) response.get(QUERY_TYPED); if (model.getSessionName().equals(session)) { JCollabQueryField item = getJCollabQueryField(user); if (item != null) { item.showKeyBoard(typed); } } } @Override public void notifyQueryTermAcceptance(SynchronousAwarenessEvent evt) { Response response = evt.getResponse(); String session = response.get(SESSION_NAME).toString(); String user = response.get(SEEKER_NICKNAME).toString(); String term = response.get(QUERY_TERM).toString(); int event = (Integer) response.get(DISTRIBUTED_EVENT); if (model.getSessionName().equals(session)) { JCollabQueryField item = getJCollabQueryField(user); if (item != null) { switch (event) { case TERM_AGREE: item.updateAgreeCounter(term); break; case TERM_DISAGREE: item.updateDisagreeCounter(term); break; } } } } }; private ProwAdapter clientAdapter = new ProwAdapter() { @Override public void notifyCloseConnection(SeekerEvent evt) { if (panelCollabQuery.isVisible()) { users.clear(); panelCollabQuery.setVisible(false); qFieldSingleQuery.setVisible(true); panelCollabQuery.removeAll(); } } @Override public void notifySeekerEvent(SeekerEvent evt) { if (panelCollabQuery.isVisible()) { Response rsp = evt.getResponse(); int event = (Integer) rsp.get(DISTRIBUTED_EVENT); Seeker seeker = (Seeker) rsp.get(SEEKER); Integer index = users.get(seeker.getUser()); if (index != null) { switch (event) { case KeySession.SEEKER_LOGOUT: panelCollabQuery.remove(index); users.remove(seeker.getUser()); break; case NotifyAction.UPDATE_SEEKER_PROFILE: JCollabQueryField item = getJCollabQueryField(seeker.getUser()); item.setIcon(new ImageIcon(seeker.getAvatar())); break; } } } } }; private CollaborativeEnvironmentAdapter collabAdapter = new CollaborativeEnvironmentAdapter() { @Override public void notifyCollabSessionAuthentication(CollaborativeEnvironmentEvent evt) { if (panelCollabQuery.isVisible()) { Response rsp = evt.getResponse(); int event = (Integer) rsp.get(DISTRIBUTED_EVENT); switch (event) { case SEEKER_LOGIN_COLLAB_SESSION: Seeker seeker = (Seeker) rsp.get(SEEKER); String user = seeker.getUser(); int index = panelCollabQuery.getComponents().length; users.put(user, index); panelCollabQuery.add(new JCollabQueryField(seeker.getUser(), new ImageIcon(seeker.getAvatar()), getColor(), false, model.getMenuPQTFacade())); break; case SEEKER_LOGOUT_COLLAB_SESSION: Seeker seeker1 = (Seeker) rsp.get(SEEKER); String user1 = seeker1.getUser(); Integer index1 = users.get(user1); if (index1 != null) { users.remove(user1); panelCollabQuery.remove(index1); } break; case SELF_LOGOUT_COLLAB_SESSION: if (panelCollabQuery.isVisible()) { users.clear(); panelCollabQuery.setVisible(false); qFieldSingleQuery.setVisible(true); panelCollabQuery.removeAll(); } break; } } } @Override public void notifyCollabSessionEnding(CollaborativeEnvironmentEvent evt) { if (panelCollabQuery.isVisible()) { users.clear(); panelCollabQuery.setVisible(false); qFieldSingleQuery.setVisible(true); panelCollabQuery.removeAll(); } } }; private Color getColor() { int r = (int) (Math.random() * 256); int g = (int) (Math.random() * 256); int b = (int) (Math.random() * 256); return new Color(r, g, b); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { qFieldSingleQuery = new drakkar.cover.swing.JQueryField(); panelCollabQuery = new javax.swing.JPanel(); jQueryField1 = new drakkar.cover.swing.JCollabQueryField(); jQueryField2 = new drakkar.cover.swing.JCollabQueryField(); jQueryField3 = new drakkar.cover.swing.JCollabQueryField(); jQueryField4 = new drakkar.cover.swing.JCollabQueryField(); setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.LINE_AXIS)); qFieldSingleQuery.setMinimumSize(new java.awt.Dimension(120, 20)); qFieldSingleQuery.setName("qFieldSingleQuery"); // NOI18N qFieldSingleQuery.setPreferredSize(new java.awt.Dimension(120, 20)); add(qFieldSingleQuery); panelCollabQuery.setBackground(new java.awt.Color(255, 255, 255)); panelCollabQuery.setBorder(BasicBorders.getTextFieldBorder()); panelCollabQuery.setName("panelCollabQuery"); // NOI18N panelCollabQuery.setLayout(new javax.swing.BoxLayout(panelCollabQuery, javax.swing.BoxLayout.LINE_AXIS)); jQueryField1.setName("jQueryField1"); // NOI18N panelCollabQuery.add(jQueryField1); jQueryField2.setName("jQueryField2"); // NOI18N panelCollabQuery.add(jQueryField2); jQueryField3.setName("jQueryField3"); // NOI18N panelCollabQuery.add(jQueryField3); jQueryField4.setName("jQueryField4"); // NOI18N panelCollabQuery.add(jQueryField4); panelCollabQuery.setVisible(false); add(panelCollabQuery); }// </editor-fold>//GEN-END:initComponents /** * * @return */ public PQTFacade getComponentFacade() { return this.model.getMenuPQTFacade(); } /** * * @param facade */ public void setComponentFacade(PQTFacade facade) { this.model.setMenuPQTFacade(facade); this.qFieldSingleQuery.setComponentFacade(facade); } private JCollabQueryField getJCollabQueryField(String user) { int index = this.users.get(user); if (index >= 0) { return (JCollabQueryField) this.panelCollabQuery.getComponent(index); } return null; } /** * * @return */ public String getQuery() { if (this.qFieldSingleQuery.isVisible()) { return this.qFieldSingleQuery.getText(); } else { Component[] componentes = this.panelCollabQuery.getComponents(); StringBuilder query = new StringBuilder(); JCollabQueryField item; for (Component component : componentes) { item = (JCollabQueryField) component; query.append(item.getQuery()); query.append(" "); } return query.toString(); } } /** * * @param query */ public void setQuery(String query) { if (this.qFieldSingleQuery.isVisible()) { this.qFieldSingleQuery.setText(query); } else { JCollabQueryField field = (JCollabQueryField) this.panelCollabQuery.getComponent(0); field.setQuery(query); } } /** * * @param font */ public void setFontQueryField(Font font) { if (this.qFieldSingleQuery.isVisible()) { this.qFieldSingleQuery.setFont(font); } else { Component[] componentes = this.panelCollabQuery.getComponents(); JCollabQueryField item; for (Component component : componentes) { item = (JCollabQueryField) component; item.setFontQueryField(font); } } } /** * * @param c */ public void setForegroundQueryField(Color c) { if (this.qFieldSingleQuery.isVisible()) { this.qFieldSingleQuery.setForeground(c); } else { Component[] componentes = this.panelCollabQuery.getComponents(); JCollabQueryField item; for (Component component : componentes) { item = (JCollabQueryField) component; item.setForegroundQueryField(c); } } } /** * * @return */ public FacadeDesktopListener[] getFacadeListeners() { return listener.toArray(new FacadeDesktopListener[0]); } /** * * @return */ public JButton getButtonSearch() { return btnSearch; } /** * * @param btnSearch */ public void addButtonSearch(JButton btnSearch) { this.btnSearch = btnSearch; } /** * * @return */ public String getAlternativeText() { return alternativeText; } /** * * @param text */ public void setAlternativeText(String text) { this.alternativeText = text; } /** * * @return */ public JQueryField getFieldQuery() { return qFieldSingleQuery; } // Variables declaration - do not modify//GEN-BEGIN:variables private drakkar.cover.swing.JCollabQueryField jQueryField1; private drakkar.cover.swing.JCollabQueryField jQueryField2; private drakkar.cover.swing.JCollabQueryField jQueryField3; private drakkar.cover.swing.JCollabQueryField jQueryField4; private javax.swing.JPanel panelCollabQuery; private drakkar.cover.swing.JQueryField qFieldSingleQuery; // End of variables declaration//GEN-END:variables }