/* * #! * Ontopoly Editor * #- * Copyright (C) 2001 - 2013 The Ontopia Project * #- * 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. * !# */ package ontopoly.pages; import java.util.ArrayList; import java.util.List; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeModel; import javax.swing.tree.TreeNode; import ontopoly.components.CreateInstanceFunctionBoxPanel; import ontopoly.components.FunctionBoxesPanel; import ontopoly.components.InstanceSearchPanel; import ontopoly.components.LinkFunctionBoxPanel; import ontopoly.components.LinkPanel; import ontopoly.components.OntopolyBookmarkablePageLink; import ontopoly.components.TitleHelpPanel; import ontopoly.components.TopicListPanel; import ontopoly.components.TreePanel; import ontopoly.model.Topic; import ontopoly.model.TopicMap; import ontopoly.model.TopicType; import ontopoly.models.HelpLinkResourceModel; import ontopoly.models.TopicTypeModel; import ontopoly.pojos.TopicNode; import ontopoly.utils.TreeModels; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; import org.apache.wicket.Page; import org.apache.wicket.PageParameters; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.ResourceModel; public class InstancesPage extends OntopolyAbstractPage { protected TopicTypeModel topicTypeModel; public InstancesPage() { } public InstancesPage(PageParameters parameters) { super(parameters); this.topicTypeModel = new TopicTypeModel(parameters.getString("topicMapId"), parameters.getString("topicId")); // Adding part containing title and help link createTitle(); // Add form Form<Object> form = new Form<Object>("form"); add(form); form.setOutputMarkupId(true); // Add list of instances TopicType topicType = topicTypeModel.getTopicType(); if (topicType.isLargeInstanceSet()) { form.add(new InstanceSearchPanel("instancesPanel", topicTypeModel)); } else if (topicType.hasHierarchy()) { // create a tree final TreeModel treeModel = TreeModels.createInstancesTreeModel(topicTypeModel.getTopicType(), isAdministrationEnabled()); IModel<TreeModel> treeModelModel = new AbstractReadOnlyModel<TreeModel>() { @Override public TreeModel getObject() { return treeModel; } }; Panel treePanel = new TreePanel("instancesPanel", treeModelModel) { @Override protected Component populateNode(String id, TreeNode treeNode) { DefaultMutableTreeNode mTreeNode = (DefaultMutableTreeNode)treeNode; final TopicNode node = (TopicNode)mTreeNode.getUserObject(); // create link with label return new LinkPanel(id) { @Override protected Label newLabel(String id) { Topic topic = node.getTopic(); final boolean isSystemTopic = topic.isSystemTopic(); return new Label(id, new Model<String>(getLabel(topic))) { @Override protected void onComponentTag(final ComponentTag tag) { if (isSystemTopic) tag.put("class", "italic"); super.onComponentTag(tag); } }; } @Override protected Link<Page> newLink(String id) { PageParameters params = new PageParameters(); params.put("topicMapId", node.getTopicMapId()); params.put("topicId", node.getTopicId()); params.put("topicTypeId", topicTypeModel.getTopicType().getId()); return new BookmarkablePageLink<Page>(id, InstancePage.class, params); } }; } }; treePanel.setOutputMarkupId(true); form.add(treePanel); } else { // just make a list form.add(new TopicListPanel("instancesPanel", new AbstractReadOnlyModel<List<Topic>>() { // short time cache because getObject is called for each object in the list transient private List<Topic> instances = null; @Override public List<Topic> getObject() { if (instances == null) { instances = topicTypeModel.getTopicType().getInstances(); } return instances; } })); } // Function boxes createFunctionBoxes(form, "functionBoxes"); // initialize parent components initParentComponents(); } @Override protected int getMainMenuIndex() { return INSTANCES_PAGE_INDEX_IN_MAINMENU; } private void createTitle() { // Adding part containing title and help link add(new TitleHelpPanel("titlePartPanel", new PropertyModel<String>(topicTypeModel, "name"), new HelpLinkResourceModel("help.link.instancespage"))); } private void createFunctionBoxes(MarkupContainer parent, String id) { parent.add(new FunctionBoxesPanel(id) { @Override protected List<Component> getFunctionBoxesList(String id) { List<Component> list = new ArrayList<Component>(); TopicType topicType = topicTypeModel.getTopicType(); if (!topicType.isAbstract() && !topicType.isReadOnly()) { list.add(new CreateInstanceFunctionBoxPanel(id, getTopicMapModel()) { @Override protected Class<? extends Page> getInstancePageClass() { return InstancePage.class; } @Override protected IModel<String> getTitleModel() { return new ResourceModel("instances.create.text"); } @Override protected Topic createInstance(TopicMap topicMap, String name) { TopicType topicType = topicTypeModel.getTopicType(); return topicType.createInstance(name); } }); } list.add(new LinkFunctionBoxPanel(id) { @Override public boolean isVisible() { return true; } @Override protected Component getLabel(String id) { return new Label(id, new ResourceModel("edit.topic.type")); } @Override protected Component getLink(String id) { TopicMap tm = getTopicMapModel().getTopicMap(); TopicType tt = topicTypeModel.getTopicType(); PageParameters params = new PageParameters(); params.put("topicMapId", tm.getId()); params.put("topicId", tt.getId()); params.put("ontology", "true"); //TODO direct link to correct instance page return new OntopolyBookmarkablePageLink(id, InstancePage.class, params, tt.getName()); } }); return list; } }); } @Override public void onDetach() { topicTypeModel.detach(); super.onDetach(); } }