/**
* OpenKM, Open Document Management System (http://www.openkm.com)
* Copyright (c) 2006-2011 Paco Avila & Josep Llort
*
* No bytes were intentionally harmed during the development of this application.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package com.openkm.frontend.client.widget.wizard;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasAlignment;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import com.google.gwt.user.client.ui.HTMLTable.RowFormatter;
import com.openkm.frontend.client.Main;
import com.openkm.frontend.client.bean.GWTFolder;
import com.openkm.frontend.client.contants.service.RPCService;
import com.openkm.frontend.client.service.OKMPropertyService;
import com.openkm.frontend.client.service.OKMPropertyServiceAsync;
import com.openkm.frontend.client.util.CommonUI;
import com.openkm.frontend.client.util.OKMBundleResources;
import com.openkm.frontend.client.util.Util;
/**
* CategoriesWidget
*
* @author jllort
*
*/
public class CategoriesWidget extends Composite {
private final OKMPropertyServiceAsync propertyService = (OKMPropertyServiceAsync) GWT.create(OKMPropertyService.class);
private FlexTable table;
private String docPath;
private CellFormatter cellFormatter;
private VerticalPanel vPanel;
private ScrollPanel scrollDirectoryPanel;
private VerticalPanel verticalDirectoryPanel;
private FolderSelectTree folderSelectTree;
private Button actionButton;
private FlexTable tableSubscribedCategories;
private Collection<GWTFolder> docCategories;
private boolean remove = true;
public CategoriesWidget(String docPath, Widget widget) {
table = new FlexTable();
tableSubscribedCategories = new FlexTable();
docCategories = new ArrayList<GWTFolder>();
this.docPath = docPath;
cellFormatter = table.getCellFormatter(); // Gets the cell formatter
table.setWidth("100%");
table.setCellPadding(0);
table.setCellSpacing(2);
table.setWidget(0, 0, widget);
table.getFlexCellFormatter().setColSpan(0,0,2);
cellFormatter.addStyleName(0,0,"okm-Security-Title-RightBorder"); // Border and margins
RowFormatter rowFormatter = table.getRowFormatter();
rowFormatter.setStyleName(0, "okm-Security-Title");
// Widget format
cellFormatter.setHorizontalAlignment(0,0,HasAlignment.ALIGN_CENTER);
cellFormatter.setVerticalAlignment(0,0,HasAlignment.ALIGN_MIDDLE);
// Categories
vPanel = new VerticalPanel();
vPanel.setWidth("390");
vPanel.setHeight("175");
scrollDirectoryPanel = new ScrollPanel();
scrollDirectoryPanel.setSize("380", "150");
scrollDirectoryPanel.setStyleName("okm-Popup-text");
verticalDirectoryPanel = new VerticalPanel();
verticalDirectoryPanel.setSize("100%", "100%");
folderSelectTree = new FolderSelectTree();
folderSelectTree.setSize("100%", "100%");
verticalDirectoryPanel.add(folderSelectTree);
scrollDirectoryPanel.add(verticalDirectoryPanel);
actionButton = new Button(Main.i18n("button.add"), new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Main.get().wizardPopup.categoriesWidget.addCategory(folderSelectTree.getCategory());
}
});
actionButton.setEnabled(false);
vPanel.add(scrollDirectoryPanel);
vPanel.add(actionButton);
vPanel.setCellHorizontalAlignment(scrollDirectoryPanel, HasAlignment.ALIGN_CENTER);
vPanel.setCellHorizontalAlignment(actionButton, HasAlignment.ALIGN_CENTER);
vPanel.setCellVerticalAlignment(actionButton, HasAlignment.ALIGN_MIDDLE);
vPanel.setCellHeight(scrollDirectoryPanel, "150");
vPanel.setCellHeight(actionButton, "25");
table.setWidget(1, 0, vPanel);
table.getFlexCellFormatter().setColSpan(1,0,2);
cellFormatter.setHorizontalAlignment(1,0,HasAlignment.ALIGN_CENTER);
table.setHTML(2, 0, " <b>"+Main.i18n("document.categories")+"</b>");
table.getFlexCellFormatter().setColSpan(2,0,2);
cellFormatter.setHorizontalAlignment(2,0,HasAlignment.ALIGN_LEFT);
table.setWidget(3, 0, tableSubscribedCategories);
table.getFlexCellFormatter().setColSpan(3,0,2);
cellFormatter.setHorizontalAlignment(3,0,HasAlignment.ALIGN_LEFT);
setRowWordWarp(0, 0,true, tableSubscribedCategories);
table.setStyleName("okm-DisableSelect");
actionButton.setStyleName("okm-Button");
tableSubscribedCategories.setStyleName("okm-DisableSelect");
// Resets to initial tree value
folderSelectTree.reset();
initWidget(table);
}
/**
* Enables or disables move button
*
* @param enable
*/
public void enable(boolean enable) {
actionButton.setEnabled(enable);
}
/**
* Callback addCategory document
*/
final AsyncCallback<Object> callbackAddCategory = new AsyncCallback<Object>() {
public void onSuccess(Object result) {
}
public void onFailure(Throwable caught) {
Main.get().showError("AddCategory", caught);
}
};
/**
* Callback removeCategory document
*/
final AsyncCallback<Object> callbackRemoveCategory = new AsyncCallback<Object>() {
public void onSuccess(Object result) {
}
public void onFailure(Throwable caught) {
Main.get().showError("RemoveCategory", caught);
}
};
/**
* addCategory document
*/
public void addCategory(GWTFolder category) {
if (!existCategory(category.getUuid())) {
docCategories.add(category);
drawCategory(category,remove);
ServiceDefTarget endPoint = (ServiceDefTarget) propertyService;
endPoint.setServiceEntryPoint(RPCService.PropertyService);
propertyService.addCategory(docPath, category.getUuid(), callbackAddCategory);
}
}
/**
* removeCategory document
*/
public void removeCategory(String UUID) {
ServiceDefTarget endPoint = (ServiceDefTarget) propertyService;
endPoint.setServiceEntryPoint(RPCService.PropertyService);
propertyService.removeCategory(docPath, UUID, callbackRemoveCategory);
}
/**
* existCategory
*
* @param Uuid
* @return
*/
private boolean existCategory(String Uuid) {
boolean found = false;
for (Iterator<GWTFolder> it = docCategories.iterator(); it.hasNext();) {
if (it.next().getUuid().equals(Uuid)) {
found = true;
break;
}
}
return found;
}
/**
* drawCategory
*
* @param category
*/
private void drawCategory(final GWTFolder category, boolean remove) {
int row = tableSubscribedCategories.getRowCount();
Anchor anchor = new Anchor();
// Looks if must change icon on parent if now has no childs and properties with user security atention
String path = category.getPath().substring(16); // Removes /okm:categories
if (category.getHasChilds()) {
anchor.setHTML(Util.imageItemHTML("img/menuitem_childs.gif", path, "top"));
} else {
anchor.setHTML(Util.imageItemHTML("img/menuitem_empty.gif", path, "top"));
}
anchor.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
CommonUI.openAllFolderPath(category.getPath(), null);
}
});
anchor.setStyleName("okm-KeyMap-ImageHover");
Image delete = new Image(OKMBundleResources.INSTANCE.deleteIcon());
delete.setStyleName("okm-KeyMap-ImageHover");
delete.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
removeCategory(category.getUuid());
tableSubscribedCategories.removeRow(tableSubscribedCategories.getCellForEvent(event).getRowIndex());
}
});
tableSubscribedCategories.setWidget(row, 0, anchor);
if (remove) {
tableSubscribedCategories.setWidget(row, 1, delete);
} else {
tableSubscribedCategories.setWidget(row, 1, new HTML(""));
}
setRowWordWarp(row, 1, true, tableSubscribedCategories);
}
/**
* Set the WordWarp for all the row cells
*
* @param row The row cell
* @param columns Number of row columns
* @param warp
* @param table The table to change word wrap
*/
private void setRowWordWarp(int row, int columns, boolean warp, FlexTable table) {
CellFormatter cellFormatter = table.getCellFormatter();
for (int i=0; i<columns; i++) {
cellFormatter.setWordWrap(row, i, warp);
}
}
}