eu.hansolo.medusa.TimeSection Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of Medusa Show documentation
Show all versions of Medusa Show documentation
Medusa is a JavaFX 8 library containing gauges and clocks
/*
* Copyright (c) 2016 by Gerrit Grunwald
*
* 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 eu.hansolo.medusa;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.event.EventTarget;
import javafx.event.EventType;
import javafx.scene.image.Image;
import javafx.scene.paint.Color;
import java.time.LocalTime;
/**
* Created by hansolo on 31.01.16.
*/
public class TimeSection implements Comparable {
public final TimeSectionEvent ENTERED_EVENT = new TimeSectionEvent(this, null, TimeSectionEvent.TIME_SECTION_ENTERED);
public final TimeSectionEvent LEFT_EVENT = new TimeSectionEvent(this, null, TimeSectionEvent.TIME_SECTION_LEFT);
private LocalTime _start;
private ObjectProperty start;
private LocalTime _stop;
private ObjectProperty stop;
private String _text;
private StringProperty text;
private Image _icon;
private ObjectProperty icon;
private Color _color;
private ObjectProperty color;
private Color _highlightColor;
private ObjectProperty highlightColor;
private Color _textColor;
private ObjectProperty textColor;
private LocalTime checkedValue;
// ******************** Constructors **************************************
/**
* Represents an area of a given range, defined by a start and stop time.
* This class is used for regions and areas in many clocks. It is possible
* to check a time against the defined range and fire events in case the
* value enters or leaves the defined region.
*/
public TimeSection() {
this(LocalTime.now(), LocalTime.now(), "", null, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT);
}
public TimeSection(final LocalTime START, final LocalTime STOP) {
this(START, STOP, "", null, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT);
}
public TimeSection(final LocalTime START, final LocalTime STOP, final Color COLOR) {
this(START, STOP, "", null, COLOR, COLOR, Color.TRANSPARENT);
}
public TimeSection(final LocalTime START, final LocalTime STOP, final Color COLOR, final Color HIGHLIGHT_COLOR) {
this(START, STOP, "", null, COLOR, HIGHLIGHT_COLOR, Color.TRANSPARENT);
}
public TimeSection(final LocalTime START, final LocalTime STOP, final Image ICON, final Color COLOR) {
this(START, STOP, "", ICON, COLOR, COLOR, Color.WHITE);
}
public TimeSection(final LocalTime START, final LocalTime STOP, final String TEXT, final Color COLOR) {
this(START, STOP, TEXT, null, COLOR, COLOR, Color.WHITE);
}
public TimeSection(final LocalTime START, final LocalTime STOP, final String TEXT, final Color COLOR, final Color TEXT_COLOR) {
this(START, STOP, TEXT, null, COLOR, COLOR, TEXT_COLOR);
}
public TimeSection(final LocalTime START, final LocalTime STOP, final String TEXT, final Image ICON, final Color COLOR, final Color TEXT_COLOR) {
this(START, STOP, TEXT, ICON, COLOR, COLOR, TEXT_COLOR);
}
public TimeSection(final LocalTime START, final LocalTime STOP, final String TEXT, final Image ICON, final Color COLOR, final Color HIGHLIGHT_COLOR, final Color TEXT_COLOR) {
_start = START;
_stop = STOP;
_text = TEXT;
_icon = ICON;
_color = COLOR;
_highlightColor = HIGHLIGHT_COLOR;
_textColor = TEXT_COLOR;
checkedValue = LocalTime.MIN;
}
// ******************** Methods *******************************************
/**
* Returns the time when the section begins.
* @return the time when the section begins
*/
public LocalTime getStart() { return null == start ? _start : start.get(); }
/**
* Defines the time when the section starts.
* @param START
*/
public void setStart(final LocalTime START) {
if (null == start) {
_start = START;
} else {
start.set(START);
}
}
public ObjectProperty startProperty() {
if (null == start) { start = new SimpleObjectProperty<>(TimeSection.this, "start", _start); }
return start;
}
/**
* Returns the time when the section ends.
* @return the time when the section ends
*/
public LocalTime getStop() { return null == stop ? _stop : stop.get(); }
/**
* Defines the time when the section ends
* @param STOP
*/
public void setStop(final LocalTime STOP) {
if (null == stop) {
_stop = STOP;
} else {
stop.set(STOP);
}
}
public ObjectProperty stopProperty() {
if (null == stop) { stop = new SimpleObjectProperty<>(TimeSection.this, "stop", _stop); }
return stop;
}
/**
* Returns the text that was set for the section.
* @return the text that was set for the section
*/
public String getText() { return null == text ? _text : text.get(); }
/**
* Defines the text for the section
* @param TEXT
*/
public void setText(final String TEXT) {
if (null == text) {
_text = TEXT;
} else {
text.set(TEXT);
}
}
public StringProperty textProperty() {
if (null == text) { text = new SimpleStringProperty(TimeSection.this, "text", _text); }
return text;
}
/**
* Returns the image that was defined for the section.
* @return the image that was defined for the section
*/
public Image getImage() { return null == icon ? _icon : icon.get(); }
/**
* Defines an image for the section.
* @param IMAGE
*/
public void setIcon(final Image IMAGE) {
if (null == icon) {
_icon = IMAGE;
} else {
icon.set(IMAGE);
}
}
public ObjectProperty iconProperty() {
if (null == icon) { icon = new SimpleObjectProperty<>(this, "icon", _icon); }
return icon;
}
/**
* Returns the color that will be used to colorize the section
* in a clock.
* @return the color that will be used to colorize the section
*/
public Color getColor() { return null == color ? _color : color.get(); }
/**
* Defines the color that will be used to colorize the section
* in a clock.
* @param COLOR
*/
public void setColor(final Color COLOR) {
if (null == color) {
_color = COLOR;
} else {
color.set(COLOR);
}
}
public ObjectProperty colorProperty() {
if (null == color) { color = new SimpleObjectProperty<>(TimeSection.this, "color", _color); }
return color;
}
/**
* Returns the color that will be used to colorize the section in
* a gauge when it is highlighted.
* @return the color that will be used to colorize a highlighted section
*/
public Color getHighlightColor() { return null == highlightColor ? _highlightColor : highlightColor.get(); }
/**
* Defines the color that will be used to colorize a highlighted section
* @param COLOR
*/
public void setHighlightColor(final Color COLOR) {
if (null == highlightColor) {
_highlightColor = COLOR;
} else {
highlightColor.set(COLOR);
}
}
public ObjectProperty highlightColorProperty() {
if (null == highlightColor) { highlightColor = new SimpleObjectProperty<>(TimeSection.this, "highlightColor", _highlightColor); }
return highlightColor;
}
/**
* Returns the color that will be used to colorize the section text.
* @return the color that will bused to colorize the section text
*/
public Color getTextColor() { return null == textColor ? _textColor : textColor.get(); }
/**
* Defines the color that will be used to colorize the section text
* @param COLOR
*/
public void setTextColor(final Color COLOR) {
if (null == textColor) {
_textColor = COLOR;
} else {
textColor.set(COLOR);
}
}
public ObjectProperty textColorProperty() {
if (null == textColor) { textColor = new SimpleObjectProperty<>(TimeSection.this, "textColor", _textColor); }
return textColor;
}
/**
* Returns true if the given time is within the range between
* section.getStart() and section.getStop()
* @param VALUE
* @return true if the given time is within the range of the section
*/
public boolean contains(final LocalTime VALUE) {
return VALUE.isAfter(getStart()) && VALUE.isBefore(getStop());
}
/**
* Checks if the section contains the given time and fires an event
* in case the value "entered" or "left" the section. With this one
* can react if a time "enters"/"leaves" a specific region in a gauge.
* This can be useful to control things like switching lights on if
* the time enters the region and switching it of again when the time
* left the region.
* @param VALUE
*/
public void checkForValue(final LocalTime VALUE) {
boolean wasInSection = contains(checkedValue);
boolean isInSection = contains(VALUE);
if (!wasInSection && isInSection) {
fireTimeSectionEvent(ENTERED_EVENT);
} else if (wasInSection && !isInSection) {
fireTimeSectionEvent(LEFT_EVENT);
}
checkedValue = VALUE;
}
public boolean equals(final TimeSection SECTION) {
return (SECTION.getStart().equals(getStart()) &&
SECTION.getStop().equals(getStop()) &&
SECTION.getText().equals(getText()));
}
@Override public int compareTo(final TimeSection SECTION) {
if (getStart().isBefore(SECTION.getStart())) return -1;
if (getStart().isAfter(SECTION.getStart())) return 1;
return 0;
}
@Override public String toString() {
return new StringBuilder()
.append("{\n")
.append("\"text\":\"").append(getText()).append("\",\n")
.append("\"startValue\":").append(getStart()).append(",\n")
.append("\"stopValue\":").append(getStop()).append(",\n")
.append("\"color\":\"").append(getColor().toString().substring(0,8).replace("0x", "#")).append("\",\n")
.append("\"highlightColor\":\"").append(getHighlightColor().toString().substring(0,8).replace("0x", "#")).append("\",\n")
.append("\"textColor\":\"").append(getTextColor().toString().substring(0,8).replace("0x", "#")).append("\"\n")
.append("}")
.toString();
}
// ******************** Event handling ************************************
public final ObjectProperty> onTimeSectionEnteredProperty() { return onTimeSectionEntered; }
public final void setOnTimeSectionEntered(EventHandler value) { onTimeSectionEnteredProperty().set(value); }
public final EventHandler getOnTimeSectionEntered() { return onTimeSectionEnteredProperty().get(); }
private ObjectProperty> onTimeSectionEntered = new SimpleObjectProperty<>(this, "onTimeSectionEntered");
public final ObjectProperty> onTimeSectionLeftProperty() { return onTimeSectionLeft; }
public final void setOnTimeSectionLeft(EventHandler value) { onTimeSectionLeftProperty().set(value); }
public final EventHandler getOnTimeSectionLeft() { return onTimeSectionLeftProperty().get(); }
private ObjectProperty> onTimeSectionLeft = new SimpleObjectProperty<>(this, "onTimeSectionLeft");
public void fireTimeSectionEvent(final TimeSectionEvent EVENT) {
final EventHandler HANDLER;
final EventType TYPE = EVENT.getEventType();
if (TimeSectionEvent.TIME_SECTION_ENTERED == TYPE) {
HANDLER = getOnTimeSectionEntered();
} else if (TimeSectionEvent.TIME_SECTION_LEFT == TYPE) {
HANDLER = getOnTimeSectionLeft();
} else {
HANDLER = null;
}
if (null == HANDLER) return;
HANDLER.handle(EVENT);
}
// ******************** Inner Classes *************************************
public static class TimeSectionEvent extends Event {
public static final EventType TIME_SECTION_ENTERED = new EventType(ANY, "TIME_SECTION_ENTERED");
public static final EventType TIME_SECTION_LEFT = new EventType(ANY, "TIME_SECTION_LEFT");
// ******************** Constructors **************************************
public TimeSectionEvent(final Object SOURCE, final EventTarget TARGET, EventType TYPE) {
super(SOURCE, TARGET, TYPE);
}
}
}