/*
* Freeplane - mind map editor
* Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
*
* This file is modified by Dimitry Polivaev in 2008.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.freeplane.view.swing.features.time.mindmapmode;
import java.util.Date;
import java.util.Timer;
import org.freeplane.core.extension.IExtension;
import org.freeplane.core.util.SysUtils;
import org.freeplane.features.map.IMapChangeListener;
import org.freeplane.features.map.MapChangeEvent;
import org.freeplane.features.map.NodeModel;
import org.freeplane.features.mode.Controller;
/**
* @author Dimitry Polivaev 30.11.2008
*/
public class ReminderExtension implements IExtension, IMapChangeListener {
static final int BLINKING_PERIOD = 1000;
/**
*/
public static ReminderExtension getExtension(final NodeModel node) {
return (ReminderExtension) node.getExtension(ReminderExtension.class);
}
private final NodeModel node;
private long remindUserAt = 0;
private PeriodUnit periodUnit;
private int period;
private Timer timer;
private String script;
private TimerBlinkTask task;
public ReminderExtension(final NodeModel node) {
this.node = node;
}
public NodeModel getNode() {
return node;
}
public long getRemindUserAt() {
return remindUserAt;
}
public void setRemindUserAt(final long remindUserAt) {
this.remindUserAt = remindUserAt;
}
public PeriodUnit getPeriodUnit() {
return periodUnit;
}
public void setPeriodUnit(PeriodUnit periodUnit) {
this.periodUnit = periodUnit;
}
public String getPeriodUnitAsString() {
return periodUnit == null ? null : periodUnit.name();
}
public void setPeriodUnitAsString(String periodUnit) {
this.periodUnit = PeriodUnit.valueOf(periodUnit);
}
public int getPeriod() {
return period;
}
public void setPeriod(int period) {
this.period = period;
}
public String getScript() {
return script;
}
public void setScript(String script) {
this.script = script;
}
public void scheduleTimer(final TimerBlinkTask task, final Date date) {
if (timer == null) {
timer = SysUtils.createTimer(getClass().getSimpleName());
}
timer.schedule(task, date, BLINKING_PERIOD);
this.task = task;
}
public void deactivateTimer() {
if (timer == null) {
return;
}
timer.cancel();
timer = null;
task = null;
}
private void displayStateIcon(final NodeModel parent, final ClockState state) {
if (task != null || ! task.alreadyExecuted() || !isAncestorNode(parent)) {
return;
}
displayState(state, parent, true);
}
private boolean isAncestorNode(final NodeModel parent) {
for (NodeModel n = node; n != null; n = n.getParentNode()) {
if (n.equals(parent)) {
return true;
}
}
return false;
}
public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
displayStateIcon(parent, ClockState.CLOCK_VISIBLE);
}
public void onNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
final NodeModel child, final int newIndex) {
displayStateIcon(newParent, ClockState.CLOCK_VISIBLE);
}
public void onPreNodeDelete(final NodeModel oldParent, final NodeModel selectedNode, final int index) {
displayStateIcon(oldParent, null);
}
public void onPreNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
final NodeModel child, final int newIndex) {
displayStateIcon(oldParent, null);
}
public void mapChanged(final MapChangeEvent event) {
}
public void onNodeDeleted(final NodeModel parent, final NodeModel child, final int index) {
}
public void displayState(final ClockState stateAdded, final NodeModel pNode,
final boolean recurse) {
if(stateAdded != null)
pNode.putExtension(stateAdded);
else
pNode.removeExtension(ClockState.class);
Controller.getCurrentModeController().getMapController().nodeRefresh(pNode);
if (!recurse) {
return;
}
final NodeModel parentNode = pNode.getParentNode();
if (parentNode == null) {
return;
}
displayState(stateAdded, parentNode, recurse);
}
}