/*
* Copyright 2009 Peter Karich.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* under the License.
*/
package de.timefinder.core.ui.form;
import de.timefinder.data.DataPool;
import de.timefinder.data.Event;
import de.timefinder.data.Feature;
import de.timefinder.data.Location;
import de.timefinder.data.Person;
import de.timefinder.data.access.Dao;
import de.timefinder.core.ui.metadata.PoolDescriptor;
import de.timefinder.core.ui.planner.HtmlPlannerComponent;
import de.timefinder.data.Resource;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.springframework.binding.form.HierarchicalFormModel;
import org.springframework.binding.value.ValueModel;
import org.springframework.binding.value.support.ObservableList;
import org.springframework.binding.value.support.ValueHolder;
import org.springframework.richclient.command.AbstractCommand;
import org.springframework.richclient.command.CommandGroup;
import org.springframework.richclient.components.ShuttleList;
import org.springframework.richclient.form.AbstractDetailForm;
import org.springframework.richclient.form.binding.swing.SwingBindingFactory;
import org.springframework.richclient.form.builder.TableFormBuilder;
/**
* @see how to set up a shuttle list:
* http://opensource.atlassian.com/confluence/spring/display/RCP/Contributions#Contributions-FrameworkExtensions
* @author Peter Karich
*/
public class EventMasterDetailView extends TimeFinderMasterDetailView<Event> {
@Override
public CollectionMasterDetailForm<Event> createForm(Dao<Event> dao, String[] columns) {
final DataPool pool = ((PoolDescriptor) getDescriptor()).getDataPool();
return new CollectionMasterDetailForm<Event>(dao, columns) {
@Override
protected void printAction(Iterator<Event> iter) {
final List<Event> events = new ArrayList<Event>();
while (iter.hasNext()) {
events.add(iter.next());
}
Iterator<? extends Resource> resIter = Arrays.asList(new Resource() {
@Override
public Collection<Event> getEvents() {
return events;
}
@Override
public void addEvent(Event ev, boolean reverseAdd) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean removeEvent(Event ev, boolean reverseRemove) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public String getName() {
return "Master Plan";
}
@Override
public void setName(String name) {
throw new UnsupportedOperationException("Not supported yet.");
}
}).iterator();
HtmlPlannerComponent.printResources(resIter, settings);
}
private EventForm objForm;
@Override
protected AbstractDetailForm createDetailForm(HierarchicalFormModel parentFormModel,
ValueModel valueHolder, ObservableList masterList) {
objForm = new EventForm(parentFormModel,
"eventsDetails", valueHolder, masterList) {
@Override
protected void addTabs() {
SwingBindingFactory factory = (SwingBindingFactory) getBindingFactory();
getFormBuilder().add(factory.createBoundComboBox(
"location", pool.getDao(Location.class).getAll(), "name"));
TableFormBuilder builder = createTab(getMessage("persons.label"));
final Dao<Person> personDao = pool.getDao(Person.class);
/****************************************************************
* WARNING: it is important to wrap the (person) collection in
* another one (here ArrayList). Otherwise the changes
* to the dao will have direct effect to the value in ValueHolder
* and newValue.equals(oldValue) == true for every change!
****************************************************************/
final ValueHolder personHolder = new ValueHolder(new ArrayList<Person>(personDao.getAll()));
//1. persons => Event.set and getPersons are necessary
//2. personDao.getAll() => all available persons
//3. name => prints the name as one list item
ShuttleList sl = (ShuttleList) builder.add(
factory.createBoundShuttleList("persons",
personHolder, "name"))[1];
sl.setVisibleRowCount(10);
TableFormBuilder fBuilder = createTab(getMessage("features.label"));
final Dao<Feature> featureDao = pool.getDao(Feature.class);
final ValueHolder featureHolder = new ValueHolder(new ArrayList<Feature>(featureDao.getAll()));
sl = (ShuttleList) fBuilder.add(factory.createBoundShuttleList("features",
featureHolder, null))[1];
sl.setVisibleRowCount(10);
// now notify ShuttleList when collection change to update the JList
personDao.addListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (Dao.ATTACH.equals(evt.getPropertyName())
|| Dao.ATTACH_ALL.equals(evt.getPropertyName())
|| Dao.DETACH.equals(evt.getPropertyName())
|| Dao.DETACH_ALL.equals(evt.getPropertyName())) {
personHolder.setValue(new ArrayList<Person>(personDao.getAll()));
}
}
});
featureDao.addListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (Dao.ATTACH.equals(evt.getPropertyName())
|| Dao.ATTACH_ALL.equals(evt.getPropertyName())
|| Dao.DETACH.equals(evt.getPropertyName())
|| Dao.DETACH_ALL.equals(evt.getPropertyName())) {
featureHolder.setValue(new ArrayList<Feature>(featureDao.getAll()));
}
}
});
}
};
objForm.setDao(dao);
objForm.setSettings(settings);
return objForm;
}
// @Override
// protected void updateControlsForState() {
// super.updateControlsForState();
//// unassignButton.setEnabled(getDetailForm().getSelectedIndex() >= 0);
// // Hack: in AbstractDaoForm we make the protected method public
// unassignButton.setEnabled(((AbstractDaoForm) getDetailForm()).getEditingFormObjectIndex() >= 0);
// }
//
// public AbstractCommand getUnassignCommand() {
// if (unassignCommand == null) {
// unassignCommand = new ActionCommand("unassignCommand") {
//
// @Override
// protected void doExecuteCommand() {
// if (getDetailForm().getSelectedIndex() >= 0) {
// Event ev = (Event) ((ObservableEventList) getFormObject()).get(getDetailForm().getSelectedIndex());
// ev.setAssigned(false);
// // here start=-1 will be overridden!!
// getDetailForm().commit();
// }
// }
// };
//// unassignCommand.setSecurityControllerId(getUnassignSecurityControllerId());
//// attachFormGuard(unassignCommand, FormGuard.ON_NOERRORS);
// return (ActionCommand) getCommandConfigurer().configure(unassignCommand);
// }
// return unassignCommand;
// }
//
// @Override
// protected CommandGroup getCommandGroup() {
// if (newCommandGroup == null) {
// newCommandGroup = CommandGroup.createCommandGroup(null,
// new AbstractCommand[]{getUnassignCommand(), getDeleteCommand(),
// getNewFormObjectCommand()});
//
// }
// return newCommandGroup;
// }
};
}
}