/* * 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.risk; import java.util.HashMap; import java.util.Map; import org.deidentifier.arx.gui.Controller; import org.deidentifier.arx.gui.model.Model; import org.deidentifier.arx.gui.model.ModelEvent; import org.deidentifier.arx.gui.model.ModelEvent.ModelPart; import org.deidentifier.arx.gui.model.ModelRisk.ViewRiskType; import org.deidentifier.arx.gui.resources.Resources; import org.deidentifier.arx.gui.view.def.ILayout; import org.deidentifier.arx.gui.view.def.IView; import org.deidentifier.arx.gui.view.impl.common.ComponentTitledFolder; import org.deidentifier.arx.gui.view.impl.common.ComponentTitledFolderButtonBar; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.ToolItem; /** * Base class for layouts in this perspective * @author Fabian Prasser */ public class LayoutRisksAbstract implements ILayout, IView { /** Model */ private final Map<Integer, ViewRisks<?>> views = new HashMap<Integer, ViewRisks<?>>(); /** Model */ private final Map<Composite, String> helpids = new HashMap<Composite, String>(); /** Model */ private final boolean isInput; /** Model */ private final boolean isTop; /** Model */ protected Model model; /** Controller */ private final Controller controller; /** View */ private final Image imageEnabled; /** View */ private final Image imageDisabled; /** View */ private final ToolItem buttonSubset; /** View */ private final ToolItem buttonEnable; /** View */ private final ComponentTitledFolder folder; /** * Creates a new instance * @param parent * @param controller * @param input * @param top */ public LayoutRisksAbstract(Composite parent, final Controller controller, boolean input, boolean top) { this.isInput = input; this.isTop = top; this.controller = controller; this.imageEnabled = controller.getResources().getManagedImage("tick.png"); //$NON-NLS-1$ this.imageDisabled = controller.getResources().getManagedImage("cross.png"); //$NON-NLS-1$ controller.addListener(ModelPart.OUTPUT, this); controller.addListener(ModelPart.INPUT, this); controller.addListener(ModelPart.SELECTED_VIEW_CONFIG, this); controller.addListener(ModelPart.MODEL, this); ComponentTitledFolderButtonBar bar = new ComponentTitledFolderButtonBar(isTop ? "help.risk.overview" : "help.risk.overview", helpids); //$NON-NLS-1$ //$NON-NLS-2$ if (isTop) { bar.add(Resources.getMessage("DataView.3"), //$NON-NLS-1$ controller.getResources().getManagedImage("sort_subset.png"), //$NON-NLS-1$ true, new Runnable() { @Override public void run() { controller.actionDataToggleSubset(); } }); } bar.add(Resources.getMessage("StatisticsView.3"), //$NON-NLS-1$ imageEnabled, true, new Runnable() { @Override public void run() { updateEnableImage(); pushEnableState(); } }); this.folder = new ComponentTitledFolder(parent, controller, bar, null); this.folder.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent arg0) { pullEnableState(); } }); this.buttonEnable = folder.getButtonItem(Resources.getMessage("StatisticsView.3")); //$NON-NLS-1$ this.buttonSubset = folder.getButtonItem(Resources.getMessage("DataView.3")); //$NON-NLS-1$ if (this.buttonSubset != null) { this.buttonSubset.setEnabled(false); } } /** * Adds a selection listener. * * @param listener */ public void addSelectionListener(final SelectionListener listener) { folder.addSelectionListener(listener); } @Override public void dispose() { controller.removeListener(this); } /** * Returns the selected type of view */ public ViewRiskType getSelectedViewType() { return this.getViewForSelectionIndex(getSelectionIndex()).getViewType(); } /** * Returns the selection index. * * @return */ public int getSelectionIndex() { return folder.getSelectionIndex(); } /** * Returns the according view type * @param index * @return */ public ViewRisks<?> getViewForSelectionIndex(final int index) { return this.views.get(index); } @Override public void reset() { if (buttonSubset != null) { buttonSubset.setEnabled(false); } buttonEnable.setEnabled(false); } /** * Sets the selection index. * * @param index */ public void setSelectionIdex(final int index) { folder.setSelection(index); pullEnableState(); } @Override public void update(ModelEvent event) { // Update model if (event.part == ModelPart.MODEL) { model = (Model) event.data; reset(); pullEnableState(); } // Update subset if (this.isTop) { updateButtonSubset(event); } } /** * Pulls the state from the model * @param event */ private void pullEnableState() { if (model == null) { return; } ViewRisks<?> view = getViewForSelectionIndex(this.getSelectionIndex()); if (view == null) { buttonEnable.setEnabled(false); buttonEnable.setSelection(true); updateEnableImage(); } else { boolean enabled; if (this.isInput) { enabled = model.getRiskModel().isViewEnabledForInput(view.getViewType()); buttonEnable.setSelection(enabled); if (view.isEnabled() != enabled) { view.setEnabled(enabled); } } else { enabled = model.getRiskModel().isViewEnabledForOutput(view.getViewType()); buttonEnable.setSelection(enabled); if (view.isEnabled() != enabled) { view.setEnabled(enabled); } } buttonEnable.setEnabled(true); updateEnableImage(); } } /** * Pushes the state into the model */ private void pushEnableState() { if (model == null) { return; } ViewRisks<?> view = getViewForSelectionIndex(this.getSelectionIndex()); if (view != null) { boolean enabled = buttonEnable.getSelection(); if (this.isInput) { if (enabled != model.getRiskModel().isViewEnabledForInput(view.getViewType())) { model.getRiskModel().setViewEnabledForInput(view.getViewType(), enabled); view.setEnabled(enabled); } } else { if (enabled != model.getRiskModel().isViewEnabledForOutput(view.getViewType())) { model.getRiskModel().setViewEnabledForOutput(view.getViewType(), enabled); view.setEnabled(enabled); } } } } /** * Updates the subset button * @param event */ private void updateButtonSubset(ModelEvent event) { // Enable/Disable sort button if (event.part == ModelPart.OUTPUT || event.part == ModelPart.INPUT || event.part == ModelPart.SELECTED_VIEW_CONFIG) { if (model != null && model.getOutput() != null){ buttonSubset.setEnabled(true); } else { buttonSubset.setEnabled(false); } } if (event.part == ModelPart.SELECTED_VIEW_CONFIG) { buttonSubset.setSelection(model.getViewConfig().isSubset()); } } /** * Action for the according button */ private void updateEnableImage(){ if (buttonEnable.getSelection()) { buttonEnable.setImage(imageEnabled); } else { buttonEnable.setImage(imageDisabled); } } /** * Creates a new tab * @param title * @return */ protected Composite createTab(String title, String helpid) { final Composite item = folder.createItem(title, null); item.setLayout(new FillLayout()); helpids.put(item, helpid); return item; } /** * Registers a new view * @param index * @param view */ protected void registerView(int index, ViewRisks<?> view) { this.views.put(index, view); } }