/**
* 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.dashboard;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.openkm.frontend.client.Main;
import com.openkm.frontend.client.bean.GWTDashboardDocumentResult;
import com.openkm.frontend.client.bean.GWTQueryParams;
import com.openkm.frontend.client.contants.service.RPCService;
import com.openkm.frontend.client.service.OKMDashboardService;
import com.openkm.frontend.client.service.OKMDashboardServiceAsync;
/**
* NewsDashboard
*
* @author jllort
*
*/
public class NewsDashboard extends WidgetToFire {
private final OKMDashboardServiceAsync dashboardService = (OKMDashboardServiceAsync) GWT.create(OKMDashboardService.class);
private final int NUMBER_OF_COLUMNS = 2;
private HorizontalPanel hPanel;
private Map<String,DashboardWidget> hWidgetSearch= new HashMap<String,DashboardWidget>();
private Map<String, GWTQueryParams> keyMap = new HashMap<String, GWTQueryParams>();
private VerticalPanel vPanelLeft;
private VerticalPanel vPanelRight;
private int columnWidth = 0;
private int actualSearchRefreshing = 0;
private String actualRefreshingKey = "0";
private boolean refreshFind = true;
private int newsDocuments = 0;
private boolean firstTime = true;
/**
* NewsDashboard
*/
public NewsDashboard() {
vPanelLeft = new VerticalPanel();
vPanelRight = new VerticalPanel();
hPanel = new HorizontalPanel();
hPanel.add(vPanelLeft);
hPanel.add(vPanelRight);
initWidget(hPanel);
}
/**
* Gets all search callback
*/
final AsyncCallback<List<GWTQueryParams>> callbackGetUserSearchs = new AsyncCallback<List<GWTQueryParams>>() {
public void onSuccess(List<GWTQueryParams> result){
// Drops widget panel , prevent user deletes query
for (Iterator<String> it = keyMap.keySet().iterator(); it.hasNext();) {
int key = Integer.parseInt(it.next());
boolean found = false;
// looking for key
for (Iterator<GWTQueryParams> itx = result.iterator(); itx.hasNext();) {
GWTQueryParams params = itx.next();
if (params.getId()==key) {
found = true;
break;
}
}
// if has been removed must remove from list
if(!found) {
DashboardWidget dashboardWidget = hWidgetSearch.get(key);
if (dashboardWidget.getParent().equals(vPanelLeft)) {
vPanelLeft.remove(dashboardWidget);
} else if (dashboardWidget.getParent().equals(vPanelRight)) {
vPanelRight.remove(dashboardWidget);
}
keyMap.remove(""+key);
}
}
// Adds new widget
for (ListIterator<GWTQueryParams> it= result.listIterator(); it.hasNext();) {
GWTQueryParams params = it.next();
String key = ""+params.getId();
if (!keyMap.keySet().contains(key)) {
keyMap.put(key, params);
DashboardWidget dashboardWidget = new DashboardWidget(key, params.getQueryName(), "img/icon/news.gif", true, "news_"+key);
dashboardWidget.setWidgetToFire(Main.get().mainPanel.dashboard.newsDashboard);
hWidgetSearch.put(key, dashboardWidget);
dashboardWidget.setWidth(columnWidth);
dashboardWidget.setHeaderResults(0);
// Distribute widgets left / rigth
if (vPanelLeft.getWidgetCount()<=vPanelRight.getWidgetCount()) {
vPanelLeft.add(dashboardWidget);
} else {
vPanelRight.add(dashboardWidget);
}
}
}
if (refreshFind) {
refreshFind = false;
refreshAllSearchs();
}
}
public void onFailure(Throwable caught) {
Main.get().showError("getUserSearchs", caught);
}
};
/**
* Gets the find search callback
*/
final AsyncCallback<List<GWTDashboardDocumentResult>> callbackFind = new AsyncCallback<List<GWTDashboardDocumentResult>>() {
public void onSuccess(List<GWTDashboardDocumentResult> result){
DashboardWidget dashboardWidget = hWidgetSearch.get(actualRefreshingKey);
dashboardWidget.setDocuments(result);
dashboardWidget.setHeaderResults(result.size());
newsDocuments += dashboardWidget.getNotViewed();
find(actualSearchRefreshing++);
dashboardWidget.unsetRefreshing();
}
public void onFailure(Throwable caught) {
Main.get().showError("getAllSearchs", caught);
hWidgetSearch.get(actualRefreshingKey).unsetRefreshing();
}
};
/**
* setWidth
*
* @param width
*/
public void setWidth(int width) {
this.columnWidth = width/NUMBER_OF_COLUMNS;
}
/**
* getAllSearchs
*/
public void getUserSearchs(boolean refreshFind) {
this.refreshFind = refreshFind;
ServiceDefTarget endPoint = (ServiceDefTarget) dashboardService;
endPoint.setServiceEntryPoint(RPCService.DashboardService);
dashboardService.getUserSearchs(callbackGetUserSearchs);
}
/**
* refreshAllSearchs
*/
private void find(int value) {
if (keyMap.keySet().size()>value) {
List<String> keySet = new ArrayList<String>(keyMap.keySet());
actualRefreshingKey = keySet.get(value);
if (!firstTime) {
hWidgetSearch.get(actualRefreshingKey).setRefreshing();
}
ServiceDefTarget endPoint = (ServiceDefTarget) dashboardService;
endPoint.setServiceEntryPoint(RPCService.DashboardService);
dashboardService.find(Integer.parseInt(actualRefreshingKey), callbackFind);
} else {
Main.get().mainPanel.bottomPanel.userInfo.setNewsDocuments(newsDocuments);
firstTime = false;
}
}
/**
* Refreshing all searchs
*/
public void refreshAllSearchs(){
newsDocuments = 0;
actualSearchRefreshing = 0;
find(actualSearchRefreshing++);
}
@Override
public void decrementNewDocuments(int value) {
newsDocuments -= value;
Main.get().mainPanel.bottomPanel.userInfo.setNewsDocuments(newsDocuments);
}
/**
* Refreshing language
*/
public void langRefresh() {
for (Iterator<String> it = keyMap.keySet().iterator(); it.hasNext();) {
DashboardWidget dashboardWidget = hWidgetSearch.get(""+it.next());
dashboardWidget.langRefresh();
}
}
}