// BEGIN LICENSE BLOCK // Version: CMPL 1.1 // // The contents of this file are subject to the Cisco-style Mozilla Public // License Version 1.1 (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License // at www.eclipse-clp.org/license. // // Software distributed under the License is distributed on an "AS IS" // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See // the License for the specific language governing rights and limitations // under the License. // // The Original Code is The ECLiPSe Constraint Logic Programming System. // The Initial Developer of the Original Code is Cisco Systems, Inc. // Portions created by the Initial Developer are // Copyright (C) 2006 Cisco Systems, Inc. All Rights Reserved. // // Contributor(s): // // END LICENSE BLOCK package com.parctechnologies.eclipse.visualisation.viewers; import com.parctechnologies.eclipse.*; import com.parctechnologies.eclipse.visualisation.*; import java.awt.Rectangle; import java.awt.Shape; import java.awt.geom.*; import java.awt.Color; import java.awt.Component; import java.util.*; import java.awt.event.ActionEvent; import javax.swing.*; import javax.swing.table.*; import att.grappa.*; /** * Displays a textual representation of the viewable element */ public class TextViewletType extends AbstractViewletType { private TableCellRenderer tableCellRenderer; private CustomRenderer customRenderer; public static final int MAX_FADE = 10; /** Holds four colours per fade level*/ FadeColorSupport fadeColorSupport; public TextViewletType(String changeable) { super(changeable); fadeColorSupport = new FadeColorSupport(MAX_FADE, new Color(0,255,0), new Color(255,0,0)); } /* ViewletFactory methods */ public boolean canBuildFrom(ElementType elementType) { return(true); } public ViewletData build() { return new Data(); } public String getDescription() { return("Text viewlet"); } /* ViewletType methods */ public synchronized TableCellRenderer getTableCellRenderer() { if (tableCellRenderer == null) { tableCellRenderer = new CellRenderer(); } return tableCellRenderer; } synchronized Class getCustomRendererClass() { // if (customRenderer == null) { // customRenderer = new CustRenderer(); // } // return customRenderer; return Renderer.class; } protected Color getColor(Data data, boolean isSelected) { int greyness = 0; if (data.getHoldsOnUpdates()) { greyness++; } if (isSelected) { greyness+=2; } Color col; int val = data.getFadeCount(); if (val > 0) { col = fadeColorSupport.forwardColor[val][greyness]; } else { col = fadeColorSupport.backwardColor[-val][greyness]; } return col; } public void customizeElement(ViewletDataStore store, java.util.List index, Element element) { Data data = (Data)(store.getViewletDataAt(index)); if (element instanceof Node) { // set the element data element.object = data; // set the custom renderer element.setAttribute("shape",new Integer(Grappa.CUSTOM_SHAPE)); element.setAttribute(Grappa.CUSTOM_ATTR,getCustomRendererClass().getName()); // set the node label element.setAttribute("label",data.getText()); // set filled element.setAttribute("style", "filled"); // set background color element.setAttribute("color",getColor(data, false)); // force shape update element.getGrappaNexus().updateShape(); } else { // instance of edge } } public BatchGoal collectPreBuildGoal(Viewer viewer, ViewletDataStore store, ViewletRange range) { BatchGoal result = new BatchGoal(); Iterator indexListIterator = range.iterator(); java.util.List currentIndex; Collection viewlets; while(indexListIterator.hasNext()) { currentIndex = (java.util.List) indexListIterator.next(); CompoundTerm goal = new CompoundTermImpl(":", new Atom("vc_support"), new CompoundTermImpl("viewable_element_to_string", new CompoundTermImpl("element",currentIndex), null)); result.add(composeElementGoal(currentIndex, store.getViewable().getNameAtom(), goal)); } return(result); } public void startBuild(Viewer viewer, ViewletDataStore store, ViewletRange range, List results) { Iterator indexListIterator = range.iterator(); Iterator resultsIterator = results.iterator(); CompoundTermImpl elementResult; List currentIndex; if (DebuggingSupport.logMessages) { DebuggingSupport.logMessage(this, "startBuild called with range=" + range + " results=" + results); } while(indexListIterator.hasNext()) { currentIndex = (List) indexListIterator.next(); if (DebuggingSupport.logMessages) { DebuggingSupport.logMessage(this, "currentIndex="+currentIndex); } Data viewletData = (Data)(store.getViewletDataAt(currentIndex)); if (DebuggingSupport.logMessages) { DebuggingSupport.logMessage(this, "viewletData="+viewletData); } elementResult = (CompoundTermImpl) resultsIterator.next(); if (DebuggingSupport.logMessages) { DebuggingSupport.logMessage(this, "elementResult="+elementResult); } // store the goal result text into the viewletDataStore Object text = ((CompoundTermImpl)decomposeElementGoal(elementResult)).argCT(2).arg(2); if (viewletData == null) { viewletData = (Data)build(); } viewletData.setText(text.toString()); store.setViewletDataAt(currentIndex, viewletData); } } public BatchGoal collectPreUpdateGoal(Viewer viewer, ViewletDataStore store, ViewletRange range, UpdateEvent updateEvent) { BatchGoal result = new BatchGoal(); Iterator indexListIterator = range.iterator(); java.util.List currentIndex; Collection viewlets; while(indexListIterator.hasNext()) { currentIndex = (java.util.List) indexListIterator.next(); CompoundTerm goal = new CompoundTermImpl(":", new Atom("vc_support"), new CompoundTermImpl("viewable_element_to_string", new CompoundTermImpl("element",currentIndex), null)); result.add(composeElementGoal(currentIndex, store.getViewable().getNameAtom(), goal)); } return(result); } protected void setUpdating(Viewer viewer, ViewletDataStore store, ViewletRange range, int fadeCount) { Iterator indexListIterator = range.iterator(); List currentIndex; while(indexListIterator.hasNext()) { currentIndex = (List) indexListIterator.next(); if (DebuggingSupport.logMessages) { DebuggingSupport.logMessage(this, "currentIndex="+currentIndex); } Data viewletData = (Data)(store.getViewletDataAt(currentIndex)); if (DebuggingSupport.logMessages) { DebuggingSupport.logMessage(this, "viewletData="+viewletData); } // Set the updating flag and store the new data if (viewletData == null) { viewletData = (Data)build(); } viewletData.setFadeCount(fadeCount); store.setViewletDataAt(currentIndex, viewletData); } } public void startUpdate(Viewer viewer, ViewletDataStore store, ViewletRange range, List results, UpdateEvent updateEvent) { // do the same as for building a viewlet startBuild(viewer, store, range, results); // set the fade counter setUpdating(viewer, store, range,((updateEvent instanceof ForwardUpdateEvent)?MAX_FADE:-MAX_FADE)); ViewletRange all = store.getEntireViewletRange() ; ViewletRange faded = new ViewletRangeCollection(); for(Iterator it = all.iterator(); it.hasNext(); ) { List index = (List)it.next(); Data data = (Data)(store.getViewletDataAt(index)); if (data.fade()) { faded.add(index); } } // Indicate that these cells were updated store.fireViewletRangeUpdated(faded); // store.fireViewletRangeUpdated(range); } /* * Data is a viewlet which can monitor elements of any type. It is * responsible for: *