blob: 20c0bf790534b5fd3084326b92dd22dfd7a259fd [file] [log] [blame]
/*
* 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;
}
}