/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2012 Neil C Smith. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 3 for more details. * * You should have received a copy of the GNU General Public License version 3 * along with this work; if not, see http://www.gnu.org/licenses/ * * * Please visit http://neilcsmith.net if you need additional information or * have any questions. */ package net.neilcsmith.praxis.live.pxr; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.HashSet; import java.util.Set; import net.neilcsmith.praxis.live.core.api.RootLifecycleHandler; import net.neilcsmith.praxis.live.core.api.Task; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; import org.openide.util.lookup.ServiceProvider; /** * * @author Neil C Smith <http://neilcsmith.net> */ @ServiceProvider(service=RootLifecycleHandler.class) public class RootLifecycleHandlerImpl extends RootLifecycleHandler { @Override public Task getDeletionTask(String description, Set<String> rootIDs) { Set<PXRDataObject> dobs = new HashSet<PXRDataObject>(); for (String rootID : rootIDs) { PXRRootProxy root = PXRRootRegistry.getDefault().getRootByID(rootID); if (root instanceof PXRRootProxy) { dobs.add( ((PXRRootProxy) root).getSource()); } } if (!dobs.isEmpty()) { // return SaveTask.createSaveTask(dobs); return new DeletionSaveTask(description, dobs); } else { return null; } } private static class DeletionSaveTask implements Task, PropertyChangeListener { private Set<PXRDataObject> dobs; private State state; private PropertyChangeSupport pcs; private SaveTask delegate; private String description; private DeletionSaveTask(String description, Set<PXRDataObject> dobs) { this.description = description; this.dobs = dobs; this.state = State.NEW; pcs = new PropertyChangeSupport(this); } @Override public State execute() { if (state != State.NEW) { throw new IllegalStateException(); } updateState(State.RUNNING); NotifyDescriptor nd = new NotifyDescriptor.Confirmation(buildDialogMessage(), description); Object ret = DialogDisplayer.getDefault().notify(nd); if (ret == NotifyDescriptor.YES_OPTION) { // save delegate = SaveTask.createSaveTask(dobs); delegate.addPropertyChangeListener(this); return delegate.execute(); } else if (ret == NotifyDescriptor.NO_OPTION) { // don't save - pass completed so operation can continue updateState(State.COMPLETED); return state; } else { // pass cancelled back updateState(State.CANCELLED); return state; } } private String buildDialogMessage() { StringBuilder sb = new StringBuilder("Save changes to"); for (PXRDataObject dob : dobs) { sb.append(" /"); sb.append(dob.getName()); } sb.append("?"); return sb.toString(); } private void updateState(State state) { State old = this.state; this.state = state; pcs.firePropertyChange(PROP_STATE, old, state); } @Override public State getState() { return state; } @Override public void addPropertyChangeListener(PropertyChangeListener listener) { pcs.addPropertyChangeListener(listener); } @Override public void removePropertyChangeListener(PropertyChangeListener listener) { pcs.removePropertyChangeListener(listener); } @Override public boolean cancel() { if (delegate != null) { return delegate.cancel(); } else { return false; } } @Override public void propertyChange(PropertyChangeEvent pce) { if (delegate.getState() != this.state) { updateState(delegate.getState()); } } } }