/**
* 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.mainmenu;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import com.openkm.frontend.client.Main;
import com.openkm.frontend.client.bean.GWTBookmark;
import com.openkm.frontend.client.contants.service.RPCService;
import com.openkm.frontend.client.service.OKMBookmarkService;
import com.openkm.frontend.client.service.OKMBookmarkServiceAsync;
import com.openkm.frontend.client.util.Util;
/**
* ManageBookmarkPopup
*
* @author jllort
*
*/
public class ManageBookmarkPopup extends DialogBox {
private final OKMBookmarkServiceAsync bookmarkService = (OKMBookmarkServiceAsync) GWT.create(OKMBookmarkService.class);
private VerticalPanel vPanel;
private HorizontalPanel hPanel;
private Button cancelButton;
private Button deleteButton;
private Button updateButton;
private FlexTable table;
private FlexTable tableBookmark;
private ScrollPanel scrollPanel;
private ScrollPanel scrollPanelBookmark;
private TextBox textBox;
private Map<String,GWTBookmark> bookmarkMap = new HashMap<String,GWTBookmark>();
private int selectedRow = -1;
private int columns = 3;
/**
* ManageBookmarkPopup
*/
public ManageBookmarkPopup(){
// Establishes auto-close when click outside
super(false,true);
vPanel = new VerticalPanel();
textBox = new TextBox();
textBox.setStyleName("okm-Input");
textBox.setVisibleLength(40);
textBox.setMaxLength(90);
textBox.addKeyPressHandler(new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
if ((char)KeyCodes.KEY_ENTER == event.getCharCode() ) {
if (textBox.getText().length()>0) {
rename(Integer.parseInt(table.getText(selectedRow,2)),textBox.getText());
}
} else if ((char)KeyCodes.KEY_ESCAPE == event.getCharCode() ) {
tableBookmark.setHTML(0,1,table.getText(selectedRow,1));
deleteButton.setEnabled(true);
updateButton.setEnabled(true);
}
}
});
cancelButton = new Button(Main.i18n("button.close"), new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Main.get().mainPanel.topPanel.mainMenu.bookmark.getAll(); // Refreshing menu after edit bookmarks
hide();
}
}
);
cancelButton.setStyleName("okm-Button");
deleteButton = new Button(Main.i18n("button.delete"), new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (selectedRow>=0) {
remove(Integer.parseInt(table.getText(selectedRow,2)));
}
}
}
);
deleteButton.setStyleName("okm-Button");
deleteButton.setEnabled(false);
updateButton = new Button(Main.i18n("button.update"), new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (selectedRow>=0) {
textBox.setText(table.getHTML(selectedRow,1));
tableBookmark.setWidget(0,1,textBox);
updateButton.setEnabled(false);
deleteButton.setEnabled(false);
textBox.setFocus(true);
}
}
}
);
updateButton.setStyleName("okm-Button");
updateButton.setEnabled(false);
table = new FlexTable();
table.setBorderWidth(0);
table.setCellSpacing(0);
table.setCellSpacing(0);
table.setWidth("100%");
table.addStyleName("okm-DisableSelect");
table.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
// Mark selected row or orders rows if header row (0) is clicked
// And row must be other than the selected one
int row = table.getCellForEvent(event).getRowIndex();
if (row != selectedRow) {
styleRow(selectedRow, false);
styleRow(row, true);
selectedRow = row;
if (bookmarkMap.containsKey(table.getText(row,2))) {
GWTBookmark bookmark = (GWTBookmark) bookmarkMap.get(table.getText(row,2));
tableBookmark.setHTML(0,1,bookmark.getName());
tableBookmark.setHTML(0,2,table.getText(row,2));
tableBookmark.getFlexCellFormatter().setVisible(0, 2, false);
tableBookmark.setHTML(1,1,bookmark.getPath());
if (bookmark.getType().equals(Bookmark.BOOKMARK_DOCUMENT)) {
tableBookmark.setHTML(2,1,Main.i18n("bookmark.type.document"));
} else if (bookmark.getType().equals(Bookmark.BOOKMARK_FOLDER)) {
tableBookmark.setHTML(2,1,Main.i18n("bookmark.type.folder"));
}
}
deleteButton.setEnabled(true);
updateButton.setEnabled(true);
}
}
});
scrollPanel = new ScrollPanel(table);
scrollPanel.setSize("380","150");
scrollPanel.setStyleName("okm-Bookmark-Panel");
// Selected Bookmark data
tableBookmark = new FlexTable();
tableBookmark.setBorderWidth(0);
tableBookmark.setCellSpacing(0);
tableBookmark.setCellSpacing(0);
tableBookmark.setWidth("100%");
tableBookmark.setHTML(0,0,"<b>"+Main.i18n("bookmark.name")+"</b>");
tableBookmark.setHTML(0,1,"");
tableBookmark.setHTML(1,0,"<b>"+Main.i18n("bookmark.path")+"</b>");
tableBookmark.setHTML(1,1,"");
tableBookmark.setHTML(2,0,"<b>"+Main.i18n("bookmark.type")+"</b>");
tableBookmark.setHTML(2,1,"");
tableBookmark.getCellFormatter().setWidth(0,0,"15%");
tableBookmark.getCellFormatter().setWidth(0,1,"15%");
tableBookmark.getCellFormatter().setWidth(0,2,"70%");
// Set no wrap
CellFormatter cellFormatter = tableBookmark.getCellFormatter();
for (int i=0; i<columns; i++) {
cellFormatter.setWordWrap(0, i, false);
cellFormatter.setWordWrap(1, i, false);
cellFormatter.setWordWrap(2, i, false);
}
scrollPanelBookmark = new ScrollPanel(tableBookmark);
scrollPanelBookmark.setWidth("380");
scrollPanelBookmark.setStyleName("okm-Bookmark-Panel");
scrollPanelBookmark.setAlwaysShowScrollBars(false);
hPanel = new HorizontalPanel();
hPanel.add(deleteButton);
hPanel.add(new HTML(" "));
hPanel.add(updateButton);
vPanel.add(new HTML("<br>"));
vPanel.add(scrollPanelBookmark);
vPanel.add(new HTML("<br>"));
vPanel.add(hPanel);
vPanel.add(new HTML("<br>"));
vPanel.add(scrollPanel);
vPanel.add(new HTML("<br>"));
vPanel.add(cancelButton);
vPanel.add(new HTML("<br>"));
vPanel.setCellHorizontalAlignment(scrollPanelBookmark, HorizontalPanel.ALIGN_CENTER);
vPanel.setCellHorizontalAlignment(hPanel, HorizontalPanel.ALIGN_CENTER);
vPanel.setCellHorizontalAlignment(scrollPanel, HorizontalPanel.ALIGN_CENTER);
vPanel.setCellHorizontalAlignment(cancelButton, HorizontalPanel.ALIGN_CENTER);
vPanel.setWidth("100%");
center();
hide();
setWidget(vPanel);
}
/**
* Callback get all
*/
final AsyncCallback<List<GWTBookmark>> callbackGetAll = new AsyncCallback<List<GWTBookmark>>() {
public void onSuccess(List<GWTBookmark> result) {
int row = table.getRowCount();
bookmarkMap = new HashMap<String,GWTBookmark>();
for (Iterator<GWTBookmark> it = result.iterator(); it.hasNext();) {
GWTBookmark bookmark = (GWTBookmark) it.next();
bookmarkMap.put(String.valueOf(bookmark.getId()),bookmark);
String icon = "";
if (bookmark.getType().equals(Bookmark.BOOKMARK_DOCUMENT)) {
icon = "img/icon/menu/document_bookmark.gif";
} else if (bookmark.getType().equals(Bookmark.BOOKMARK_FOLDER)) {
icon = "img/icon/menu/folder_bookmark.gif";
}
table.setHTML(row,0,Util.imageHTML(icon));
table.setHTML(row,1,bookmark.getName());
table.setHTML(row,2,String.valueOf(bookmark.getId()));
table.getRowFormatter().setStyleName(row, "okm-Table-Row");
table.getCellFormatter().setWidth(row,0,"25");
table.getCellFormatter().setVisible(row, 2, false);
setRowWordWarp(row,2,false);
if(row==0) {
tableBookmark.setHTML(0,1,bookmark.getName());
tableBookmark.setHTML(0,2,String.valueOf(bookmark.getId()));
tableBookmark.setHTML(1,1,bookmark.getPath());
tableBookmark.setHTML(2,1,bookmark.getType());
if (bookmark.getType().equals(Bookmark.BOOKMARK_DOCUMENT)) {
tableBookmark.setHTML(2,1,Main.i18n("bookmark.type.document"));
} else if (bookmark.getType().equals(Bookmark.BOOKMARK_FOLDER)) {
tableBookmark.setHTML(2,1,Main.i18n("bookmark.type.folder"));
}
tableBookmark.getCellFormatter().setVisible(0,2,false);
deleteButton.setEnabled(true);
updateButton.setEnabled(true);
styleRow(row,true);
selectedRow = row;
}
row++;
}
}
public void onFailure(Throwable caught) {
Main.get().showError("getAll", caught);
}
};
/**
* Callback remove
*/
final AsyncCallback<Object> callbackRemove = new AsyncCallback<Object>() {
public void onSuccess(Object result) {
if (selectedRow>=0) {
bookmarkMap.remove(table.getText(selectedRow,2));
table.removeRow(selectedRow);
if (table.getRowCount()>0) {
if (selectedRow!=0) {
selectedRow--;
styleRow(selectedRow,true);
} else {
styleRow(selectedRow,true);
}
GWTBookmark bookmark = (GWTBookmark) bookmarkMap.get(table.getText(selectedRow,2));
tableBookmark.setHTML(0,1,bookmark.getName());
tableBookmark.setHTML(0,2,String.valueOf(bookmark.getId()));
tableBookmark.setHTML(1,1,bookmark.getPath());
tableBookmark.setHTML(2,1,bookmark.getType());
if (bookmark.getType().equals(Bookmark.BOOKMARK_DOCUMENT)) {
tableBookmark.setHTML(2,1,Main.i18n("bookmark.type.document"));
} else if (bookmark.getType().equals(Bookmark.BOOKMARK_FOLDER)) {
tableBookmark.setHTML(2,1,Main.i18n("bookmark.type.folder"));
}
} else {
deleteButton.setEnabled(false);
updateButton.setEnabled(false);
selectedRow=-1;
}
}
}
public void onFailure(Throwable caught) {
Main.get().showError("remove", caught);
}
};
/**
* Callback rename
*/
final AsyncCallback<GWTBookmark> callbackRename = new AsyncCallback<GWTBookmark>() {
public void onSuccess(GWTBookmark result) {
if (selectedRow>=0) {
bookmarkMap.remove(table.getText(selectedRow,2));
bookmarkMap.put(table.getText(selectedRow,2),result);
tableBookmark.setHTML(0,1,result.getName());
table.setHTML(selectedRow,1,result.getName());
}
deleteButton.setEnabled(true);
updateButton.setEnabled(true);
}
public void onFailure(Throwable caught) {
deleteButton.setEnabled(true);
updateButton.setEnabled(true);
Main.get().showError("rename", caught);
}
};
/**
* Gets the bookmark list from the server
*
*/
public void getAll() {
ServiceDefTarget endPoint = (ServiceDefTarget) bookmarkService;
endPoint.setServiceEntryPoint(RPCService.BookmarkService);
bookmarkService.getAll(callbackGetAll);
}
/**
* Remove bookmark
*
* @param id
*/
private void remove(int id) {
ServiceDefTarget endPoint = (ServiceDefTarget) bookmarkService;
endPoint.setServiceEntryPoint(RPCService.BookmarkService);
bookmarkService.remove(id, callbackRemove);
}
/**
* Rename bookmark
*
* @param id
* @param newName
*/
private void rename(int id, String newName) {
ServiceDefTarget endPoint = (ServiceDefTarget) bookmarkService;
endPoint.setServiceEntryPoint(RPCService.BookmarkService);
bookmarkService.rename(id, newName, callbackRename);
}
/**
* Removes all rows
*/
private void removeAll(){
bookmarkMap = new HashMap<String,GWTBookmark>();
while (table.getRowCount()>0){
table.removeRow(0);
}
}
/**
* Show the popup
*/
public void showPopup(){
setText(Main.i18n("bookmark.edit.label"));
tableBookmark.setHTML(0,1,"");
tableBookmark.setHTML(1,1,"");
tableBookmark.setHTML(2,1,"");
deleteButton.setEnabled(false);
updateButton.setEnabled(false);
selectedRow = -1;
removeAll();
getAll();
center();
}
/**
* Change the style row selected or unselected
*
* @param row The row afected
* @param selected Indicates selected unselected row
*/
private void styleRow(int row, boolean selected) {
if (row>=0) {
if (selected){
table.getRowFormatter().addStyleName(row, "okm-Security-SelectedRow");
}
else {
table.getRowFormatter().removeStyleName(row, "okm-Security-SelectedRow");
}
}
}
/**
* Set the WordWarp for all the row cells
*
* @param row The row cell
* @param columns Number of row columns
* @param warp
*/
private void setRowWordWarp(int row, int columns, boolean warp) {
CellFormatter cellFormatter = table.getCellFormatter();
for (int i=0; i<columns; i++) {
cellFormatter.setWordWrap(row, i, false);
}
}
/**
* Refreshing language
*/
public void langRefresh(){
setText(Main.i18n("bookmark.edit.label"));
tableBookmark.setHTML(0,0,"<b>"+Main.i18n("bookmark.name")+"</b>");
tableBookmark.setHTML(1,0,"<b>"+Main.i18n("bookmark.path")+"</b>");
tableBookmark.setHTML(2,0,"<b>"+Main.i18n("bookmark.type")+"</b>");
cancelButton.setHTML(Main.i18n("button.close"));
deleteButton.setHTML(Main.i18n("button.delete"));
updateButton.setHTML(Main.i18n("button.update"));
}
}