All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.efaps.ui.wicket.components.tree.StructurBrowserTreeTable Maven / Gradle / Ivy

Go to download

eFaps WebApp provides a web interface as the User Interface for eFaps which can be easily expanded and altered.

There is a newer version: 3.2.0
Show newest version
/*
 * Copyright 2003 - 2011 The eFaps Team
 *
 * 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.
 *
 * Revision:        $Rev: 6518 $
 * Last Changed:    $Date: 2011-05-12 13:43:06 -0500 (Thu, 12 May 2011) $
 * Last Changed By: $Author: [email protected] $
 */

package org.efaps.ui.wicket.components.tree;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;

import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.Page;
import org.apache.wicket.PageMap;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.extensions.markup.html.tree.table.IColumn;
import org.apache.wicket.extensions.markup.html.tree.table.TreeTable;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.WebComponent;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.html.tree.ITreeState;
import org.apache.wicket.model.IModel;
import org.efaps.admin.dbproperty.DBProperties;
import org.efaps.admin.ui.AbstractCommand.Target;
import org.efaps.admin.ui.Menu;
import org.efaps.admin.ui.field.Field.Display;
import org.efaps.db.Instance;
import org.efaps.ui.wicket.EFapsSession;
import org.efaps.ui.wicket.behaviors.AbstractAjaxCallBackBehavior;
import org.efaps.ui.wicket.components.LabelComponent;
import org.efaps.ui.wicket.components.RecentObjectLink;
import org.efaps.ui.wicket.components.date.UnnestedDatePickers;
import org.efaps.ui.wicket.models.UIModel;
import org.efaps.ui.wicket.models.cell.UIStructurBrowserTableCell;
import org.efaps.ui.wicket.models.objects.AbstractUIPageObject;
import org.efaps.ui.wicket.models.objects.UIStructurBrowser;
import org.efaps.ui.wicket.pages.contentcontainer.ContentContainerPage;
import org.efaps.ui.wicket.pages.error.ErrorPage;
import org.efaps.ui.wicket.pages.main.MainPage;
import org.efaps.ui.wicket.resources.EFapsContentReference;
import org.efaps.ui.wicket.resources.StaticHeaderContributor;
import org.efaps.ui.wicket.util.EFapsKey;
import org.efaps.util.EFapsException;

/**
 * This class renders a TreeTable, which loads the children asynchron.
* The items of the tree consists of junction link, icon and label. An additional arrow showing the direction of the * child can be rendered depending on a Tristate. The table shows the columns as defined in the model. * * @author The eFaps Team * @version $Id: StructurBrowserTreeTable.java 6518 2011-05-12 18:43:06Z [email protected] $ */ public class StructurBrowserTreeTable extends TreeTable { /** * Needed for serialization. */ private static final long serialVersionUID = 1L; /** * ResourceReference to the StyleSheet used for this TreeTable. */ private static final EFapsContentReference CSS = new EFapsContentReference(StructurBrowserTreeTable.class, "StructurTreeTable.css"); /** * Must the link update the parent in the link. */ private final boolean parentLink; /** * DatePicker. */ private final UnnestedDatePickers datePickers; /** * Constructor. * * @param _wicketId wicket id for this component * @param _model model * @param _columns columns * @param _parentLink must the link be done over the parent * @param _datePickers DatePicker */ public StructurBrowserTreeTable(final String _wicketId, final IModel _model, final IColumn[] _columns, final boolean _parentLink, final UnnestedDatePickers _datePickers) { super(_wicketId, _model.getObject().getTreeModel(), _columns); this.add(StaticHeaderContributor.forCss(StructurBrowserTreeTable.CSS)); this.parentLink = _parentLink; setRootLess(!(_model.getObject().isEditable())); final ITreeState treeState = getTreeState(); treeState.addTreeStateListener(new AsyncronTreeUpdateListener()); final DefaultMutableTreeNode root = (DefaultMutableTreeNode) getModelObject().getRoot(); if (!isRootLess() && _model.getObject().isForceExpanded()) { getTreeState().expandNode(root); } expandChildren(root); this.datePickers = _datePickers; } /** * Recursive method that expands all children that should be expanded. * * @param _parent parent */ private void expandChildren(final DefaultMutableTreeNode _parent) { for (int i = 0; i < _parent.getChildCount(); i++) { final DefaultMutableTreeNode child = (DefaultMutableTreeNode) _parent.getChildAt(i); if (!(child instanceof UIStructurBrowser.BogusNode)) { final UIStructurBrowser struturBrowser = (UIStructurBrowser) child.getUserObject(); if (struturBrowser.isExpanded()) { getTreeState().expandNode(child); expandChildren(child); } } } } /** * @return null */ @Override protected ResourceReference getCSS() { // return null here and set a own HeaderContributor, to use eFaps own // CSSResourceReference return null; } /** * Method is called to create a new Icon. * * @param _parent parent node * @param _wicketId wicket id for the new node * @param _node related TreeNode * @return Component */ @Override protected Component newNodeIcon(final MarkupContainer _parent, final String _wicketId, final TreeNode _node) { final UIStructurBrowser model = (UIStructurBrowser) ((DefaultMutableTreeNode) _node).getUserObject(); Component ret; if (model.getImage() == null) { ret = super.newNodeIcon(_parent, _wicketId, _node); } else { ret = new WebMarkupContainer(_wicketId) { private static final long serialVersionUID = 1L; @Override protected void onComponentTag(final ComponentTag _tag) { super.onComponentTag(_tag); _tag.put("style", "background-image: url('" + model.getImage() + "')"); } }; } return ret; } /** * Method to add a new Fragment. * * @param _parent parent node * @param _wicketId wicket id for the new node * @param _node related TreeNode * @param _level level * @param _nodeCallback callback * @return Component */ @Override protected Component newTreePanel(final MarkupContainer _parent, final String _wicketId, final TreeNode _node, final int _level, final IRenderNodeCallback _nodeCallback) { try { return new StructurBrowserTreeFragment(_wicketId, _node, _level, _nodeCallback); } catch (final EFapsException e) { throw new RestartResponseException(new ErrorPage(e)); } } /** * Method creates a new node . * * @param _parent parent node * @param _wicketId wicket id for the new node * @param _node related TreeNode * @return MarkupContainer */ @Override protected MarkupContainer newNodeLink(final MarkupContainer _parent, final String _wicketId, final TreeNode _node) { MarkupContainer ret; if (this.parentLink) { ret = new WebMarkupContainer(_wicketId) { private static final long serialVersionUID = 1L; @Override protected void onComponentTag(final ComponentTag _tag) { _tag.setName("a"); _tag.put("class", "node-link"); _tag.put("href", "#"); super.onComponentTag(_tag); } @Override protected void onBeforeRender() { this.add(new AjaxParentCallBackBehavior(_node)); super.onBeforeRender(); } }; } else { ret = newLink(_parent, _wicketId, new ILinkCallback() { private static final long serialVersionUID = 1L; public void onClick(final AjaxRequestTarget _target) { Instance instance = null; final UIStructurBrowser model = (UIStructurBrowser) ((DefaultMutableTreeNode) _node) .getUserObject(); if (model.getInstanceKey() != null) { Menu menu = null; try { instance = model.getInstance(); menu = Menu.getTypeTreeMenu(instance.getType()); } catch (final EFapsException e) { throw new RestartResponseException(new ErrorPage(e)); } if (menu == null) { final EFapsException excep = new EFapsException(this.getClass(), "newNodeLink.noTreeMenu", instance.getType().getName()); throw new RestartResponseException(new ErrorPage(excep)); } Page page; try { if (model.getTarget() == Target.POPUP) { page = new ContentContainerPage(menu.getUUID(), model.getInstanceKey()); } else { page = new ContentContainerPage(getPage().getPageMap(), menu.getUUID(), model .getInstanceKey(), true); } } catch (final EFapsException e) { page = new ErrorPage(e); } setResponsePage(page); } } }); } return ret; } @Override protected ResourceReference getNodeIcon(final TreeNode _node) { final ResourceReference ret; if (!_node.getAllowsChildren()) { ret = getItem(); } else { if (isNodeExpanded(_node)) { ret = getFolderOpen(); } else { ret = getFolderClosed(); } } return ret; } /** * This class renders a Fragment of the TreeTable, representing a Node including the junctionlink, the icon etc. * */ private class StructurBrowserTreeFragment extends Panel { /** * Needed for serialization. */ private static final long serialVersionUID = 1L; /** * @param _wicketId wicket id for this component * @param _node node * @param _level level * @param _nodeCallback callback * @throws EFapsException on error */ public StructurBrowserTreeFragment(final String _wicketId, final TreeNode _node, final int _level, final IRenderNodeCallback _nodeCallback) throws EFapsException { super(_wicketId); final UIStructurBrowser uiStru = (UIStructurBrowser) ((DefaultMutableTreeNode) _node).getUserObject(); add(newIndentation(this, "indent", _node, _level)); if (uiStru.isForceExpanded()) { final WebMarkupContainer junctionLink = new WebMarkupContainer("link") { private static final long serialVersionUID = 1L; /** * @see org.apache.wicket.Component#onComponentTag(org.apache.wicket.markup.ComponentTag ) */ @Override protected void onComponentTag(final ComponentTag _tag) { super.onComponentTag(_tag); _tag.put("onclick", "return false"); } }; add(junctionLink); junctionLink.add(newJunctionImage(junctionLink, "image", _node)); } else { add(newJunctionLink(this, "link", "image", _node)); } final WebComponent direction = new WebComponent("direction"); add(direction); if (uiStru == null || uiStru.getDirection() == null) { direction.setVisible(false); } else if (uiStru.getDirection()) { direction.add(new SimpleAttributeModifier("class", "directionDown")); } else { direction.add(new SimpleAttributeModifier("class", "directionUp")); } final MarkupContainer nodeLink; if (uiStru.isRoot()) { nodeLink = new WebMarkupContainer("nodeLink"); nodeLink.add(new Label("label", DBProperties.getProperty(uiStru.getCommand().getName() + ".StructurBrowser.root"))); add(new WebComponent("rowId").setVisible(false)); add(new WebComponent("level").setVisible(false)); add(new WebComponent("allowChilds").setVisible(false)); } else { final UIStructurBrowserTableCell uiObject = uiStru.getColumnValue(uiStru.getBrowserFieldIndex()); if ((uiStru.isEditMode() || uiStru.isCreateMode()) && uiObject.getDisplay().equals(Display.EDITABLE)) { nodeLink = new WebMarkupContainer("nodeLink"); nodeLink.add(new TreeCellPanel("label", _node, uiStru.getBrowserFieldIndex(), StructurBrowserTreeTable.this.parentLink, StructurBrowserTreeTable.this.datePickers)); } else { if (uiObject.getReference() == null || Target.MODAL.equals(uiObject.getParent().getTarget())) { nodeLink = new WebMarkupContainer("nodeLink") { private static final long serialVersionUID = 1L; @Override protected void onComponentTag(final ComponentTag _tag) { _tag.setName("span"); super.onComponentTag(_tag); } }; } else { nodeLink = newNodeLink(this, "nodeLink", _node); } nodeLink.add(new LabelComponent("label", new UIModel(uiObject))); } final WebComponent rowId = new WebComponent("rowId") { /** * Needed for serialization. */ private static final long serialVersionUID = 1L; /** * @see org.apache.wicket.Component#onComponentTag(org.apache.wicket.markup.ComponentTag) */ @Override protected void onComponentTag(final ComponentTag _tag) { super.onComponentTag(_tag); if (uiObject.getUserinterfaceId() == null) { final AbstractUIPageObject uiPageObject = (AbstractUIPageObject) getPage() .getDefaultModelObject(); uiObject.setUserinterfaceId(uiPageObject.getNewRandom()); try { uiPageObject.getUiID2Oid() .put(uiObject.getUserinterfaceId(), uiObject.getInstance() == null ? null : uiObject .getInstance().getOid()); } catch (final EFapsException e) { throw new RestartResponseException(new ErrorPage(e)); } } _tag.put("name", EFapsKey.TABLEROW_NAME.getKey()); _tag.put("value", uiObject.getUserinterfaceId()); _tag.put("type", "hidden"); } }; this.add(rowId); final WebComponent type = new WebComponent("allowChilds") { /** * Needed for serialization. */ private static final long serialVersionUID = 1L; /** * @see org.apache.wicket.Component#onComponentTag(org.apache.wicket.markup.ComponentTag) */ @Override protected void onComponentTag(final ComponentTag _tag) { super.onComponentTag(_tag); _tag.put("name", EFapsKey.STRUCBRWSR_ALLOWSCHILDS.getKey()); _tag.put("value", _node.getAllowsChildren()); _tag.put("type", "hidden"); } }; this.add(type); final WebComponent level = new WebComponent("level") { /** * Needed for serialization. */ private static final long serialVersionUID = 1L; @Override protected void onComponentTag(final ComponentTag _tag) { super.onComponentTag(_tag); _tag.put("name", EFapsKey.STRUCBRWSR_LEVEL.getKey()); _tag.put("value", _level); _tag.put("type", "hidden"); } }; this.add(level); } add(nodeLink); nodeLink.add(newNodeIcon(nodeLink, "icon", _node)); } } /** * Class is used to call an event from inside the parent. * */ public class AjaxParentCallBackBehavior extends AbstractAjaxCallBackBehavior { /** * Needed for serialization. */ private static final long serialVersionUID = 1L; /** * Node belonging to this call back behavior. */ private final TreeNode node; /** * Constructor. * * @param _node current node */ public AjaxParentCallBackBehavior(final TreeNode _node) { super("onClick", Target.PARENT); this.node = _node; } /** * Method is executed on mouseup. * * @param _target AjaxRequestTarget */ @Override protected void onEvent(final AjaxRequestTarget _target) { final UIStructurBrowser uiRootObject = (UIStructurBrowser) ((DefaultMutableTreeNode) ((DefaultMutableTreeNode) this.node).getRoot()).getUserObject(); try { final RecentObjectLink recent = new RecentObjectLink(uiRootObject); ((EFapsSession) getSession()).addRecent(recent); } catch (final EFapsException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } Instance instance = null; final UIStructurBrowser uiObject = (UIStructurBrowser) ((DefaultMutableTreeNode) this.node).getUserObject(); if (uiObject.getInstanceKey() != null) { Menu menu = null; try { instance = uiObject.getInstance(); menu = Menu.getTypeTreeMenu(instance.getType()); } catch (final EFapsException e) { throw new RestartResponseException(new ErrorPage(e)); } if (menu == null) { final EFapsException excep = new EFapsException(this.getClass(), "newNodeLink.noTreeMenu", instance.getType().getName()); throw new RestartResponseException(new ErrorPage(excep)); } Page page; try { if (uiObject.getTarget() == org.efaps.admin.ui.AbstractCommand.Target.POPUP) { page = new ContentContainerPage(menu.getUUID(), uiObject.getInstanceKey()); } else { page = new ContentContainerPage(PageMap.forName(MainPage.IFRAME_PAGEMAP_NAME), menu.getUUID(), uiObject.getInstanceKey(), true); } } catch (final EFapsException e) { page = new ErrorPage(e); } setResponsePage(page); } } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy