/* * 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.common; import java.io.IOException; import java.io.InputStream; import org.deidentifier.arx.gui.Controller; import org.deidentifier.arx.gui.resources.Resources; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; /** * This class implements a wrapper around a control that displays the current status: * (1) nothing to display, (2) working, (3) done (shows the control). * * @author Fabian Prasser */ public class ComponentStatus { /** View */ private final Controller controller; /** View */ private final StackLayout layout; /** View */ private final Composite working; /** View */ private final Composite empty; /** View */ private final Composite parent; /** View */ private final Control child; /** * Creates a new instance. * * @param controller * @param parent * @param child */ public ComponentStatus(Controller controller, Composite parent, Control child) { this(controller, parent, child, null); } /** * Creates a new instance. * * @param controller * @param parent * @param child * @param provider */ public ComponentStatus(Controller controller, Composite parent, Control child, ComponentStatusLabelProgressProvider progressProvider){ this.child = child; this.parent = parent; this.controller = controller; if (parent.getLayout() == null || !(parent.getLayout() instanceof StackLayout)) { throw new RuntimeException("Parent must have a StackLayout"); //$NON-NLS-1$ } this.layout = (StackLayout)parent.getLayout(); this.working = getWorkingComposite(parent, progressProvider); this.empty = getEmptyComposite(parent); this.layout.topControl = child; this.parent.layout(true); } /** * Is the current status visible. * * @return */ public boolean isVisible(){ return this.parent.isVisible(); } /** * Enables status 'done'. Shows the actual control. */ public void setDone(){ this.layout.topControl = child; this.parent.layout(); } /** * Enables status 'empty'. */ public void setEmpty(){ this.layout.topControl = empty; this.parent.layout(); } /** * Enables status 'working'. */ public void setWorking(){ this.layout.topControl = working; this.parent.layout(); } /** * Creates a composite for the empty status. * * @param parent * @return */ private Composite getEmptyComposite(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new FillLayout()); ComponentStatusLabel label = new ComponentStatusLabel(composite, SWT.CENTER); label.setText(Resources.getMessage("ComponentStatus.1")); //$NON-NLS-1$ return composite; } /** * Creates a composite for the working status. * * @param parent * @return */ private Composite getWorkingComposite(Composite parent, ComponentStatusLabelProgressProvider provider) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new FillLayout()); ComponentStatusLabel label = new ComponentStatusLabel(composite, SWT.CENTER); InputStream stream = controller.getResources().getStream("working.gif"); //$NON-NLS-1$ try { label.setGIF(stream); } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { // Ignore silently } } } label.setText(Resources.getMessage("ComponentStatus.3")); //$NON-NLS-1$ if (provider != null) { label.setProgressProvider(provider); } return composite; } }