/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.ui.editor.model.impl;
import java.beans.PropertyChangeEvent;
import java.util.*;
import org.eclipse.draw2d.geometry.Rectangle;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.event.XModelTreeEvent;
import org.jboss.tools.jsf.ui.editor.model.IJSFElementListListener;
import org.jboss.tools.jsf.ui.editor.model.IPage;
import org.jboss.tools.jsf.ui.editor.model.IPageListener;
import org.jboss.tools.jsf.ui.editor.model.IJSFElement;
import org.jboss.tools.jsf.ui.editor.model.IJSFElementList;
import org.jboss.tools.jsf.ui.editor.model.ILink;
import org.jboss.tools.jsf.ui.editor.model.IGroup;
public class Page extends JSFElement implements IPage, IJSFElementListListener{
public LinkList linkList;
Rectangle rect = new Rectangle(0, 0, 10, 10);
public IJSFElementList getLinkList() {
return linkList;
}
public void setBounds(int x, int y, int width, int height) {
rect = new Rectangle(x, y, width, height);
}
public Rectangle getBounds() {
return rect;
}
public class LinkList extends JSFElementList {
public LinkList(XModelObject listSource) {
super(Page.this);
XModelObject[] links = listSource.getChildren();
for (int i = 0; i < links.length; i++) {
ILink newLink = new Link(Page.this, links[i]);
add(newLink);
((Group) Page.this.getParentJSFElement())
.addOutputLink(newLink);
}
}
public void structureChanged(Object eventData) {
XModelObject listSource = (XModelObject) Page.this.getSource();
XModelObject[] links = listSource.getChildren();
if (links.length != size()) {
// not implemented
return;
}
for (int i = 0; i < size(); i++) {
IJSFElement pe = (IJSFElement) get(i);
XModelObject o = (XModelObject) pe.getSource();
if (listSource.getChildByPath(o.getPathPart()) == null) {
// not implemented
return;
}
}
// implemented only change of order of elements in list
for (int i = 0; i < size(); i++) {
IJSFElement pe = (IJSFElement) get(i);
XModelObject o = (XModelObject) pe.getSource();
if (!links[i].getPathPart().equals(o.getPathPart())) {
moveTo(pe, size() - 1);
--i;
}
}
}
public void nodeAdded(Object eventData) {
XModelTreeEvent event = (XModelTreeEvent) eventData;
ILink newLink = new Link(Page.this, (XModelObject) event.getInfo());
addLink(newLink);
}
public void nodeRemoved(Object eventData) {
XModelTreeEvent event = (XModelTreeEvent) eventData;
ILink removedLink = (ILink) getFromMap(event.getInfo());
removeLink(removedLink);
}
public void addLink(ILink link) {
((JSFModel) jsfModel).putToMap(link.getSource(), link);
this.add(link);
IGroup group = (IGroup) Page.this.getParentJSFElement();
int index = 0;
for (int i = 0; i < group.getPageList().size(); i++) {
index += ((IPage) group.getPageList().get(i)).getLinkList()
.size();
if (i == group.getPageList().indexOf(Page.this))
break;
}
group.addOutputLink(link, index - 1);
link.setTarget();
}
public void removeLink(ILink link) {
removeFromMap(link);
int index = this.indexOf(link);
IGroup group = link.getToGroup();
if(group != null) {
group.removeInputLink(link);
}
this.remove(link);
((Group) Page.this.getParentJSFElement()).removeOutputLink(link);
fireLinkRemove(link, index);
link.remove();
}
}
public List<IPageListener> pageListeners = new Vector<IPageListener>();
IJSFElementList partList = new JSFElementList();
String name;
String target;
boolean relink = false;
public Page(IJSFElement parent, XModelObject source) {
super(parent, source);
linkList = new LinkList(source);
linkList.addJSFElementListListener(this);
target = source.getAttributeValue(TARGET_PROPERTY);
initLink();
name = getName();
}
public void dispose() {
super.dispose();
if (pageListeners != null)
pageListeners.clear();
pageListeners = null;
}
public XModelObject getTargetModel() {
XModelObject target = jsfModel.getHelper().getItemOutputTarget(source);
return target;
}
public boolean isHidden() {
String hidden;
if (source == null)
source = (XModelObject) parent.getSource();
hidden = source.getAttributeValue(Link.HIDDEN_PROPERTY);
if ("yes".equals(hidden)) //$NON-NLS-1$
return true;
else
return false;
}
public String getTargetString() {
return target;
}
public void initLink() {
}
// ------------------------------------------------------------------------
// IMessage implementation
// ------------------------------------------------------------------------
public boolean canRename() {
return true;
}
public boolean canDelete() {
return true;
}
public String getText() {
return "\t\t\t\t<MSG MESSAGE=\"" + getName() + "\"/>"; //$NON-NLS-1$ //$NON-NLS-2$
}
// ------------------------------------------------------------------------
// Event support
// ------------------------------------------------------------------------
public void addPageListener(IPageListener listener) {
pageListeners.add(listener);
}
public void removePageListener(IPageListener listener) {
pageListeners.remove(listener);
}
void firePageRemoved() {
List<IPageListener> listeners = new ArrayList<IPageListener>();
listeners.addAll(pageListeners);
for (int i = 0; i < listeners.size(); i++) {
IPageListener listener = listeners.get(i);
if (listener != null)
listener.pageRemoved(this);
}
}
public void removeLink(IPage message) {
}
public void rename(String newName) {
}
public IGroup getGroup() {
return (IGroup) getParentJSFElement();
}
public IJSFElementList getPartList() {
return partList;
}
public boolean isLinkAllowed() {
return true;
}
public Enumeration children() {
return null;
}
public boolean isLeaf() {
return false;
}
public void remove() {
for (int i = getLinkList().size() - 1; i >= 0; i--) {
ILink link = (ILink) getLinkList().get(i);
linkList.removeLink(link);
}
}
public boolean getAllowsChildren() {
return true;
}
public boolean hasErrors() {
return getJSFModel().getHelper().hasErrors((XModelObject) getSource());
}
public void nodeChanged(Object eventData) {
if (!name.equals(getName())) {
propertyChangeSupport.firePropertyChange("name", name, getName()); //$NON-NLS-1$
name = getName();
}
}
public void fireLinkAdd(ILink link) {
List<IPageListener> listeners = new ArrayList<IPageListener>();
listeners.addAll(pageListeners);
for (int i = 0; i < listeners.size(); i++) {
IPageListener listener = (IPageListener) listeners.get(i);
if (listener != null && listener.isPageListenerEnable())
((IPageListener) listeners.get(i)).linkAdd(this, link);
}
((Group) getParentJSFElement()).fireLinkAdd(this, link);
}
public void fireLinkRemove(ILink link, int index) {
List<IPageListener> listeners = new ArrayList<IPageListener>();
listeners.addAll(pageListeners);
for (int i = 0; i < listeners.size(); i++) {
IPageListener listener = (IPageListener) listeners.get(i);
if (listener != null && listener.isPageListenerEnable())
((IPageListener) listeners.get(i)).linkRemove(this, link);
}
((Group) getParentJSFElement()).fireLinkRemove(this, link, index);
}
public void firePageChange(IPage message, PropertyChangeEvent evt) {
}
public boolean isRelink() {
return relink;
}
public boolean isElementListListenerEnable() {
return true;
}
public void setElementListListenerEnable(boolean set) {
}
public void listElementMove(IJSFElementList list, IJSFElement element,
int newIndex, int oldIndex) {
}
public void listElementAdd(IJSFElementList list, IJSFElement element,
int index) {
}
public void listElementRemove(IJSFElementList list, IJSFElement element,
int index) {
}
public void listElementChange(IJSFElementList list, IJSFElement element,
int index, PropertyChangeEvent event) {
}
public void nodeAdded(Object eventData) {
linkList.nodeAdded(eventData);
}
public void nodeRemoved(Object eventData) {
linkList.nodeRemoved(eventData);
}
}