/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.cocoon.portal.tools.copletManagement; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.forms.formmodel.Repeater; import org.apache.cocoon.forms.formmodel.Widget; import org.apache.cocoon.forms.formmodel.Repeater.RepeaterRow; import org.apache.cocoon.portal.coplet.CopletData; import org.apache.cocoon.portal.coplet.CopletFactory; import org.apache.cocoon.portal.coplet.CopletInstanceData; import org.apache.cocoon.portal.layout.CompositeLayout; import org.apache.cocoon.portal.layout.Item; import org.apache.cocoon.portal.layout.Layout; import org.apache.cocoon.portal.layout.LayoutFactory; import org.apache.cocoon.portal.layout.NamedItem; import org.apache.cocoon.portal.layout.impl.CopletLayout; import org.apache.cocoon.portal.profile.ProfileManager; /** * * @version CVS $Id$ */ public class LayoutActions { private final Layout layout; private final LayoutFactory lf; private final ProfileManager pm; private final CopletFactory cf; public LayoutActions(Layout layout, LayoutFactory lf, CopletFactory cf, ProfileManager pm) { this.layout = layout; this.lf = lf; this.pm = pm; this.cf = cf; } // FIXME - where is this used? public static int line = 1; /** * Delets the Object with the id in the layout * @param id * @return true if the object could be deleted. */ public boolean del(String id) { // get layout element: Object layoutObj = getLayoutElement (layout, id, "", 1); if (layoutObj == null) return false; // do the job: Layout lay; if (layoutObj instanceof NamedItem) lay = ((NamedItem)layoutObj).getLayout(); else lay = (Layout) layoutObj; try { // an empty item can not be handled by the LayoutFactory, do the job manual: if (lay == null) { List items = ((NamedItem)layoutObj).getParent().getItems(); for (ListIterator iter = items.listIterator(); iter.hasNext(); ) { Item itemElem = (Item) iter.next(); if( itemElem.equals(layoutObj)) { items.remove (iter.nextIndex()-1); return true; } } } else if(lay.getParent() instanceof NamedItem) { // FIXME: Causes that only the contents inside a tab are deleted instead of the tab NamedItem par = (NamedItem) lay.getParent(); par.setLayout(null); } else { lf.remove(lay); } } catch (ProcessingException e) { e.printStackTrace(); } return true; } /** * Moves the object one position up or down * @param id id of the element * @param moveUp set 'true', to move the element up ('false' to move it down) * @return true if the object could be moved. */ public boolean move(String id, boolean moveUp) { // get layout element: Object layoutObj = getLayoutElement (layout, id, "", 1); if (layoutObj == null) return false; // do the job: Layout lay; Item item; if (layoutObj instanceof NamedItem) { lay = ((NamedItem)layoutObj).getLayout(); if (lay == null) item = (NamedItem) layoutObj; else item = lay.getParent(); } else { lay = (Layout) layoutObj; item = lay.getParent(); } // find element in the list and move it: List items = item.getParent().getItems(); for (ListIterator iter = items.listIterator(); iter.hasNext(); ) { Item itemElem = (Item) iter.next(); if(itemElem.equals(item)) { int pos = iter.nextIndex()-1; int newpos = pos; if (moveUp) newpos --; else newpos ++; if (newpos >= items.size()) newpos = 0; if (newpos < 0) newpos = items.size()-1; Object obj = items.remove (pos); items.add(newpos,obj); return true; } } return false; } /** * Adds the object to the layout * @param parent Object to which the new Object should be added * @param type Type of the Object (row, col ...) */ public void add(String parent, String type) { Object layoutObj = getLayoutElement (layout, parent, "", 1); if (layoutObj == null) return; Layout lay; if (layoutObj instanceof NamedItem) lay = ((NamedItem)layoutObj).getLayout(); else lay = (Layout) layoutObj; try { Layout nObj = lf.newInstance(type); pm.register(nObj); Item e = new Item(); nObj.setParent(e); e.setLayout(nObj); if (lay != null) ((CompositeLayout) lay).addItem(e); else { NamedItem ni = (NamedItem)layoutObj; nObj.setParent(ni); ni.setLayout(nObj); } } catch (ProcessingException e) { e.printStackTrace(); } } /** * Adds a new Tab * @param parent Parent Object * @param name Name of the Tab */ public void addTab(String parent, String name) { // get layout element: Object layoutObj = getLayoutElement (layout, parent, "", 1); if (layoutObj == null) return; Layout lay; if (layoutObj instanceof NamedItem) lay = ((NamedItem)layoutObj).getLayout(); else lay = (Layout) layoutObj; // add tab: if(lay != null && lay.getName().equals("tab")) { NamedItem tab = new NamedItem(); tab.setName(name); ((CompositeLayout) lay).addItem(tab); } else { try { Layout tab = lf.newInstance("tab"); pm.register(tab); NamedItem e = new NamedItem(); e.setName(name); ((CompositeLayout) tab).addItem(e); if (lay == null) { ((NamedItem)layoutObj).setLayout(tab); } else { Item m = new Item(); m.setParent((CompositeLayout) lay); ((CompositeLayout) lay).addItem(m); m.setLayout(tab); } } catch (ProcessingException e) { e.printStackTrace(); } } } public Collection getSelectedCoplets(Repeater r, Collection lets, String parent) { // get layout element: Object obj = getLayoutElement (layout, parent, "", 1); if (obj == null) return null; ArrayList coplets = new ArrayList(); ArrayList copletDatas = new ArrayList(); int size = r.getSize(); for(int i = 0; i < size; i++) { RepeaterRow row = r.getRow(i); Widget widget = row.getChild("selected"); Boolean val = (Boolean) widget.getValue(); if(val.booleanValue()) { coplets.add(row.getChild("coplet").getValue()); } } for(Iterator it = lets.iterator(); it.hasNext();) { CopletData cd = (CopletData) it.next(); String cdid = cd.getId(); for(Iterator it2 = coplets.iterator(); it2.hasNext();) { String cdidTmp = (String) it2.next(); if(cdidTmp.equals(cdid)) copletDatas.add(cd); } } for(Iterator it = copletDatas.iterator(); it.hasNext();) { CopletData cd = (CopletData) it.next(); try { CopletInstanceData cinst = cf.newInstance(cd); CopletLayout lay = (CopletLayout) lf.newInstance("coplet"); lay.setCopletInstanceData(cinst); if(obj instanceof Item) { Item item = (Item) obj; item.setLayout(lay); lay.setParent(item); } else if(obj instanceof CompositeLayout) { CompositeLayout cl = (CompositeLayout) obj; Item item = new Item(); item.setLayout(lay); lay.setParent(item); cl.addItem(item); } } catch (ProcessingException e) { // ignore it } } return copletDatas; } public CopletInstanceData getCopletInstanceData(String id) { Object obj = getLayoutElement(layout, id, "", 1); if(obj instanceof CopletLayout) { return ((CopletLayout) obj).getCopletInstanceData(); } return null; } /** * interal method; search for a Layout or an Item Object */ private Object getLayoutElement (Layout layout, String id, String prefix, int pos) { if (layout != null) { if (id.equals((prefix+pos))) return layout; if (layout instanceof CompositeLayout) { Iterator i = ((CompositeLayout) layout).getItems().iterator(); int currentpos = pos; pos = 1; while (i.hasNext()) { Item current = (Item) i.next(); if (id.equals((prefix+currentpos+"."+pos))) return current; Object lay = getLayoutElement(current.getLayout(), id, prefix+currentpos+"."+pos+".",1); if(lay != null) return lay; pos ++; } } } return null; } }