/*
* File : $Source$
* Date : $Date$
* Version: $Revision$
*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (C) 2002 - 2009 Alkacon Software (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* For further information about Alkacon Software, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.alkacon.vie.client.widgets;
import com.alkacon.vie.client.Entity;
import com.alkacon.vie.client.I_EntityArrayCallback;
import com.alkacon.vie.client.I_EntityCallback;
import com.alkacon.vie.client.Vie;
import com.alkacon.vie.shared.I_Entity;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
/**
* Implements an easy version of editable widget.<p>
*/
public final class HalloWidget {
/**
* Hide.<p>
*/
private HalloWidget() {
// noop
}
/**
* Makes it editable.<p>
*/
public static void makeEditable() {
init();
final Vie vie = Vie.getInstance();
vie.useRdfaService();
vie.bindFunctionToEntities("add", new I_EntityCallback() {
public void execute(Entity entity) {
editable(entity, vie);
entity.addValueChangeHandler(new ValueChangeHandler<I_Entity>() {
public void onValueChange(ValueChangeEvent<I_Entity> event) {
save(event.getValue(), vie);
}
});
}
});
vie.load("rdfa", "body [about]", new I_EntityArrayCallback() {
public void execute(JsArray<Entity> entities) {
// noop
}
});
}
/**
* Makes the entity editable.<p>
*
* @param entity the entity to make editable
* @param v the vie instance
*/
protected static native void editable(I_Entity entity, Vie v) /*-{
$wnd
.jQuery('[about="' + entity.getSubjectUri() + '"] [property]')
.each(
function() {
if (v.services.rdfa.getElementSubject(this) !== entity.id) {
return;
}
var editableElement = $wnd.jQuery(this);
var property = v.services.rdfa
.getElementPredicate(this);
// Note: you'll also want to configure Hallo to include some plugins
editableElement.hallo({
plugins : {
'halloformat' : {},
'halloheadings' : {}
},
editable : true
});
editableElement.hallo();
editableElement.bind('hallomodified', function(
event, data) {
var content = data.content;
if (content !== entity.get(property)) {
var changedProps = {};
changedProps[property] = content;
entity.set(changedProps);
}
});
})
}-*/;
/**
* Initialize.<p>
*/
protected static native void init() /*-{
$wnd.changedEntities = [];
$wnd.saveButton = null;
}-*/;
/**
* Makes the entity saveable.<p>
*
* @param entity the entity to make saveable
* @param v the vie instance
*/
protected static native void save(I_Entity entity, Vie v) /*-{
$wnd.console.log(entity.previousAttributes(), entity.attributes);
if ($wnd.changedEntities.indexOf(entity) === -1) {
$wnd.changedEntities.push(entity);
}
if ($wnd.saveButton) {
return;
}
$wnd.saveButton = $wnd.jQuery('<button>Save</button>');
$wnd.saveButton.click(function() {
alert('We would save ' + $wnd.changedEntities.length
+ ' changed entities');
$wnd._.each($wnd.changedEntities, function(entity) {
//entity.save();
});
$wnd.changedEntities = [];
});
$wnd.jQuery('body').append($wnd.saveButton);
}-*/;
}