/*
* Copyright (c) 2016 Fraunhofer IGD
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* Fraunhofer IGD <http://www.igd.fraunhofer.de/>
*/
package de.fhg.igd.mapviewer.server.wms.overlay;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.jdesktop.swingx.mapviewer.TileOverlayPainter;
import de.fhg.igd.eclipse.util.extension.AbstractObjectFactory;
import de.fhg.igd.eclipse.util.extension.ExtensionObjectDefinition;
import de.fhg.igd.eclipse.util.extension.ExtensionObjectFactory;
import de.fhg.igd.eclipse.util.extension.ExtensionObjectFactoryCollection;
import de.fhg.igd.mapviewer.AbstractTileOverlayPainter;
import de.fhg.igd.mapviewer.server.wms.Messages;
import de.fhg.igd.mapviewer.server.wms.WMSConfiguration;
import de.fhg.igd.mapviewer.server.wms.wizard.WMSConfigurationWizard;
import de.fhg.igd.mapviewer.view.overlay.TileOverlayFactory;
import de.fhg.igd.mapviewer.view.overlay.TileOverlayFactoryCollection;
/**
* Collection of {@link WMSTileOverlay} factories
*
* @author Simon Templer
*/
public class WMSTileOverlayCollection implements TileOverlayFactoryCollection {
/**
* Factory for {@link WMSTileOverlay}s
*/
public class OverlayFactory extends AbstractObjectFactory<TileOverlayPainter>
implements TileOverlayFactory {
private final String name;
/**
* Constructor
*
* @param name the WMS overlay name
*/
public OverlayFactory(String name) {
super();
this.name = name;
}
/**
* @see ExtensionObjectFactory#createExtensionObject()
*/
@Override
public TileOverlayPainter createExtensionObject() throws Exception {
WMSTileOverlay result = new WMSTileOverlay(name);
result.setPriority(priority);
return result;
}
/**
* @see ExtensionObjectDefinition#getDisplayName()
*/
@Override
public String getDisplayName() {
return name;
}
/**
* @see ExtensionObjectDefinition#getIdentifier()
*/
@Override
public String getIdentifier() {
return getTypeName() + ":" + getDisplayName(); //$NON-NLS-1$
}
/**
* @see ExtensionObjectDefinition#getTypeName()
*/
@Override
public String getTypeName() {
return WMSTileOverlay.class.getName();
}
/**
* @see AbstractObjectFactory#allowConfigure()
*/
@Override
public boolean allowConfigure() {
return true;
}
/**
* @see AbstractObjectFactory#configure()
*/
@Override
public boolean configure() {
try {
WMSTileOverlay server = (WMSTileOverlay) createExtensionObject();
return WMSTileOverlayCollection.this.configure(server, true);
} catch (Exception e) {
return false;
}
}
/**
* @see ExtensionObjectFactory#dispose(Object)
*/
@Override
public void dispose(TileOverlayPainter instance) {
instance.dispose();
}
/**
* @see TileOverlayFactory#showInMiniMap()
*/
@Override
public boolean showInMiniMap() {
return true;
}
}
private static final Log log = LogFactory.getLog(WMSTileOverlayCollection.class);
private int priority = AbstractTileOverlayPainter.DEF_PRIORITY;
/**
* @see ExtensionObjectFactoryCollection#addNew()
*/
@Override
public TileOverlayFactory addNew() {
WMSTileOverlay overlay = new WMSTileOverlay();
if (configure(overlay, false)) {
return new OverlayFactory(overlay.getConfiguration().getName());
}
else {
return null;
}
}
/**
* Configure the given overlay
*
* @param overlay the overlay
* @param overwrite if the configuration may be overridden
* @return if the configuration was saved
*/
private boolean configure(WMSTileOverlay overlay, boolean overwrite) {
WMSConfiguration configuration = overlay.getConfiguration();
try {
final Display display = PlatformUI.getWorkbench().getDisplay();
WMSConfigurationWizard<WMSConfiguration> wizard = new WMSConfigurationWizard<WMSConfiguration>(
configuration, true, false);
WizardDialog dialog = new WizardDialog(display.getActiveShell(), wizard);
if (dialog.open() == WizardDialog.OK) {
configuration.save(overwrite);
return true;
}
else {
return false;
}
} catch (Exception e) {
log.error("Error creating WMS overlay", e); //$NON-NLS-1$
}
return false;
}
/**
* @see ExtensionObjectFactoryCollection#allowAddNew()
*/
@Override
public boolean allowAddNew() {
return true;
}
/**
* @see ExtensionObjectFactoryCollection#allowRemove()
*/
@Override
public boolean allowRemove() {
return true;
}
/**
* @see ExtensionObjectFactoryCollection#getFactories()
*/
@Override
public List<TileOverlayFactory> getFactories() {
List<TileOverlayFactory> results = new LinkedList<TileOverlayFactory>();
for (String name : WMSTileOverlay.getConfigurationNames()) {
results.add(new OverlayFactory(name));
}
return results;
}
/**
* @see ExtensionObjectFactoryCollection#getName()
*/
@Override
public String getName() {
return Messages.WMSTileOverlayCollection_1;
}
/**
* @see ExtensionObjectFactoryCollection#remove(ExtensionObjectFactory)
*/
@Override
public boolean remove(TileOverlayFactory factory) {
return WMSTileOverlay.removeConfiguration(factory.getDisplayName());
}
/**
* @see TileOverlayFactoryCollection#setPriority(int)
*/
@Override
public void setPriority(int priority) {
this.priority = priority;
}
}