/** * 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.searchresult; import java.util.HashMap; import java.util.Map; import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.gen2.table.client.FixedWidthFlexTable; import com.google.gwt.gen2.table.client.FixedWidthGrid; import com.google.gwt.gen2.table.client.ScrollTable; import com.google.gwt.gen2.table.client.SelectionGrid; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.Hyperlink; import com.openkm.frontend.client.Main; import com.openkm.frontend.client.bean.GWTDocument; import com.openkm.frontend.client.bean.GWTFolder; import com.openkm.frontend.client.bean.GWTMail; import com.openkm.frontend.client.bean.GWTPermission; import com.openkm.frontend.client.bean.GWTQueryResult; import com.openkm.frontend.client.util.Util; /** * Extends ScrollTable functionalities * * @author jllort * */ public class ExtendedScrollTable extends ScrollTable { // Holds the data rows of the table this is a list of RowData Object public Map<Integer, GWTQueryResult> data = new HashMap<Integer, GWTQueryResult>(); private int mouseX = 0; private int mouseY = 0; private int dataIndexValue = 0; private boolean panelSelected = false; // Indicates if panel is selected private FixedWidthGrid dataTable; private FixedWidthFlexTable headerTable; /** * ExtendedScrollTable */ public ExtendedScrollTable(FixedWidthGrid dataTable, FixedWidthFlexTable headerTable, ScrollTableImages scrollTableImages) { super(dataTable, headerTable, scrollTableImages); this.dataTable = dataTable; this.headerTable = headerTable; dataTable.setSelectionPolicy(SelectionGrid.SelectionPolicy.ONE_ROW); setResizePolicy(ResizePolicy.UNCONSTRAINED); setScrollPolicy(ScrollPolicy.BOTH); dataTable.setColumnSorter(new ExtendedColumnSorter()); // Sets some events DOM.sinkEvents(getDataWrapper(),Event.ONDBLCLICK | Event.ONMOUSEDOWN ); } /* (non-Javadoc) * @see com.google.gwt.user.client.EventListener#onBrowserEvent(com.google.gwt.user.client.Event) */ public void onBrowserEvent(Event event) { boolean headerFired = false; // Controls when event is fired by header // Case targe event is header must disable drag & drop if (headerTable.getEventTargetCell(event)!=null) { headerFired = true; } // Selects the panel setSelectedPanel(true); // When de button mouse is released mouseX = DOM.eventGetClientX(event); mouseY = DOM.eventGetClientY(event); // On double click not sends event to onCellClicked across super.onBrowserEvent(); if (DOM.eventGetType(event) == Event.ONDBLCLICK) { // Disables the event propagation the sequence is: // Two time entry onCellClicked before entry on onBrowserEvent and disbles the // Tree onCellClicked that produces inconsistence error refreshing DOM.eventCancelBubble(event, true); if ((isDocumentSelected() || isAttachmentSelected()) && Main.get().workspaceUserProperties.getWorkspace().getAvailableOption().isDownloadOption()) { Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.downloadDocument(); } } else if (DOM.eventGetType(event) == Event.ONMOUSEDOWN) { switch (DOM.eventGetButton(event)) { case Event.BUTTON_RIGHT: if (!headerFired) { if (isDocumentSelected() || isAttachmentSelected()) { Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.menuPopup.menu.checkMenuOptionPermissions(getDocument()); } else if (isFolderSelected()) { Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.menuPopup.menu.checkMenuOptionPermissions(getFolder()); } else if (isMailSelected()) { Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.menuPopup.menu.checkMenuOptionPermissions(getMail()); } Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.menuPopup.menu.evaluateMenuOptions(); Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.showMenu(); DOM.eventPreventDefault(event); // Prevent to fire event to browser } break; default: break; } } super.onBrowserEvent(event); } /** * Sets the selected panel value * * @param selected The selected panel value */ public void setSelectedPanel(boolean selected) { if (selected){ Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.addStyleName("okm-PanelSelected"); Main.get().mainPanel.search.historySearch.searchSaved.setSelectedPanel(false); Main.get().mainPanel.search.historySearch.userNews.setSelectedPanel(false); } else { Main.get().mainPanel.search.searchBrowser.searchResult.searchCompactResult.removeStyleName("okm-PanelSelected"); } panelSelected = selected; } /** * Is panel selected * * @return The panel selected value */ public boolean isPanelSelected() { return panelSelected; } /** * Gets the X position on mouse click * * @return The x position on mouse click */ public int getMouseX() { return mouseX; } /** * Gets the Y position on mouse click * * @return The y position on mouse click */ public int getMouseY() { return mouseY; } /** * Gets the selected row * * @return The selected row */ public int getSelectedRow() { int selectedRow = -1; if (!dataTable.getSelectedRows().isEmpty()) { selectedRow = ((Integer) dataTable.getSelectedRows().iterator().next()).intValue(); } Log.debug("ExtendedScrollPanel selectedRow:"+selectedRow); return selectedRow; } /** * Resets the values */ public void reset() { mouseX = 0; mouseY = 0; dataIndexValue = 0; // Only resets rows table the header is never reset data = new HashMap<Integer, GWTQueryResult>(); } /** * Adds a document to the panel * * @param doc The doc to add */ public void addRow(GWTQueryResult gwtQueryResult) { if (gwtQueryResult.getDocument()!=null || gwtQueryResult.getAttachment()!=null) { addDocumentRow(gwtQueryResult, new Score(gwtQueryResult.getScore())); } else if (gwtQueryResult.getFolder()!=null) { addFolderRow(gwtQueryResult, new Score(gwtQueryResult.getScore())); } else if (gwtQueryResult.getMail()!=null) { addMailRow(gwtQueryResult, new Score(gwtQueryResult.getScore())); } } /** * Adding document row * * @param gwtQueryResult Query result * @param score Document score */ private void addDocumentRow(GWTQueryResult gwtQueryResult, Score score) { int rows = dataTable.getRowCount(); dataTable.insertRow(rows); GWTDocument doc = new GWTDocument(); if (gwtQueryResult.getDocument()!=null) { doc = gwtQueryResult.getDocument(); } else if (gwtQueryResult.getAttachment()!=null) { doc = gwtQueryResult.getAttachment(); } // Sets folder object data.put(new Integer(dataIndexValue), gwtQueryResult); dataTable.setHTML(rows, 0, score.getHTML()); if(doc.isAttachment()) { dataTable.setHTML(rows, 1, Util.imageItemHTML("img/email_attach.gif")); } else { dataTable.setHTML(rows, 1, " "); } dataTable.setHTML(rows, 1, dataTable.getHTML(rows,1) + Util.mimeImageHTML(doc.getMimeType())); Hyperlink hLink = new Hyperlink(); hLink.setHTML(doc.getName()); hLink.setStyleName("okm-Hyperlink"); // On attachemt case must remove last folder path, because it's internal usage not for visualization if (doc.isAttachment()) { hLink.setTitle(doc.getParent().substring(0, doc.getParent().lastIndexOf("/"))); } else { hLink.setTitle(doc.getParent()); } dataTable.setWidget(rows, 2, hLink); dataTable.setHTML(rows, 3, Util.formatSize(doc.getActualVersion().getSize())); DateTimeFormat dtf = DateTimeFormat.getFormat(Main.i18n("general.date.pattern")); dataTable.setHTML(rows, 4, dtf.format(doc.getLastModified())); dataTable.setHTML(rows, 5, doc.getActualVersion().getAuthor()); dataTable.setHTML(rows, 6, doc.getActualVersion().getName()); dataTable.setHTML(rows, 7, ""+(dataIndexValue++)); // Format dataTable.getCellFormatter().setHorizontalAlignment(rows, 0, HasHorizontalAlignment.ALIGN_LEFT); dataTable.getCellFormatter().setHorizontalAlignment(rows, 1, HasHorizontalAlignment.ALIGN_RIGHT); dataTable.getCellFormatter().setHorizontalAlignment(rows, 2, HasHorizontalAlignment.ALIGN_LEFT); dataTable.getCellFormatter().setHorizontalAlignment(rows, 3, HasHorizontalAlignment.ALIGN_CENTER); dataTable.getCellFormatter().setHorizontalAlignment(rows, 4, HasHorizontalAlignment.ALIGN_CENTER); dataTable.getCellFormatter().setHorizontalAlignment(rows, 5, HasHorizontalAlignment.ALIGN_CENTER); dataTable.getCellFormatter().setHorizontalAlignment(rows, 6, HasHorizontalAlignment.ALIGN_CENTER); dataTable.getCellFormatter().setVisible(rows,7,false); for (int i=0; i<7; i++) { dataTable.getCellFormatter().addStyleName(rows, i, "okm-DisableSelect"); } } /** * Adding folder * * @param gwtQueryResult Query result * @param score The folder score */ private void addFolderRow(GWTQueryResult gwtQueryResult, Score score) { int rows = dataTable.getRowCount(); dataTable.insertRow(rows); GWTFolder folder = gwtQueryResult.getFolder(); // Sets folder object data.put(new Integer(dataIndexValue), gwtQueryResult); dataTable.setHTML(rows, 0, score.getHTML()); // Looks if must change icon on parent if now has no childs and properties with user security atention if ( (folder.getPermissions() & GWTPermission.WRITE) == GWTPermission.WRITE) { if (folder.getHasChilds()) { dataTable.setHTML(rows, 1, Util.imageItemHTML("img/menuitem_childs.gif")); } else { dataTable.setHTML(rows, 1, Util.imageItemHTML("img/menuitem_empty.gif")); } } else { if (folder.getHasChilds()) { dataTable.setHTML(rows, 1, Util.imageItemHTML("img/menuitem_childs_ro.gif")); } else { dataTable.setHTML(rows, 1, Util.imageItemHTML("img/menuitem_empty_ro.gif")); } } Hyperlink hLink = new Hyperlink(); hLink.setHTML(folder.getName()); hLink.setTitle(folder.getParentPath()); hLink.setStyleName("okm-Hyperlink"); dataTable.setWidget(rows, 2, hLink); dataTable.setHTML(rows, 3, " "); DateTimeFormat dtf = DateTimeFormat.getFormat(Main.i18n("general.date.pattern")); dataTable.setHTML(rows, 4, dtf.format(folder.getCreated())); dataTable.setHTML(rows, 5, folder.getAuthor()); dataTable.setHTML(rows, 6, " "); dataTable.setHTML(rows, 7, ""+(dataIndexValue++)); // Format dataTable.getCellFormatter().setHorizontalAlignment(rows, 0, HasHorizontalAlignment.ALIGN_LEFT); dataTable.getCellFormatter().setHorizontalAlignment(rows, 1, HasHorizontalAlignment.ALIGN_RIGHT); dataTable.getCellFormatter().setHorizontalAlignment(rows, 2, HasHorizontalAlignment.ALIGN_LEFT); dataTable.getCellFormatter().setHorizontalAlignment(rows, 3, HasHorizontalAlignment.ALIGN_CENTER); dataTable.getCellFormatter().setHorizontalAlignment(rows, 4, HasHorizontalAlignment.ALIGN_CENTER); dataTable.getCellFormatter().setHorizontalAlignment(rows, 5, HasHorizontalAlignment.ALIGN_CENTER); dataTable.getCellFormatter().setHorizontalAlignment(rows, 6, HasHorizontalAlignment.ALIGN_CENTER); dataTable.getCellFormatter().setVisible(rows,7,false); for (int i=0; i<7; i++) { dataTable.getCellFormatter().addStyleName(rows, i, "okm-DisableSelect"); } } /** * Adding mail * * @param gwtQueryResult Query result * @param score The mail score */ private void addMailRow(GWTQueryResult gwtQueryResult, Score score) { int rows = dataTable.getRowCount(); dataTable.insertRow(rows); GWTMail mail = gwtQueryResult.getMail(); // Sets folder object data.put(new Integer(dataIndexValue), gwtQueryResult); dataTable.setHTML(rows, 0, score.getHTML()); if (mail.getAttachments().size()>0) { dataTable.setHTML(rows, 1, Util.imageItemHTML("img/email_attach.gif")); } else { dataTable.setHTML(rows, 1, Util.imageItemHTML("img/email.gif")); } Hyperlink hLink = new Hyperlink(); hLink.setHTML(mail.getSubject()); hLink.setTitle(mail.getParent()); hLink.setStyleName("okm-Hyperlink"); dataTable.setWidget(rows, 2, hLink); dataTable.setHTML(rows, 3, Util.formatSize(mail.getSize())); DateTimeFormat dtf = DateTimeFormat.getFormat(Main.i18n("general.date.pattern")); dataTable.setHTML(rows, 4, dtf.format(mail.getReceivedDate())); dataTable.setHTML(rows, 5, mail.getFrom()); dataTable.setHTML(rows, 6, " "); dataTable.setHTML(rows, 7, ""+(dataIndexValue++)); // Format dataTable.getCellFormatter().setHorizontalAlignment(rows, 0, HasHorizontalAlignment.ALIGN_LEFT); dataTable.getCellFormatter().setHorizontalAlignment(rows, 1, HasHorizontalAlignment.ALIGN_RIGHT); dataTable.getCellFormatter().setHorizontalAlignment(rows, 2, HasHorizontalAlignment.ALIGN_LEFT); dataTable.getCellFormatter().setHorizontalAlignment(rows, 3, HasHorizontalAlignment.ALIGN_CENTER); dataTable.getCellFormatter().setHorizontalAlignment(rows, 4, HasHorizontalAlignment.ALIGN_CENTER); dataTable.getCellFormatter().setHorizontalAlignment(rows, 5, HasHorizontalAlignment.ALIGN_CENTER); dataTable.getCellFormatter().setHorizontalAlignment(rows, 6, HasHorizontalAlignment.ALIGN_CENTER); dataTable.getCellFormatter().setVisible(rows,7,false); for (int i=0; i<7; i++) { dataTable.getCellFormatter().addStyleName(rows, i, "okm-DisableSelect"); } } /** * Sets the selected row * * @param row The row number */ public void setSelectedRow(int row) { Log.debug("ExtendedScrollPanel setSelectedRow:"+row); dataTable.selectRow(row,true); } /** * Gets a actual document object row * * @return */ public GWTDocument getDocument() { if (isDocumentSelected()) { return ((GWTQueryResult) data.get(Integer.parseInt(dataTable.getText(getSelectedRow(),7)))).getDocument(); } else { return null; } } /** * Gets a actual attachment object row * * @return */ public GWTDocument getAttachment() { if (isAttachmentSelected()) { return ((GWTQueryResult) data.get(Integer.parseInt(dataTable.getText(getSelectedRow(),7)))).getAttachment(); } else { return null; } } /** * Gets a actual document object row * * @return */ public GWTFolder getFolder() { if (isFolderSelected()) { return ((GWTQueryResult) data.get(Integer.parseInt(dataTable.getText(getSelectedRow(),7)))).getFolder(); } else { return null; } } /** * Gets a actual mail object row * * @return */ public GWTMail getMail() { if (isMailSelected()) { return ((GWTQueryResult) data.get(Integer.parseInt(dataTable.getText(getSelectedRow(),7)))).getMail(); } else { return null; } } /** * Return true or false if actual selected row is document * * @return True or False if actual row is document type */ public boolean isDocumentSelected() { if (!dataTable.getSelectedRows().isEmpty()) { if (((GWTQueryResult) data.get(Integer.parseInt(dataTable.getText(getSelectedRow(),7)))).getDocument()!=null ) { return true; } else { return false; } } else { return false; } } /** * Return true or false if actual selected row is attachment * * @return True or False if actual row is attachment type */ public boolean isAttachmentSelected() { if (!dataTable.getSelectedRows().isEmpty()) { if (((GWTQueryResult) data.get(Integer.parseInt(dataTable.getText(getSelectedRow(),7)))).getAttachment()!=null ) { return true; } else { return false; } } else { return false; } } /** * Return true or false if actual selected row is mail * * @return True or False if actual row is mail type */ public boolean isFolderSelected() { if (!dataTable.getSelectedRows().isEmpty()) { if (((GWTQueryResult) data.get(Integer.parseInt(dataTable.getText(getSelectedRow(),7)))).getFolder()!=null ) { return true; } else { return false; } } else { return false; } } /** * Return true or false if actual selected row is mail * * @return True or False if actual row is mail type */ public boolean isMailSelected() { if (!dataTable.getSelectedRows().isEmpty()) { if (((GWTQueryResult) data.get(Integer.parseInt(dataTable.getText(getSelectedRow(),7)))).getMail()!=null ) { return true; } else { return false; } } else { return false; } } }