/* * ARX: Powerful Data Anonymization * Copyright 2012 - 2017 Fabian Prasser, Florian Kohlmayer and contributors * * Licensed 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.deidentifier.arx.gui.view.impl.utility; import org.deidentifier.arx.gui.Controller; import org.deidentifier.arx.gui.model.ModelEvent.ModelPart; import org.deidentifier.arx.gui.view.impl.common.async.AnalysisContext; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import de.linearbits.jhc.JHC; import de.linearbits.jhc.JHCConfiguration; import de.linearbits.jhc.JHCGradient; import de.linearbits.jhc.JHCLayout; /** * This class displays a contingency table as a heat map. * TODO: Make the stuff in this class interruptible like anything else * @author Fabian Prasser */ public class ViewStatisticsContingencyHeatmap extends ViewStatistics<AnalysisContextContingency> { /** Static stuff. */ private static final int MAX_SIZE = 500; /** The heat map widget. */ private JHC jhc; /** The heat map configuration. */ private JHCGradient gradient; /** The heat map configuration. */ private JHCLayout layout; /** * Creates a new density plot. * * @param parent * @param controller * @param target * @param reset */ public ViewStatisticsContingencyHeatmap(final Composite parent, final Controller controller, final ModelPart target, final ModelPart reset) { super(parent, controller, target, reset, true); } @Override public LayoutUtility.ViewUtilityType getType() { return LayoutUtility.ViewUtilityType.CONTINGENCY; } @Override protected Control createControl(Composite parent) { this.jhc = new JHC(parent, SWT.DOUBLE_BUFFERED); this.gradient = JHCGradient.GRADIENT_HEAT; this.layout = new JHCLayout(2,10,20,2,15,2); // Update font settings Font font = jhc.getFont(); if (font != null) { FontData[] fd = font.getFontData(); if (fd != null && fd.length>0){ fd[0].setHeight(8); final Font _font = new Font(jhc.getDisplay(), fd[0]); jhc.setFont(_font); parent.addDisposeListener(new DisposeListener(){ public void widgetDisposed(DisposeEvent arg0) { if (_font != null && !_font.isDisposed()) { _font.dispose(); } } }); } } // Update status jhc.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent arg0) { setStatusDone(); } }); // Return return jhc.getControl(); } @Override protected AnalysisContextContingency createViewConfig(AnalysisContext context) { return new AnalysisContextContingency(context); } @Override protected void doReset() { jhc.setData(null, new JHCConfiguration("", "", MAX_SIZE, MAX_SIZE, gradient, layout)); //$NON-NLS-1$ //$NON-NLS-2$ setStatusEmpty(); } @Override protected void doUpdate(AnalysisContextContingency context) { int column1 = context.handle.getColumnIndexOf(context.attribute1); int column2 = context.handle.getColumnIndexOf(context.attribute2); jhc.setData(new DensityData(context.handle, column1, column2), new JHCConfiguration(context.attribute1, context.attribute2, MAX_SIZE, MAX_SIZE, gradient, layout)); } /** * Is an analysis running */ protected boolean isRunning() { return false; } }