/**
*
* Copyright
* 2009-2015 Jayway Products AB
* 2016-2017 Föreningen Sambruk
*
* Licensed under AGPL, Version 3.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.gnu.org/licenses/agpl.txt
*
* 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.
*/
package se.streamsource.streamflow.client.util;
import ca.odell.glazedlists.EventList;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.injection.scope.Uses;
import org.qi4j.api.structure.Module;
import org.qi4j.api.util.Iterables;
import se.streamsource.dci.value.link.LinkValue;
import se.streamsource.streamflow.client.ResourceModel;
import se.streamsource.streamflow.client.ui.administration.AdministrationResources;
import se.streamsource.streamflow.client.ui.administration.FormOnRemoveView;
import se.streamsource.streamflow.client.ui.administration.casesettings.CaseAccessDefaultsView;
import se.streamsource.streamflow.client.ui.administration.casesettings.CaseArchivalSettingView;
import se.streamsource.streamflow.client.ui.administration.casesettings.CaseDefaultDaysToCompleteView;
import se.streamsource.streamflow.client.ui.administration.casesettings.PriorityOnCaseView;
import se.streamsource.streamflow.client.ui.administration.casesettings.FormOnCloseView;
import se.streamsource.streamflow.client.ui.administration.casetypes.CaseTypeDetailView;
import se.streamsource.streamflow.client.ui.administration.organisationsettings.MailRestrictionsView;
import se.streamsource.streamflow.client.ui.administration.projectsettings.CaseDueOnNotificationView;
import se.streamsource.streamflow.client.ui.administration.projectsettings.RequiresCaseTypeView;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.*;
import java.util.LinkedHashMap;
import java.util.Map;
import static se.streamsource.dci.value.link.Links.*;
import static se.streamsource.streamflow.client.util.i18n.*;
/**
* Show settings for a REST resource, with each part as its own panel with a separator. To determine panels, do a query
* to the resources directory URL ("/") to get a ResourceValue. Then iterate through the registered views and check if
* they are in ResourceValue.resources(). By using xzm
* the order of the registered views we ensure that the UI order of the tabs is always the same, regardless of the order
* returned from the server.
*/
public class SettingsResourceView
extends JPanel
{
private static final Map<String, Class<? extends JComponent>> views = new LinkedHashMap<String, Class<? extends JComponent>>();
private static final Map<String, Enum> settingsNames = new LinkedHashMap<String, Enum>();
static
{
addSettings("caseaccessdefaults", AdministrationResources.caseaccessdefaults_separator, CaseAccessDefaultsView.class);
addSettings("defaultdaystocomplete", AdministrationResources.default_days_to_complete_separator, CaseDefaultDaysToCompleteView.class);
addSettings("dueonnotification", AdministrationResources.dueon_notification_separator, CaseDueOnNotificationView.class);
addSettings("requirescasetype", AdministrationResources.requires_casetype_seperator, RequiresCaseTypeView.class);
addSettings( "casetypedetail", AdministrationResources.detail_separator, CaseTypeDetailView.class);
addSettings("archival", AdministrationResources.archival_settings_separator, CaseArchivalSettingView.class);
addSettings( "priorityoncase", AdministrationResources.casepriority_separator, PriorityOnCaseView.class );
addSettings( "formonclose", AdministrationResources.formonclose_separator, FormOnCloseView.class );
addSettings( "restrictions", AdministrationResources.restrictions_settings_separator, CaseAccessDefaultsView.class);
addSettings( "mailrestrictions", AdministrationResources.mailrestrictions_separator, MailRestrictionsView.class);
addSettings( "mailrestrictions", AdministrationResources.mailrestrictions_separator, MailRestrictionsView.class);
addSettings( "formondelete", AdministrationResources.formondelete_separator, FormOnRemoveView.class );
}
private static void addSettings(String name, Enum tabName, Class<? extends JComponent> viewClass)
{
settingsNames.put( name, tabName );
views.put( name, viewClass );
}
public SettingsResourceView(@Uses ResourceModel model, @Structure Module module)
{
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
model.refresh();
EventList<LinkValue> resources = model.getResources();
for (Map.Entry<String, Class<? extends JComponent>> stringClassEntry : views.entrySet())
{
LinkValue linkedResource = Iterables.first(Iterables.filter(withRel(stringClassEntry.getKey()), resources));
if (linkedResource != null)
{
String separatorText = text( settingsNames.get( stringClassEntry.getKey() ) );
Class<? extends JComponent> tabClass = stringClassEntry.getValue();
try
{
Object resourceModel = model.newResourceModel(linkedResource);
JLabel jLabel = new JLabel(separatorText, JLabel.LEFT);
jLabel.setFont(jLabel.getFont().deriveFont(Font.BOLD));
jLabel.setAlignmentX(JComponent.LEFT_ALIGNMENT);
add(jLabel);
JComponent view = module.objectBuilderFactory().newObjectBuilder(tabClass).use(resourceModel).newInstance();
view.setAlignmentX(JComponent.LEFT_ALIGNMENT);
view.setBorder(BorderFactory.createEmptyBorder(0,0,20,0));
//view.setBorder( BorderFactory.createLineBorder(Color.RED, 3));
add(view);
} catch (Exception e)
{
e.printStackTrace();
}
}
}
add(Box.createVerticalGlue());
}
}