/* * ConsoleForResultsTable.java * * This file is part of the STS-Tool project. * Copyright (c) 2011-2012 "University of Trento - DISI" All rights reserved. * * Is strictly forbidden to remove this copyright notice from this source code. * * Disclaimer of Warranty: * STS-Tool (this software) is provided "as-is" and without warranty of any kind, * express, implied or otherwise, including without limitation, any warranty of * merchantability or fitness for a particular purpose. * In no event shall the copyright holder or contributors be liable for any direct, * indirect, incidental, special, exemplary, or consequential damages * including, but not limited to, procurement of substitute goods or services; * loss of use, data, or profits; or business interruption) however caused and on * any theory of liability, whether in contract, strict liability, or tort (including * negligence or otherwise) arising in any way out of the use of this software, even * if advised of the possibility of such damage. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License version 3 * as published by the Free Software Foundation with the addition of the * following permission added to Section 15 as permitted in Section 7(a): * FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY * "University of Trento - DISI","University of Trento - DISI" DISCLAIMS THE * WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. * * See the GNU Affero General Public License for more details. * You should have received a copy of the GNU Affero General Public License * along with this program; if not, see http://www.gnu.org/licenses or write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA, 02110-1301 USA, or download the license from the following URL: * http://www.sts-tool.eu/License.php * * For more information, please contact STS-Tool group at this * address: ststool@disi.unitn.it * */ package eu.aniketos.wp1.ststool.analysis.dialog.internal; import java.util.ArrayList; import java.util.List; import org.eclipse.draw2d.ColorConstants; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ITableColorProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import eu.aniketos.wp1.ststool.analysis.ImageManager; import eu.aniketos.wp1.ststool.analysis.results.IResult.ResultType; public class ConsoleForResultsTable { private TableViewer tableViewer; private List<ConsoleObject> mainNodes = new ArrayList<ConsoleObject>(); public Composite getComposite(final Composite parent){ Composite composite = new Composite(parent, SWT.NONE); composite.setBackground(ColorConstants.red); composite.setLayout(new FillLayout()); tableViewer = new TableViewer(composite, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION | SWT.HIDE_SELECTION | SWT.NO_FOCUS) { }; tableViewer.getTable().addListener(SWT.EraseItem, new Listener() { public void handleEvent(Event event){ event.detail &= ~SWT.HOT; if ((event.detail & SWT.SELECTED) == 0) return; /// item not selected Table table = (Table) event.widget; TableItem item = (TableItem) event.item; int clientWidth = table.getClientArea().width; GC gc = event.gc; Color oldForeground = gc.getForeground(); Color oldBackground = gc.getBackground(); gc.setBackground(item.getBackground()); gc.setForeground(item.getForeground()); gc.fillRectangle(0, event.y, clientWidth, event.height); gc.setForeground(oldForeground); gc.setBackground(oldBackground); event.detail &= ~SWT.SELECTED; } }); TableViewerColumn treeViewerColumn = new TableViewerColumn(tableViewer, SWT.FULL_SELECTION | SWT.HIDE_SELECTION | SWT.NO_FOCUS); TableColumn trclmnNewColumn = treeViewerColumn.getColumn(); trclmnNewColumn.setWidth(300); TableViewerColumn treeViewerColumn_1 = new TableViewerColumn(tableViewer, SWT.FULL_SELECTION | SWT.HIDE_SELECTION | SWT.NO_FOCUS); TableColumn trclmnNewColumn_1 = treeViewerColumn_1.getColumn(); trclmnNewColumn_1.setWidth(100); composite.addControlListener(new TableCompositeAdapter(composite, tableViewer.getTable(), treeViewerColumn.getColumn(), treeViewerColumn_1.getColumn())); tableViewer.setLabelProvider(new ConsoleObjectLabelProvider()); tableViewer.setContentProvider(new ArrayContentProvider()); return composite; } public void addLine(String text,String text2){ addLine((Image) null, text, text2, null, null); } public void addLine(String text,String text2,Color foreColor1,Color foreColor2){ addLine((Image) null, text, text2, foreColor1, foreColor2); } public void addLine(ResultType type,String text,String text2){ addLine(getImageForResult(type), text, text2, null, null); } public void addLine(ResultType type,String text,String text2,Color foreColor1,Color foreColor2){ addLine(getImageForResult(type), text, text2, foreColor1, foreColor2); } public void addLine(Image image,String text,String text2){ addLine(image, text, text2, null, null); } public void addLine(Image image,String text,String text2,Color foreColor1,Color foreColor2){ mainNodes.add(new ConsoleObject(image, text, text2, foreColor1, foreColor2)); updateTree(); } public void clear(){ mainNodes.clear(); updateTree(); } private void updateTree(){ if (tableViewer != null) { tableViewer.setInput(mainNodes); } } private Image getImageForResult(ResultType type){ if (type != null) { switch (type) { case OK: return ImageManager.getImage(ImageManager.OK_ICON); case WARNING: return ImageManager.getImage(ImageManager.WARNING_ICON); case ERROR: return ImageManager.getImage(ImageManager.ERROR_ICON); } } return null; } private class ConsoleObjectLabelProvider extends LabelProvider implements ITableLabelProvider, ITableColorProvider { @Override public Image getColumnImage(Object element,int columnIndex){ switch (columnIndex) { case 0: return ((ConsoleObject) element).image; } return null; } @Override public String getColumnText(Object element,int columnIndex){ switch (columnIndex) { case 0: return ((ConsoleObject) element).text; case 1: return ((ConsoleObject) element).text2; } return "?"; //$NON-NLS-1$ } @Override public Color getBackground(Object element,int columnIndex){ if (columnIndex == 1) { //return ((ConsoleObject)element).backColor; } return null; } @Override public Color getForeground(Object element,int columnIndex){ switch (columnIndex) { case 0: return ((ConsoleObject) element).foreColor1; case 1: return ((ConsoleObject) element).foreColor2; } return null; } } /** * Manage the table column resizing */ private class TableCompositeAdapter extends ControlAdapter { private Composite composite; private Table table; TableColumn col1; TableColumn col2; public TableCompositeAdapter(Composite composite, Table table, TableColumn col1, TableColumn col2) { super(); this.composite = composite; this.table = table; this.col1 = col1; this.col2 = col2; } @Override public void controlResized(ControlEvent e){ Rectangle area = composite.getClientArea(); Point preferredSize = table.computeSize(SWT.DEFAULT, SWT.DEFAULT); int width = area.width - 2 * table.getBorderWidth(); if (preferredSize.y > area.height + table.getHeaderHeight()) { // Subtract the scrollbar width from the total column width // if a vertical scrollbar will be required Point vBarSize = table.getVerticalBar().getSize(); width -= vBarSize.x; } Point oldSize = table.getSize(); //calcluate column size int col2size = 200; int x = (int) ((width / 100.0) * 30); if (col2size > x) col2size = x; int col1size = width - col2size; //System.out.println(width+" "+firstColumnWidth+" "+centralColumnWidth+" "+lastColumnWidth); if (oldSize.x > area.width) { // table is getting smaller so make the columns // smaller first and then resize the table to // match the client area width col1.setWidth(col1size); col2.setWidth(col2size); table.setSize(area.width, area.height); } else { // table is getting bigger so make the table // bigger first and then make the columns wider // to match the client area width table.setSize(area.width, area.height); col1.setWidth(col1size); col2.setWidth(col2size); } } } private class ConsoleObject { String text; String text2; Image image = null; Color foreColor1 = null; Color foreColor2 = null; ConsoleObject(Image image, String text, String text2, Color foreColor1, Color foreColor2) { if (text == null) text = ""; //$NON-NLS-1$ this.text = text; this.text2 = text2; this.image = image; this.foreColor1 = foreColor1; this.foreColor2 = foreColor2; } } }