/******************************************************************************* * 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.util.*; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import java.beans.PropertyChangeEvent; import org.jboss.tools.common.model.*; import org.jboss.tools.common.model.event.*; import org.jboss.tools.common.model.util.EclipseResourceUtil; import org.jboss.tools.jsf.ui.editor.model.IPage; 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.IJSFElementListListener; import org.jboss.tools.jsf.ui.editor.model.IJSFModel; import org.jboss.tools.jsf.ui.editor.model.ILink; import org.jboss.tools.jsf.ui.editor.model.IGroup; import org.jboss.tools.jsf.ui.editor.model.IGroupListener; public class Group extends JSFElement implements IGroup, IJSFElementListListener { public static final Color DEFAULT_FOREGROUND_COLOR = new Color(null, 0x00, 0x00, 0x00); public static final Color DEFAULT_BACKGROUND_COLOR = new Color(null, 0xE4, 0xE4, 0xE4); public static String TYPE_PROPERTY = "type"; //$NON-NLS-1$ public static String SUBTYPE_PROPERTY = "subtype"; //$NON-NLS-1$ public static String COMMENT_PROPERTY = "comment"; //$NON-NLS-1$ protected Color headerForegroundColor = DEFAULT_FOREGROUND_COLOR; protected Color headerBackgroundColor = DEFAULT_BACKGROUND_COLOR; String type; protected Image icon = null; public PageList pageList; List<IGroupListener> groupListeners = new Vector<IGroupListener>(); List<ILink> inputLinks = new Vector<ILink>(); List<ILink> outputLinks = new Vector<ILink>(); public void dispose() { super.dispose(); if (groupListeners != null) groupListeners.clear(); groupListeners = null; if (inputLinks != null) inputLinks.clear(); inputLinks = null; if (outputLinks != null) outputLinks.clear(); outputLinks = null; } public void addInputLink(ILink link) { if (!inputLinks.contains(link)) inputLinks.add(link); } public void removeInputLink(ILink link) { inputLinks.remove(link); } public void addOutputLink(ILink link, int index) { if (!outputLinks.contains(link)) outputLinks.add(index, link); } public void addOutputLink(ILink link) { outputLinks.add(link); } public void removeOutputLink(ILink link) { outputLinks.remove(link); } public Group(IJSFModel model, XModelObject groupNode) { super(model, groupNode); this.type = groupNode.getAttributeValue(TYPE_PROPERTY); global = false; icon = EclipseResourceUtil.getImage(groupNode); if (type != null) { pageList = new PageList(groupNode); pageList.addJSFElementListListener(this); } } public Image getImage() { return EclipseResourceUtil.getImage((XModelObject) source); } public Group(IJSFModel model, IJSFElement element) { super(model); } public String getViewClassName() { return ""; //$NON-NLS-1$ } public String getVisiblePath() { return this.getJSFModel().getHelper().getPageTitle(source); } boolean selected = false; public boolean isSelected() { return selected; } public boolean isPage() { return true; } public boolean isComment() { return false; } public void setSelected(boolean set) { boolean oldValue = selected; selected = set; this.propertyChangeSupport .firePropertyChange("selected", oldValue, set); //$NON-NLS-1$ if (set) this.getJSFModel().setSelectedProcessItem(this); } public void clearSelection() { IJSFElementList list = getJSFModel().getGroupList(); for (int i = 0; i < list.size(); i++) { IGroup activity = (IGroup) list.get(i); activity.setSelected(false); } } public boolean hasPageHiddenLinks() { if (getSource() != null) { return getJSFModel().getHelper().hasPageHiddenLinks( (XModelObject) getSource()); } else return false; } public IGroup getCommentTarget() { return null; } public boolean isConfirmed() { if (getSource() != null) { return !getJSFModel().getHelper().isUnconfirmedPage( (XModelObject) getSource()); } else return false; } public boolean isPattern() { if (getSource() != null) { return getJSFModel().getHelper().isGroupPattern( (XModelObject) getSource()); } else return false; } public boolean hasErrors() { return getJSFModel().getHelper().hasErrors((XModelObject) getSource()); } // getters public void setHeaderForegroundColor(Color color) { headerForegroundColor = color; } public Color getHeaderForegroundColor() { return headerForegroundColor; } public void setHeaderBackgroundColor(Color color) { headerBackgroundColor = color; } public Color getHeaderBackgroundColor() { return headerBackgroundColor; } public ILink[] getLinks() { ILink link; IJSFElementList list; IJSFElementList pages = this.getPageList(); List<ILink> links = new ArrayList<ILink>(); links.addAll(inputLinks); for (int i = 0; i < pages.size(); i++) { list = ((IPage) pages.get(i)).getLinkList(); for (int j = 0; j < list.size(); j++) { link = (ILink) list.get(j); if (link == null) continue; links.add(link); } } ILink[] trans = new ILink[links.size()]; links.toArray(trans); return trans; } public ILink[] getInputLinks() { return (ILink[]) inputLinks.toArray(); } public List getListInputLinks() { return inputLinks; } public ILink[] getOutputLinks() { return getLinks(); } public List getListOutputLinks() { return outputLinks; } public IPage getPage(String pageName) { return (Page) pageList.get(pageName); } public IJSFElementList getPageList() { return pageList; } // Unit messages public void fireGroupChange() { if (groupListeners.size() == 0) return; List<IGroupListener> targets = new ArrayList<IGroupListener>(); targets.addAll(groupListeners); for (int i = 0; i < targets.size(); i++) { IGroupListener listener = (IGroupListener) targets.get(i); if (listener != null) { listener.groupChange(); } } } public void firePageAdd(IPage page) { List<IGroupListener> listeners = new ArrayList<IGroupListener>(); listeners.addAll(groupListeners); for (int i = 0; i < listeners.size(); i++) { IGroupListener listener = (IGroupListener) listeners.get(i); if (listener != null && listener.isGroupListenerEnable()) ((IGroupListener) listeners.get(i)).pageAdd(this, page); } } public void firePageRemove(IPage page, int index) { List<IGroupListener> listeners = new ArrayList<IGroupListener>(); listeners.addAll(groupListeners); for (int i = 0; i < listeners.size(); i++) { IGroupListener listener = (IGroupListener) listeners.get(i); if (listener != null && listener.isGroupListenerEnable()) ((IGroupListener) listeners.get(i)).pageRemove(this, page); } } public void firePageChange(IPage message, PropertyChangeEvent evt) { } public void fireLinkAdd(IPage page, ILink link) { List<IGroupListener> listeners = new ArrayList<IGroupListener>(); listeners.addAll(groupListeners); for (int i = 0; i < listeners.size(); i++) { IGroupListener listener = (IGroupListener) listeners.get(i); if (listener != null && listener.isGroupListenerEnable()) ((IGroupListener) listeners.get(i)).linkAdd(page, link); } } public void fireLinkRemove(IPage page, ILink link, int index) { List<IGroupListener> listeners = new ArrayList<IGroupListener>(); listeners.addAll(groupListeners); for (int i = 0; i < listeners.size(); i++) { IGroupListener listener = (IGroupListener) listeners.get(i); if (listener != null && listener.isGroupListenerEnable()) ((IGroupListener) listeners.get(i)).linkRemove(page, link); } } // remove state from model public void remove() { for (int i = 0; i < getPageList().size(); i++) { ((Page) getPageList().get(i)).remove(); } } public void addGroupListener(IGroupListener listener) { groupListeners.add(listener); } public void removeGroupListener(IGroupListener listener) { } public void removeFromJSFModel() { } public void nodeChanged(Object eventData) { fireGroupChange(); this.propertyChangeSupport.firePropertyChange("name", "", this //$NON-NLS-1$ //$NON-NLS-2$ .getSourceProperty("name")); //$NON-NLS-1$ this.propertyChangeSupport.firePropertyChange("shape", "", this //$NON-NLS-1$ //$NON-NLS-2$ .getSourceProperty("shape")); //$NON-NLS-1$ this.propertyChangeSupport.firePropertyChange("path", "", this //$NON-NLS-1$ //$NON-NLS-2$ .getSourceProperty("path")); //$NON-NLS-1$ } public class PageList extends JSFElementList { public PageList(XModelObject listSource) { super(Group.this); XModelObject[] pages = listSource.getChildren(); for (int i = 0; i < pages.length; i++) { IPage newPage = new Page(Group.this, pages[i]); add(newPage); } } public void structureChanged(Object eventData) { XModelObject listSource = (XModelObject) Group.this.getSource(); XModelObject[] pages = listSource.getChildren(); if (pages.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 (!pages[i].getPathPart().equals(o.getPathPart())) { moveTo(pe, size() - 1); --i; } } } public void nodeAdded(Object eventData) { XModelTreeEvent event = (XModelTreeEvent) eventData; IPage newPage = new Page(Group.this, ((XModelObject) event .getInfo())); addPage(newPage); } public void nodeRemoved(Object eventData) { XModelTreeEvent event = (XModelTreeEvent) eventData; IPage removedPage = (IPage) getFromMap(event.getInfo()); removedPage.remove(); removePage(removedPage); } public void addPage(IPage page) { ((JSFModel) jsfModel).putToMap(page.getSource(), page); this.add(page); firePageAdd(page); } public void removePage(IPage page) { removeFromMap(page); int index = this.indexOf(page); this.remove(page); firePageRemove(page, index); } } public void structureChanged(Object eventData) { pageList.structureChanged(eventData); } public void nodeAdded(Object eventData) { pageList.nodeAdded(eventData); } public void nodeRemoved(Object eventData) { pageList.nodeRemoved(eventData); } 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) { this.firePageAdd((IPage) element); } public void listElementRemove(IJSFElementList list, IJSFElement element, int index) { this.firePageRemove((IPage) element, index); } public void listElementChange(IJSFElementList list, IJSFElement element, int index, PropertyChangeEvent event) { } }