/**
* 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.properties;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
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.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.rpc.AsyncCallback;
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.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.RichTextArea;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
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.GWTNote;
import com.openkm.frontend.client.extension.event.HasDocumentEvent;
import com.openkm.frontend.client.extension.event.HasFolderEvent;
import com.openkm.frontend.client.service.OKMNoteService;
import com.openkm.frontend.client.service.OKMNoteServiceAsync;
import com.openkm.frontend.client.util.OKMBundleResources;
import com.openkm.frontend.client.widget.richtext.RichTextToolbar;
/**
* Notes
*
* @author jllort
*
*/
public class Notes extends Composite {
private final OKMNoteServiceAsync noteService = (OKMNoteServiceAsync) GWT.create(OKMNoteService.class);
private FlexTable tableNotes;
private GWTDocument document;
private GWTFolder folder;
private Button add;
private Button update;
private Button cancel;
private ScrollPanel scrollPanel;
private RichTextArea richTextArea;
private RichTextToolbar richTextToolbar;
private VerticalPanel newNotePanel;
private HTML addNote;
private Grid gridRichText;
boolean visibleButtons = true;
boolean addNoteOption = false;
boolean isEditingNote = false;
String editedNotePath = "";
int editedNoteRow = 0;
public Notes () {
tableNotes = new FlexTable();
scrollPanel = new ScrollPanel(tableNotes);
newNotePanel = new VerticalPanel();
addNote = new HTML("<b>" + Main.i18n("document.add.note") + "</b>");
richTextArea = new RichTextArea();
richTextArea.setSize("100%", "14em");
richTextToolbar = new RichTextToolbar(richTextArea);
// richTextToolbar.setWidth("100%");
gridRichText = new Grid(2, 1);
gridRichText.setStyleName("RichTextToolbar");
gridRichText.addStyleName("okm-Input");
gridRichText.setWidget(0, 0, richTextToolbar);
gridRichText.setWidget(1, 0, richTextArea);
add = new Button(Main.i18n("button.add"), new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
addNote();
}
});
update = new Button(Main.i18n("button.update"), new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
setNote(editedNotePath, getTextNote(), editedNoteRow);
}
});
cancel = new Button(Main.i18n("button.cancel"), new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
reset();
}
});
update.setVisible(false);
cancel.setVisible(false);
HTML space = new HTML("");
newNotePanel.add(space);
newNotePanel.add(addNote);
newNotePanel.add(gridRichText);
HTML space2 = new HTML("");
newNotePanel.add(space2);
HorizontalPanel hPanel = new HorizontalPanel();
hPanel.add(add);
hPanel.add(new HTML(" "));
hPanel.add(update);
hPanel.add(new HTML(" "));
hPanel.add(cancel);
newNotePanel.add(hPanel);
newNotePanel.setCellHeight(space, "40px");
newNotePanel.setCellHeight(space2, "10px");
newNotePanel.setCellHorizontalAlignment(addNote, HasAlignment.ALIGN_CENTER);
newNotePanel.setCellHorizontalAlignment(gridRichText, HasAlignment.ALIGN_CENTER);
newNotePanel.setCellHorizontalAlignment(hPanel, HasAlignment.ALIGN_CENTER);
add.setStyleName("okm-Button");
update.setStyleName("okm-Button");
cancel.setStyleName("okm-Button");
tableNotes.setWidth("100%");
initWidget(scrollPanel);
}
/**
* Sets the document values
*
* @param doc The document object
*/
public void set(GWTDocument doc) {
reset();
this.document = doc;
richTextArea.setText("");
while (tableNotes.getRowCount()>0) {
tableNotes.removeRow(0);
}
for (Iterator<GWTNote> it = doc.getNotes().iterator(); it.hasNext();) {
writeNote(it.next());
}
writeAddNote();
}
/**
* Sets the folder values
*
* @param doc The folder object
*/
public void set(GWTFolder folder) {
reset();
this.folder = folder;
richTextArea.setText("");
while (tableNotes.getRowCount()>0) {
tableNotes.removeRow(0);
}
for (Iterator<GWTNote> it = folder.getNotes().iterator(); it.hasNext();) {
writeNote(it.next());
}
writeAddNote();
}
/**
* writeAddNote
*/
private void writeAddNote() {
int row = tableNotes.getRowCount();
tableNotes.setWidget(row, 0, newNotePanel);
tableNotes.getFlexCellFormatter().setColSpan(row, 0, 2);
tableNotes.getCellFormatter().setHorizontalAlignment(row, 0, HasAlignment.ALIGN_CENTER);
}
/**
* Writes the note
*
* @param note
*/
private void writeNote(final GWTNote note) {
int row = tableNotes.getRowCount();
tableNotes.setHTML(row, 0, "<b>" + note.getUser() + "</b>");
Image editNote = new Image(OKMBundleResources.INSTANCE.noteEdit());
Image deleteNote = new Image(OKMBundleResources.INSTANCE.noteDelete());
editNote.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
reset();
isEditingNote = true;
add.setVisible(false);
update.setVisible(true);
cancel.setVisible(true);
editedNoteRow = tableNotes.getCellForEvent(event).getRowIndex() + 2; // The text row is + 2
editedNotePath = note.getPath();
setTextNoteToEditor(tableNotes.getHTML(editedNoteRow, 0));
}
});
deleteNote.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
removeNote(note.getPath(), tableNotes.getCellForEvent(event).getRowIndex());
}
});
editNote.setStyleName("okm-Hyperlink");
deleteNote.setStyleName("okm-Hyperlink");
DateTimeFormat dtf = DateTimeFormat.getFormat(Main.i18n("general.date.pattern"));
HTML space = new HTML("");
HTML space2 = new HTML("");
HTML date = new HTML(dtf.format(note.getDate()));
HorizontalPanel hPanel = new HorizontalPanel();
hPanel.add(editNote);
hPanel.add(space);
hPanel.add(deleteNote);
hPanel.add(space2);
hPanel.add(date);
hPanel.setCellWidth(space, "5");
hPanel.setCellWidth(space2, "5");
if (note.getUser().equals(Main.get().workspaceUserProperties.getUser())) {
if (visibleButtons || addNoteOption) {
editNote.setVisible(true);
deleteNote.setVisible(true);
} else {
editNote.setVisible(false);
deleteNote.setVisible(false);
}
} else {
editNote.setVisible(false);
deleteNote.setVisible(false);
}
tableNotes.setWidget(row, 1, hPanel);
tableNotes.getCellFormatter().setHorizontalAlignment(row, 1, HasAlignment.ALIGN_RIGHT);
tableNotes.getRowFormatter().setStyleName(row, "okm-Notes-Title");
tableNotes.getCellFormatter().setHeight(row, 1, "30");
tableNotes.getCellFormatter().setVerticalAlignment(row, 0, HasAlignment.ALIGN_BOTTOM);
tableNotes.getCellFormatter().setVerticalAlignment(row, 1, HasAlignment.ALIGN_BOTTOM);
row++;
tableNotes.setHTML(row, 0, "");
tableNotes.getCellFormatter().setHeight(row, 0, "6");
tableNotes.getRowFormatter().setStyleName(row, "okm-Notes-Line");
tableNotes.getFlexCellFormatter().setColSpan(row, 0, 2);
row++;
tableNotes.setHTML(row, 0, note.getText());
tableNotes.getFlexCellFormatter().setColSpan(row, 0, 2);
}
/**
* Lang refresh
*/
public void langRefresh() {
add.setHTML(Main.i18n("button.add"));
update.setHTML(Main.i18n("button.update"));
cancel.setHTML(Main.i18n("button.cancel"));
addNote.setHTML("<b>" + Main.i18n("document.add.note") + "</b>");
richTextToolbar.langRefresh();
}
/**
* Sets visibility to buttons ( true / false )
*
* @param visible The visible value
*/
public void setVisibleButtons(boolean visible) {
visibleButtons = visible;
add.setVisible(visible);
addNote.setVisible(visible);
gridRichText.setVisible(visible);
}
/**
* Sets the visible add note or not
*
* @param visible The visible value
*/
public void setVisibleAddNote(boolean visible) {
addNoteOption = visible && visibleButtons;
add.setVisible(addNoteOption);
addNote.setVisible(addNoteOption);
gridRichText.setVisible(addNoteOption);
}
/**
* Callback addNote
*/
final AsyncCallback<GWTNote> callbackAddNote = new AsyncCallback<GWTNote>() {
public void onSuccess(GWTNote result) {
tableNotes.removeRow(tableNotes.getRowCount()-1); // Deletes last row = addComment
writeNote(result);
writeAddNote();
reset();
if (document!=null) {
document.getNotes().add(result);
// If is added first note must adding some icon on filebrowser
if (!document.isHasNotes()) {
Main.get().mainPanel.desktop.browser.fileBrowser.addNoteIconToSelectedRow();
document.setHasNotes(true);
}
Main.get().mainPanel.desktop.browser.tabMultiple.tabDocument.fireEvent(HasDocumentEvent.NOTE_ADDED);
} else if (folder!=null) {
folder.getNotes().add(result);
// If is added first note must adding some icon on filebrowser
if (!folder.isHasNotes() && !Main.get().activeFolderTree.isPanelSelected()) {
Main.get().mainPanel.desktop.browser.fileBrowser.addNoteIconToSelectedRow();
folder.setHasNotes(true);
}
Main.get().mainPanel.desktop.browser.tabMultiple.tabFolder.fireEvent(HasFolderEvent.NOTE_ADDED);
}
}
public void onFailure(Throwable caught) {
Main.get().showError("addNote", caught);
}
};
/**
* addNote
*/
private void addNote() {
String path = "";
if (document!=null) {
path = document.getPath();
} else if (folder!=null) {
path = folder.getPath();
}
noteService.add(path, getTextNote(), callbackAddNote);
}
/**
* getTextNote
*
* @return
*/
private String getTextNote() {
return richTextArea.getHTML();
}
/**
* setTextNoteToEditor
*
* @param text
*/
private void setTextNoteToEditor(String text) {
richTextArea.setHTML(text);
}
/**
* reset
*/
private void reset() {
isEditingNote = false;
editedNotePath = "";
editedNoteRow = 0;
richTextArea.setText("");
add.setHTML(Main.i18n("button.add"));
if (visibleButtons) {
add.setVisible(true);
}
update.setVisible(false);
cancel.setVisible(false);
}
/**
* removeNote
*
* @param notePath
*/
private void removeNote(final String notePath, final int row) {
noteService.remove(notePath, new AsyncCallback<Object>() {
@Override
public void onSuccess(Object result) {
tableNotes.removeRow(row); // row + 0
tableNotes.removeRow(row); // row + 1;
tableNotes.removeRow(row); // row + 2
List<GWTNote> notes = new ArrayList<GWTNote>();
if (document!=null) {
notes = document.getNotes();
} else if (folder!=null) {
notes = folder.getNotes();
}
for (Iterator<GWTNote> it = notes.iterator(); it.hasNext(); ) {
GWTNote note = it.next();
if (note.getPath().equals(notePath)) {
notes.remove(note);
break;
}
}
if (document!=null) {
if (notes.isEmpty()) {
Main.get().mainPanel.desktop.browser.fileBrowser.deleteNoteIconToSelectedRow();
document.setHasNotes(false);
}
} else if (folder!=null) {
if (notes.isEmpty()) {
Main.get().mainPanel.desktop.browser.fileBrowser.deleteNoteIconToSelectedRow();
folder.setHasNotes(false);
}
}
}
@Override
public void onFailure(Throwable caught) {
Main.get().showError("removeNote", caught);
}
});
}
/**
* setNote
*
* @param notePath
* @param text
* @param row
*/
private void setNote(String notePath, final String text, final int row) {
noteService.set(notePath, text, new AsyncCallback<Object>() {
@Override
public void onSuccess(Object result) {
tableNotes.setHTML(row, 0, text);
List<GWTNote> notes = new ArrayList<GWTNote>();
if (document!=null) {
notes = document.getNotes();
} else if (folder!=null) {
notes = folder.getNotes();
}
for (Iterator<GWTNote> it = notes.iterator(); it.hasNext(); ) {
GWTNote note = it.next();
if (note.getPath().equals(editedNotePath)) {
note.setText(text);
break;
}
}
reset();
}
@Override
public void onFailure(Throwable caught) {
Main.get().showError("setNote", caught);
}
});
}
/**
* getNotes
*
* @return
*/
public Collection<GWTNote> getNotes() {
if (document!=null) {
return document.getNotes();
} else if (folder!=null) {
return folder.getNotes();
} else {
return null;
}
}
}