Author: solomax
Date: Wed Jan 18 04:52:53 2017
New Revision: 1779288

URL: http://svn.apache.org/viewvc?rev=1779288&view=rev
Log:
[OPENMEETINGS-1527] key modifiers are passed to server

Removed:
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileFolder.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileFolder.java
Modified:
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
    
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java?rev=1779288&r1=1779287&r2=1779288&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
 Wed Jan 18 04:52:53 2017
@@ -19,14 +19,27 @@
 package org.apache.openmeetings.web.common.tree;
 
 import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.db.entity.file.FileItem.Type;
+import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.openmeetings.db.entity.record.Recording.Status;
 import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
+import org.apache.wicket.ajax.json.JSONObject;
 import 
org.apache.wicket.extensions.markup.html.repeater.tree.DefaultNestedTree;
 import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
+import org.apache.wicket.extensions.markup.html.repeater.tree.content.Folder;
 import org.apache.wicket.markup.repeater.ReuseIfModelsEqualStrategy;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.util.string.Strings;
+
+import com.googlecode.wicket.jquery.ui.markup.html.link.AjaxLink;
 
 public class FileItemTree extends DefaultNestedTree<FileItem> {
        private static final long serialVersionUID = 1L;
+       private final static String CSS_CLASS_FILE = "file ";
        final FileTreePanel treePanel;
 
        public FileItemTree(String id, FileTreePanel treePanel, 
ITreeProvider<FileItem> tp) {
@@ -35,8 +48,144 @@ public class FileItemTree extends Defaul
                setItemReuseStrategy(new ReuseIfModelsEqualStrategy());
        }
 
+       private void onClick(AjaxRequestTarget target, FileItem f) {
+               String mod = 
getRequest().getRequestParameters().getParameterValue("modifiers").toOptionalString();
+               boolean shift = false, ctrl = false;
+               if (!Strings.isEmpty(mod)) {
+                       JSONObject o = new JSONObject(mod);
+                       shift = o.optBoolean("shift");
+                       ctrl = o.optBoolean("ctrl");
+               }
+               treePanel.setSelected(f, target, shift, ctrl);
+               if (Type.Folder == f.getType() && getState(f) == 
State.COLLAPSED) {
+                       this.expand(f);
+               } else {
+                       treePanel.update(target, f);
+               }
+       }
+
+       private static boolean isClickable() {
+               return true;
+       }
+
        @Override
        protected Component newContentComponent(String id, IModel<FileItem> 
node) {
-               return new FileFolder(id, this, node, treePanel);
+               return new Folder<FileItem>(id, this, node) {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       protected Component newLabelComponent(String id, final 
IModel<FileItem> lm) {
+                               FileItem r = lm.getObject();
+                               return Type.Folder == r.getType() || r.getId() 
== null ? new FolderPanel(id, lm, treePanel) : new FileItemPanel(id, lm, 
treePanel);
+                       }
+
+                       @Override
+                       protected boolean isSelected() {
+                               FileItem f = getModelObject(), s = 
treePanel.getSelected();
+                               return s.getHash().equals(f.getHash());
+                       }
+
+                       @Override
+                       protected boolean isClickable() {
+                               return FileItemTree.isClickable();
+                       }
+
+                       @Override
+                       protected void onClick(AjaxRequestTarget target) {
+                               FileItemTree.this.onClick(target, 
getModelObject());
+                       }
+
+                       @Override
+                       protected MarkupContainer newLinkComponent(String id, 
IModel<FileItem> model) {
+                               final FileItem f = getModelObject();
+                               return new AjaxLink<Void>(id) {
+                                       private static final long 
serialVersionUID = 1L;
+
+                                       @Override
+                                       public boolean isEnabled() {
+                                               return 
FileItemTree.isClickable();
+                                       }
+
+                                       @Override
+                                       public void onClick(AjaxRequestTarget 
target) {
+                                               
FileItemTree.this.onClick(target, f);
+                                       }
+
+                                       @Override
+                                       protected void 
updateAjaxAttributes(AjaxRequestAttributes attributes) {
+                                               
super.updateAjaxAttributes(attributes);
+                                               
attributes.getDynamicExtraParameters().add("return {modifiers: 
JSON.stringify({shift: attrs.event.shiftKey, ctrl: attrs.event.ctrlKey})};");
+                                       }
+                               };
+                       }
+
+                       @Override
+                       protected String getOtherStyleClass(FileItem r) {
+                               return getItemStyle(r, false);
+                       }
+
+                       @Override
+                       protected String getOpenStyleClass() {
+                               return getItemStyle(getModelObject(), true);
+                       }
+
+                       @Override
+                       protected String getClosedStyleClass() {
+                               return getItemStyle(getModelObject(), false);
+                       }
+
+                       @Override
+                       protected String getSelectedStyleClass() {
+                               return "ui-state-active";
+                       }
+
+                       @Override
+                       protected IModel<String> newLabelModel(IModel<FileItem> 
model) {
+                               return Model.of(model.getObject().getName());
+                       }
+               };
+       }
+
+       private static String getItemStyle(FileItem f, boolean open) {
+               StringBuilder style = new StringBuilder("big om-icon ");
+               if (f.getId() == null) {
+                       
style.append(CSS_CLASS_FILE).append(f.getHash().indexOf("my") > -1 ? "my" : 
"public");
+               } else {
+                       if (!f.exists()) {
+                               style.append("broken ");
+                       }
+                       switch(f.getType()) {
+                               case Folder:
+                                       
style.append(CSS_CLASS_FILE).append(open ? "folder-open " : "folder ");
+                                       break;
+                               case Image:
+                                       
style.append(CSS_CLASS_FILE).append("image ");
+                                       break;
+                               case PollChart:
+                                       
style.append(CSS_CLASS_FILE).append("chart ");
+                                       break;
+                               case WmlFile:
+                                       
style.append(CSS_CLASS_FILE).append("wml ");
+                                       break;
+                               case Video:
+                               case Recording:
+                               {
+                                       style.append("recording ");
+                                       if (f instanceof Recording) {
+                                               Status st = 
((Recording)f).getStatus();
+                                               if (Status.RECORDING == st || 
Status.CONVERTING == st) {
+                                                       
style.append("processing");
+                                               }
+                                       }
+                               }
+                                       break;
+                               case Presentation:
+                                       
style.append(CSS_CLASS_FILE).append("doc ");
+                                       break;
+                               default:
+                                       break;
+                       }
+               }
+               return style.toString();
        }
 }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java?rev=1779288&r1=1779287&r2=1779288&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
 Wed Jan 18 04:52:53 2017
@@ -82,7 +82,7 @@ public abstract class FileTreePanel exte
                super(id);
                this.addFolder = addFolder;
                OmTreeProvider tp = new OmTreeProvider(roomId);
-               setSelected(tp.getRoot(), null);
+               setSelected(tp.getRoot(), null, false, false);
                form.add(tree = new FileItemTree("tree", this, tp));
                
form.add(download.setVisible(false).setOutputMarkupPlaceholderTag(true));
                add(form.add(downloader));
@@ -246,7 +246,7 @@ public abstract class FileTreePanel exte
                }
        }
 
-       public void setSelected(FileItem fi, AjaxRequestTarget target) {
+       public void setSelected(FileItem fi, AjaxRequestTarget target, boolean 
shift, boolean ctrl) {
                FileItem _prev = selected.getObject();
                updateNode(target, _prev);
                if (target != null) {

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java?rev=1779288&r1=1779287&r2=1779288&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
 Wed Jan 18 04:52:53 2017
@@ -19,14 +19,27 @@
 package org.apache.openmeetings.web.common.tree;
 
 import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.db.entity.file.FileItem.Type;
+import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.openmeetings.db.entity.record.Recording.Status;
 import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
+import org.apache.wicket.ajax.json.JSONObject;
 import 
org.apache.wicket.extensions.markup.html.repeater.tree.DefaultNestedTree;
 import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
+import org.apache.wicket.extensions.markup.html.repeater.tree.content.Folder;
 import org.apache.wicket.markup.repeater.ReuseIfModelsEqualStrategy;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.util.string.Strings;
+
+import com.googlecode.wicket.jquery.ui.markup.html.link.AjaxLink;
 
 public class FileItemTree extends DefaultNestedTree<FileItem> {
        private static final long serialVersionUID = 1L;
+       private final static String CSS_CLASS_FILE = "file ";
        final FileTreePanel treePanel;
 
        public FileItemTree(String id, FileTreePanel treePanel, 
ITreeProvider<FileItem> tp) {
@@ -35,8 +48,144 @@ public class FileItemTree extends Defaul
                setItemReuseStrategy(new ReuseIfModelsEqualStrategy());
        }
 
+       private void onClick(AjaxRequestTarget target, FileItem f) {
+               String mod = 
getRequest().getRequestParameters().getParameterValue("modifiers").toOptionalString();
+               boolean shift = false, ctrl = false;
+               if (!Strings.isEmpty(mod)) {
+                       JSONObject o = new JSONObject(mod);
+                       shift = o.optBoolean("shift");
+                       ctrl = o.optBoolean("ctrl");
+               }
+               treePanel.setSelected(f, target, shift, ctrl);
+               if (Type.Folder == f.getType() && getState(f) == 
State.COLLAPSED) {
+                       this.expand(f);
+               } else {
+                       treePanel.update(target, f);
+               }
+       }
+
+       private static boolean isClickable() {
+               return true;
+       }
+
        @Override
        protected Component newContentComponent(String id, IModel<FileItem> 
node) {
-               return new FileFolder(id, this, node, treePanel);
+               return new Folder<FileItem>(id, this, node) {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       protected Component newLabelComponent(String id, final 
IModel<FileItem> lm) {
+                               FileItem r = lm.getObject();
+                               return Type.Folder == r.getType() || r.getId() 
== null ? new FolderPanel(id, lm, treePanel) : new FileItemPanel(id, lm, 
treePanel);
+                       }
+
+                       @Override
+                       protected boolean isSelected() {
+                               FileItem f = getModelObject(), s = 
treePanel.getSelected();
+                               return s.getHash().equals(f.getHash());
+                       }
+
+                       @Override
+                       protected boolean isClickable() {
+                               return FileItemTree.isClickable();
+                       }
+
+                       @Override
+                       protected void onClick(AjaxRequestTarget target) {
+                               FileItemTree.this.onClick(target, 
getModelObject());
+                       }
+
+                       @Override
+                       protected MarkupContainer newLinkComponent(String id, 
IModel<FileItem> model) {
+                               final FileItem f = getModelObject();
+                               return new AjaxLink<Void>(id) {
+                                       private static final long 
serialVersionUID = 1L;
+
+                                       @Override
+                                       public boolean isEnabled() {
+                                               return 
FileItemTree.isClickable();
+                                       }
+
+                                       @Override
+                                       public void onClick(AjaxRequestTarget 
target) {
+                                               
FileItemTree.this.onClick(target, f);
+                                       }
+
+                                       @Override
+                                       protected void 
updateAjaxAttributes(AjaxRequestAttributes attributes) {
+                                               
super.updateAjaxAttributes(attributes);
+                                               
attributes.getDynamicExtraParameters().add("return {modifiers: 
JSON.stringify({shift: attrs.event.shiftKey, ctrl: attrs.event.ctrlKey})};");
+                                       }
+                               };
+                       }
+
+                       @Override
+                       protected String getOtherStyleClass(FileItem r) {
+                               return getItemStyle(r, false);
+                       }
+
+                       @Override
+                       protected String getOpenStyleClass() {
+                               return getItemStyle(getModelObject(), true);
+                       }
+
+                       @Override
+                       protected String getClosedStyleClass() {
+                               return getItemStyle(getModelObject(), false);
+                       }
+
+                       @Override
+                       protected String getSelectedStyleClass() {
+                               return "ui-state-active";
+                       }
+
+                       @Override
+                       protected IModel<String> newLabelModel(IModel<FileItem> 
model) {
+                               return Model.of(model.getObject().getName());
+                       }
+               };
+       }
+
+       private static String getItemStyle(FileItem f, boolean open) {
+               StringBuilder style = new StringBuilder("big om-icon ");
+               if (f.getId() == null) {
+                       
style.append(CSS_CLASS_FILE).append(f.getHash().indexOf("my") > -1 ? "my" : 
"public");
+               } else {
+                       if (!f.exists()) {
+                               style.append("broken ");
+                       }
+                       switch(f.getType()) {
+                               case Folder:
+                                       
style.append(CSS_CLASS_FILE).append(open ? "folder-open " : "folder ");
+                                       break;
+                               case Image:
+                                       
style.append(CSS_CLASS_FILE).append("image ");
+                                       break;
+                               case PollChart:
+                                       
style.append(CSS_CLASS_FILE).append("chart ");
+                                       break;
+                               case WmlFile:
+                                       
style.append(CSS_CLASS_FILE).append("wml ");
+                                       break;
+                               case Video:
+                               case Recording:
+                               {
+                                       style.append("recording ");
+                                       if (f instanceof Recording) {
+                                               Status st = 
((Recording)f).getStatus();
+                                               if (Status.RECORDING == st || 
Status.CONVERTING == st) {
+                                                       
style.append("processing");
+                                               }
+                                       }
+                               }
+                                       break;
+                               case Presentation:
+                                       
style.append(CSS_CLASS_FILE).append("doc ");
+                                       break;
+                               default:
+                                       break;
+                       }
+               }
+               return style.toString();
        }
 }

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java?rev=1779288&r1=1779287&r2=1779288&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
 Wed Jan 18 04:52:53 2017
@@ -82,7 +82,7 @@ public abstract class FileTreePanel exte
                super(id);
                this.addFolder = addFolder;
                OmTreeProvider tp = new OmTreeProvider(roomId);
-               setSelected(tp.getRoot(), null);
+               setSelected(tp.getRoot(), null, false, false);
                form.add(tree = new FileItemTree("tree", this, tp));
                
form.add(download.setVisible(false).setOutputMarkupPlaceholderTag(true));
                add(form.add(downloader));
@@ -246,7 +246,7 @@ public abstract class FileTreePanel exte
                }
        }
 
-       public void setSelected(FileItem fi, AjaxRequestTarget target) {
+       public void setSelected(FileItem fi, AjaxRequestTarget target, boolean 
shift, boolean ctrl) {
                FileItem _prev = selected.getObject();
                updateNode(target, _prev);
                if (target != null) {


Reply via email to