SmartNotes/SmartNotes/src/com/madeorsk/smartnotes/ListBox.java

230 lines
6.3 KiB
Java

package com.madeorsk.smartnotes;
import java.util.HashMap;
import java.util.Map;
import javafx.animation.FadeTransition;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableBooleanValue;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Cursor;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.util.Duration;
public class ListBox extends ScrollPane
{
private VBox main;
private VBox listContainer;
private Runnable listChangeListener;
public ListBox()
{
this.setFitToHeight(true);
this.setFitToWidth(true);
this.main = new VBox();
this.main.setPadding(new Insets(0, 15, 0, 15));
this.listContainer = new VBox();
this.main.getChildren().add(this.listContainer);
final HBox addListItemBox = new HBox();
{
addListItemBox.getChildren().add(new ImageView(new Image("/com/madeorsk/smartnotes/res/AddCheckbox.png")));
Label addListItemLabel = new Label("Add a new item");
addListItemLabel.setPadding(new Insets(0, 0, 0, 13));
addListItemLabel.setId("text");
addListItemBox.getChildren().add(addListItemLabel);
addListItemBox.setAlignment(Pos.CENTER_LEFT);
addListItemBox.setCursor(Cursor.HAND);
// Fade and opacity
addListItemBox.setOpacity(0.4);
addListItemBox.setOnMouseEntered(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent e)
{
FadeTransition transition = new FadeTransition(Duration.millis(200), addListItemBox);
transition.setFromValue(0.4);
transition.setToValue(1.0);
transition.play();
}
});
addListItemBox.setOnMouseExited(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent e)
{
FadeTransition transition = new FadeTransition(Duration.millis(200), addListItemBox);
transition.setFromValue(1.0);
transition.setToValue(0.4);
transition.play();
}
});
addListItemBox.setOnMouseClicked(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent e)
{
ListBox.this.listContainer.getChildren().add(new ListBoxItem(""));
}
});
}
this.main.getChildren().add(addListItemBox);
this.setContent(this.main);
}
public void updateList(Map<String, Boolean> content)
{
this.listContainer.getChildren().clear();
for(String item : content.keySet())
this.listContainer.getChildren().add(new ListBoxItem(item).setChecked(content.get(item).booleanValue()));
}
public void setListChangeListener(Runnable listener)
{
this.listChangeListener = listener;
}
public Map<String, Boolean> getList()
{
Map<String, Boolean> list = new HashMap<String, Boolean>();
for(Node child : this.listContainer.getChildren())
{
ListBoxItem item = (ListBoxItem) child;
if (item.getText() != null && !item.getText().isEmpty())
list.put(item.getText(), item.isChecked());
}
return list;
}
private class ListBoxItem extends HBox
{
private ListCheckbox checkbox;
private TextField field;
public ListBoxItem(String text)
{
ChangeListener<Object> change = new ChangeListener<Object>()
{
@Override
public void changed(ObservableValue<? extends Object> ov, Object oldValue, Object newValue)
{
if (ListBox.this.listChangeListener != null)
ListBox.this.listChangeListener.run();
}
};
this.checkbox = new ListCheckbox();
this.checkbox.checkedProperty().addListener(change);
this.getChildren().add(this.checkbox);
this.field = new TextField(text);
this.field.setId("text");
this.field.prefWidthProperty().bind(ListBox.this.listContainer.widthProperty().subtract(this.checkbox.widthProperty()));
this.field.textProperty().addListener(change);
this.getChildren().add(this.field);
}
public String getText()
{
return this.field.getText();
}
public ListBoxItem setChecked(boolean checked)
{
this.checkbox.setChecked(checked);
return this;
}
public boolean isChecked()
{
return this.checkbox.isChecked();
}
private class ListCheckbox extends VBox
{
private BooleanProperty checked = new SimpleBooleanProperty();
public ListCheckbox()
{
this.setId("imageButton");
this.setAlignment(Pos.CENTER);
this.setCursor(Cursor.HAND);
this.getChildren().add(new ImageView(new Image("/com/madeorsk/smartnotes/res/Checkbox-unchecked.png")));
/*this.setOpacity(0.4);
this.setOnMouseEntered(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent e)
{
if (!ListCheckbox.this.isChecked())
{
FadeTransition transition = new FadeTransition(Duration.millis(200), ListCheckbox.this);
transition.setFromValue(0.4);
transition.setToValue(1.0);
transition.play();
}
}
});
this.setOnMouseExited(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent e)
{
if (!ListCheckbox.this.isChecked())
{
FadeTransition transition = new FadeTransition(Duration.millis(200), ListCheckbox.this);
transition.setFromValue(1.0);
transition.setToValue(0.4);
transition.play();
}
}
});*/
this.setOnMouseClicked(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent e)
{
if (ListCheckbox.this.isChecked())
ListCheckbox.this.setChecked(false);
else
ListCheckbox.this.setChecked(true);
}
});
}
public void setChecked(boolean checked)
{
this.checked.set(checked);
ListCheckbox.this.getChildren().clear();
if (checked)
ListCheckbox.this.getChildren().add(new ImageView(new Image("/com/madeorsk/smartnotes/res/Checkbox-checked.png")));
else
ListCheckbox.this.getChildren().add(new ImageView(new Image("/com/madeorsk/smartnotes/res/Checkbox-unchecked.png")));
}
public ObservableBooleanValue checkedProperty()
{
return this.checked;
}
public boolean isChecked()
{
return this.checked.get();
}
}
}
}