/**
* 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.brixcms.plugin.site.folder;
import com.inmethod.grid.IGridColumn;
import com.inmethod.grid.IRenderable;
import com.inmethod.grid.SizeUnit;
import com.inmethod.grid.column.AbstractColumn;
import com.inmethod.grid.column.AbstractLightWeightColumn;
import com.inmethod.grid.column.PropertyColumn;
import com.inmethod.grid.datagrid.DataGrid;
import org.apache.wicket.Component;
import org.apache.wicket.Page;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.Response;
import org.apache.wicket.util.string.Strings;
import org.brixcms.jcr.wrapper.BrixFileNode;
import org.brixcms.jcr.wrapper.BrixNode;
import org.brixcms.plugin.site.SitePlugin;
import org.brixcms.web.generic.BrixGenericPanel;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class ListFolderNodesTab extends BrixGenericPanel<BrixNode> {
public ListFolderNodesTab(String id, IModel<BrixNode> folderModel) {
super(id, folderModel);
List<IGridColumn> columns = new ArrayList<IGridColumn>();
columns.add(new NameColumn(new ResourceModel("name")).setInitialSize(180));
columns.add(new TypePropertyColumn(new ResourceModel("type")).setInitialSize(80));
columns.add(new SizeColumn(new ResourceModel("size")).setInitialSize(100));
columns.add(new MimeTypeColumn(new ResourceModel("mimeType")).setInitialSize(80));
columns.add(new DatePropertyColumn(new ResourceModel("created"), "created", FolderDataSource.PROPERTY_CREATED)
.setInitialSize(120));
columns.add(new PropertyColumn(new ResourceModel("createdBy"), "createdBy",
FolderDataSource.PROPERTY_CREATED_BY).setInitialSize(90));
columns.add(new DatePropertyColumn(new ResourceModel("lastModified"), "lastModified",
FolderDataSource.PROPERTY_LAST_MODIFIED).setInitialSize(120));
columns.add(new PropertyColumn(new ResourceModel("lastModifiedBy"), "lastModifiedBy",
FolderDataSource.PROPERTY_LAST_MODIFIED_BY).setInitialSize(110));
FolderDataSource source = new FolderDataSource() {
@Override
BrixNode getFolderNode() {
return getNode();
}
};
DataGrid grid = new DataGrid("grid", source, columns) {
@Override
protected void onRowClicked(AjaxRequestTarget target, IModel rowModel) {
//((ServletWebRequest) getRequest()).setForceNewVersion(true);
BrixNode node = (BrixNode) rowModel.getObject();
Page page = getPage();
SitePlugin.get().selectNode(this, node);
getRequestCycle().setResponsePage(page);
}
};
grid.setContentHeight(30, SizeUnit.EM);
add(grid);
}
private BrixNode getNode() {
return (BrixNode) getModelObject();
}
private class NameColumn extends AbstractColumn {
public NameColumn(IModel<String> headerModel) {
super("name", headerModel, FolderDataSource.PROPERTY_NAME);
}
@Override
public Component newCell(WebMarkupContainer parent, String componentId, IModel rowModel) {
return new NamePanel(componentId, rowModel);
}
}
private class NamePanel extends BrixGenericPanel<BrixNode> {
public NamePanel(String id, final IModel<BrixNode> model) {
super(id, model);
Link<?> link;
add(link = new Link<Void>("select") {
@Override
public void onClick() {
BrixNode node = model.getObject();
SitePlugin.get().selectNode(this, node);
}
@Override
protected void onComponentTag(ComponentTag tag) {
if (model.getObject().isFolder()) {
tag.put("class", "brix-site-folder-node");
}
super.onComponentTag(tag);
}
});
IModel<String> labelModel;
if (model.getObject().getDepth() < ListFolderNodesTab.this.getModelObject().getDepth()) {
labelModel = new Model<String>("..");
} else {
labelModel = new PropertyModel<String>(model, "userVisibleName");
}
link.add(new Label("label", labelModel));
}
}
private static class TypePropertyColumn extends PropertyColumn {
public TypePropertyColumn(IModel<String> headerModel) {
super("type", headerModel, "userVisibleType", FolderDataSource.PROPERTY_TYPE);
}
}
private class MimeTypeColumn extends AbstractLightWeightColumn {
public MimeTypeColumn(IModel<String> headerModel) {
super("mimeType", headerModel, FolderDataSource.PROPERTY_MIME_TYPE);
}
@Override
public IRenderable newCell(IModel rowModel) {
return new IRenderable() {
public void render(IModel rowModel, Response response) {
BrixNode node = (BrixNode) rowModel.getObject();
if (node instanceof BrixFileNode) {
String mime = ((BrixFileNode) node).getMimeType();
if (mime != null) {
response.write(Strings.escapeMarkup(mime));
}
}
}
};
}
}
private class SizeColumn extends AbstractLightWeightColumn {
public SizeColumn(IModel<String> headerModel) {
super("size", headerModel, FolderDataSource.PROPERTY_SIZE);
}
@Override
public IRenderable newCell(IModel rowModel) {
return new IRenderable() {
public void render(IModel rowModel, Response response) {
BrixNode node = (BrixNode) rowModel.getObject();
if (node instanceof BrixFileNode) {
Long size = ((BrixFileNode) node).getContentLength();
response.write(size.toString());
response.write(" bytes");
}
}
};
}
}
private static class DatePropertyColumn extends PropertyColumn {
public DatePropertyColumn(IModel<String> headerModel, String propertyExpression, String sortProperty) {
super(headerModel, propertyExpression, sortProperty);
}
@Override
protected CharSequence convertToString(Object object) {
if (object == null) {
return "";
} else {
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
return df.format((Date) object);
}
}
}
}