package org.activityinfo.ui.client.page.entry.column;
/*
* #%L
* ActivityInfo Server
* %%
* Copyright (C) 2009 - 2013 UNICEF
* %%
* 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 3 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, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.google.gwt.user.client.rpc.AsyncCallback;
import org.activityinfo.legacy.client.Dispatcher;
import org.activityinfo.legacy.shared.command.DimensionType;
import org.activityinfo.legacy.shared.command.Filter;
import org.activityinfo.legacy.shared.command.GetActivityForm;
import org.activityinfo.legacy.shared.command.GetSchema;
import org.activityinfo.legacy.shared.model.ActivityFormDTO;
import org.activityinfo.legacy.shared.model.SchemaDTO;
import org.activityinfo.legacy.shared.model.UserDatabaseDTO;
import org.activityinfo.ui.client.page.entry.grouping.AdminGroupingModel;
import org.activityinfo.ui.client.page.entry.grouping.GroupingModel;
import org.activityinfo.ui.client.page.entry.grouping.NullGroupingModel;
import org.activityinfo.ui.client.page.entry.grouping.TimeGroupingModel;
public class DefaultColumnModelProvider implements ColumnModelProvider {
private final Dispatcher dispatcher;
public DefaultColumnModelProvider(Dispatcher dispatcher) {
super();
this.dispatcher = dispatcher;
}
@Override
public void fetchColumnModels(final Filter filter,
final GroupingModel grouping,
final AsyncCallback<ColumnModel> callback) {
if (filter.isDimensionRestrictedToSingleCategory(DimensionType.Activity)) {
final int activityId = filter.getRestrictedCategory(DimensionType.Activity);
dispatcher.execute(new GetActivityForm(activityId)).then(new AsyncCallback<ActivityFormDTO>() {
@Override
public void onFailure(Throwable caught) {
callback.onFailure(caught);
}
@Override
public void onSuccess(ActivityFormDTO result) {
callback.onSuccess(forSingleActivity(grouping, result));
}
});
} else {
dispatcher.execute(new GetSchema()).then(new AsyncCallback<SchemaDTO>() {
@Override
public void onFailure(Throwable caught) {
callback.onFailure(caught);
}
@Override
public void onSuccess(SchemaDTO result) {
if (filter.isDimensionRestrictedToSingleCategory(DimensionType.Database)) {
UserDatabaseDTO singleDatabase = result.getDatabaseById(filter.getRestrictedCategory(DimensionType.Database));
callback.onSuccess(forSingleDatabase(grouping, singleDatabase));
} else {
callback.onSuccess(forMultipleDatabases(grouping, result));
}
}
});
}
}
/**
* Builds
*
* @param activity
*/
private ColumnModel forSingleActivity(GroupingModel grouping, ActivityFormDTO activity) {
if (grouping == NullGroupingModel.INSTANCE) {
return new ColumnModelBuilder().addMapColumn()
.maybeAddLockColumn(activity)
.maybeAddDateColumn(activity)
.maybeAddPartnerColumn(activity)
.maybeAddProjectColumn(activity)
.maybeAddKeyIndicatorColumns(activity)
.maybeAddTwoLineLocationColumn(activity)
.addAdminLevelColumns(activity)
.build();
} else if (grouping instanceof AdminGroupingModel) {
return new ColumnModelBuilder().maybeAddLockColumn(activity)
.addTreeNameColumn()
.maybeAddDateColumn(activity)
.maybeAddPartnerColumn(activity)
.maybeAddProjectColumn(activity)
.build();
} else if (grouping instanceof TimeGroupingModel) {
return new ColumnModelBuilder().maybeAddLockColumn(activity)
.addTreeNameColumn()
.maybeAddDateColumn(activity)
.maybeAddPartnerColumn(activity)
.maybeAddProjectColumn(activity)
.maybeAddSingleLineLocationColumn(activity)
.addAdminLevelColumns(activity)
.build();
} else {
throw new IllegalArgumentException(grouping.toString());
}
}
private ColumnModel forSingleDatabase(GroupingModel grouping, UserDatabaseDTO database) {
if (grouping == NullGroupingModel.INSTANCE) {
return new ColumnModelBuilder().addMapColumn()
.addActivityColumn(database)
.addLocationColumn()
.maybeAddPartnerColumn(database)
.maybeAddProjectColumn(database)
.addAdminLevelColumns(database)
.build();
} else if (grouping instanceof AdminGroupingModel) {
return new ColumnModelBuilder().addTreeNameColumn()
.addActivityColumn(database)
.maybeAddPartnerColumn(database)
.maybeAddProjectColumn(database)
.build();
} else if (grouping instanceof TimeGroupingModel) {
return new ColumnModelBuilder().addTreeNameColumn()
.addActivityColumn(database)
.maybeAddPartnerColumn(database)
.maybeAddProjectColumn(database)
.addLocationColumn()
.addAdminLevelColumns(database)
.build();
} else {
throw new IllegalArgumentException(grouping.toString());
}
}
private ColumnModel forMultipleDatabases(GroupingModel grouping, SchemaDTO schema) {
if (grouping == NullGroupingModel.INSTANCE) {
return new ColumnModelBuilder().addMapColumn()
.addDatabaseColumn(schema)
.addActivityColumn(schema)
.addLocationColumn()
.addPartnerColumn()
.build();
} else if (grouping instanceof AdminGroupingModel) {
return new ColumnModelBuilder().addTreeNameColumn().addPartnerColumn().build();
} else if (grouping instanceof TimeGroupingModel) {
return new ColumnModelBuilder().addTreeNameColumn().addPartnerColumn().addLocationColumn().build();
} else {
throw new IllegalArgumentException(grouping.toString());
}
}
}