/*
* ModeShape (http://www.modeshape.org)
*
* Licensed 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.
*/
package org.modeshape.web.client.contents;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import java.util.Collection;
import org.modeshape.web.client.contents.ChildrenEditor.NodeRecord;
import org.modeshape.web.client.grid.Grid;
import org.modeshape.web.client.grid.Pager;
import org.modeshape.web.shared.Align;
import org.modeshape.web.shared.Columns;
import org.modeshape.web.shared.JcrNode;
/**
*
* @author kulikov
*/
public class ChildrenEditor extends Grid<NodeRecord, JcrNode> {
private JcrNode node;
private final Contents contents;
private final RenameNodeDialog renameNodeDialog;
private final ChildNodesPager pager = new ChildNodesPager();
private Label hint;
public ChildrenEditor(Contents contents) {
super("Child nodes");
this.contents = contents;
this.setFooterContent(pager);
renameNodeDialog = new RenameNodeDialog(contents);
}
public void show(JcrNode node) {
this.node = node;
pager.setRecordsAmount((int)node.getChildCount());
pager.fetch(0);
String hintText = node.hasBinaryContent() ?
"This node has binary content attached. See bellow" :
"This node has no binary content attached";
hint.setContents(hintText);
}
@Override
protected HLayout tableHeader() {
HLayout header = new HLayout();
header.setHeight(30);
header.setBackgroundColor("#e6f1f6");
Label name = new Label("<b>Name</b>");
name.setWidth(150);
name.setIcon("icons/view_tree_modernist.png");
Label type = new Label("<b>Primary Type</b>");
type.setWidth(150);
type.setIcon("icons/documents.png");
Label path = new Label("<b>Path</b>");
path.setWidth100();
path.setIcon("icons/view_table.png");
header.addMember(name);
header.addMember(type);
header.addMember(path);
return header;
}
@SuppressWarnings("synthetic-access")
@Override
protected HLayout toolBar() {
hint = new Label();
hint.setWidth100();
Label hint2 = new Label();
hint2.setContents("Enable/Disbale properties");
hint2.setWidth(250);
hint2.setAlign(Alignment.RIGHT);
Label detailsButton = new Label();
detailsButton.setTooltip("Show details");
detailsButton.setStyleName("button-label");
detailsButton.setWidth(16);
detailsButton.setIcon("icons/view_table.png");
detailsButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
contents.toggleDetails();
}
});
Columns col = new Columns(Align.LEFT, Align.CENTER);
col.setBackgroundColor("#ffffff");
col.setHeight(30);
col.addMember(hint);
col.addMember(hint2);
col.addMember(detailsButton);
return col;
}
@Override
protected NodeRecord[] records() {
NodeRecord[] recs = new NodeRecord[100];
for (int i = 0; i < recs.length; i++) {
recs[i] = new NodeRecord();
}
return recs;
}
@SuppressWarnings("synthetic-access")
@Override
protected void updateRecord(int pos, NodeRecord record, JcrNode value) {
if (pos <= 0) {
record.setNodeAsParent(ChildrenEditor.this.node);
record.setVisible(!node.getPath().equals("/"));
} else {
record.setNode(value);
}
}
public class NodeRecord extends HLayout {
private Label name = new Label();
private Label path = new Label();
private Label primaryType = new Label();
private Buttons buttons = new Buttons();
private JcrNode node;
public NodeRecord() {
super();
setStyleName("grid");
setHeight(30);
setDefaultLayoutAlign(VerticalAlignment.CENTER);
setDefaultLayoutAlign(Alignment.LEFT);
setLayoutAlign(VerticalAlignment.CENTER);
setLayoutAlign(Alignment.CENTER);
setAlign(VerticalAlignment.CENTER);
setAlign(Alignment.LEFT);
name.setStyleName("node-name");
name.setIcon("icons/folder.png");
name.addClickHandler(new ClickHandler() {
@SuppressWarnings("synthetic-access")
@Override
public void onClick(ClickEvent event) {
contents.getAndDisplayNode(path(), true);
}
});
name.setWidth(150);
primaryType.setWidth(150);
primaryType.setStyleName("text");
path.setWidth100();
path.setStyleName("text");
addMember(name);
addMember(primaryType);
addMember(path);
addMember(buttons);
}
private String path() {
return node == null ? "/" : path.getContents();
}
private void setNode(JcrNode node) {
this.node = node;
this.name.setContents(node.getName());
this.path.setContents(node.getPath());
this.path.setVisible(true);
this.buttons.setVisible(true);
this.buttons.setNode(node);
this.primaryType.setContents(node.getPrimaryType());
}
private void setNodeAsParent(JcrNode node) {
this.node = node;
this.name.setContents("<b>../</b>");
this.path.setContents(parent(node.getPath()));
this.path.setVisible(false);
this.buttons.setVisible(false);
this.buttons.setNode(node);
this.primaryType.setContents("");
}
private String parent(String path) {
if (path == null) {
return "/";
}
path = path.substring(0, path.lastIndexOf('/'));
if (path.length() == 0) {
return "/";
}
return path;
}
}
private class Buttons extends HLayout {
private Label editButton = new Label();
private Label remButton = new Label();
private JcrNode node;
public Buttons() {
this.setWidth(36);
this.setDefaultLayoutAlign(Alignment.RIGHT);
this.setLayoutAlign(Alignment.RIGHT);
this.setAlign(Alignment.RIGHT);
this.setDefaultLayoutAlign(VerticalAlignment.CENTER);
this.setLayoutAlign(VerticalAlignment.CENTER);
this.setAlign(VerticalAlignment.CENTER);
editButton.setWidth(16);
editButton.setHeight(16);
editButton.setIcon("icons/pencil.png");
editButton.setStyleName("button-label");
editButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
renameNodeDialog.showModal(node);
}
});
remButton.setWidth(16);
remButton.setHeight(16);
remButton.setIcon("icons/cross.png");
remButton.setStyleName("button-label");
remButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
SC.ask("Remove node", "Do you want to remove node?", new BooleanCallback() {
@Override
public void execute(Boolean confirmed) {
if (confirmed) {
contents.removeNode(node);
}
}
});
}
});
addMember(editButton);
addMember(remButton);
}
protected void setNode(JcrNode node) {
this.node = node;
}
}
private class ChildNodesPager extends Pager {
@Override
public void fetch(int index) {
contents.jcrService().childNodes(contents.repository(),
contents.workspace(), contents.path(),
index * pager.getRecordsPerPage(),
pager.getRecordsPerPage(), new AsyncCallback<Collection<JcrNode>>() {
@Override
public void onFailure(Throwable caught) {
SC.say(caught.getMessage());
}
@Override
public void onSuccess(Collection<JcrNode> nodes) {
setValues(nodes);
}
});
}
}
}