mirror of
https://github.com/robertvokac/time-calc.git
synced 2025-03-25 07:27:49 +01:00
patch19
This commit is contained in:
parent
3c4cdcbfec
commit
898d39d22b
@ -15,6 +15,8 @@ import org.nanoboot.utils.timecalc.utils.property.StringProperty;
|
|||||||
|
|
||||||
import javax.swing.ImageIcon;
|
import javax.swing.ImageIcon;
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JMenu;
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.Timer;
|
import javax.swing.Timer;
|
||||||
import java.awt.BasicStroke;
|
import java.awt.BasicStroke;
|
||||||
@ -22,10 +24,14 @@ import java.awt.Color;
|
|||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.event.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.awt.event.MouseListener;
|
import java.awt.event.MouseListener;
|
||||||
import java.awt.event.MouseMotionListener;
|
import java.awt.event.MouseMotionListener;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Robert Vokac
|
* @author Robert Vokac
|
||||||
@ -74,6 +80,7 @@ public class Widget extends JPanel implements
|
|||||||
private static final Color PURPLE_STRONGLY_COLORED = new Color(153,51,255);
|
private static final Color PURPLE_STRONGLY_COLORED = new Color(153,51,255);
|
||||||
private static final Color PURPLE_WEAKLY_COLORED = new Color(204,153,255);
|
private static final Color PURPLE_WEAKLY_COLORED = new Color(204,153,255);
|
||||||
|
|
||||||
|
private WidgetMenu widgetMenu = null;
|
||||||
public Widget() {
|
public Widget() {
|
||||||
setBackground(BACKGROUND_COLOR);
|
setBackground(BACKGROUND_COLOR);
|
||||||
new Timer(getTimerDelay(), e -> repaint()).start();
|
new Timer(getTimerDelay(), e -> repaint()).start();
|
||||||
@ -92,6 +99,7 @@ public class Widget extends JPanel implements
|
|||||||
&& y <= CLOSE_BUTTON_SIDE;
|
&& y <= CLOSE_BUTTON_SIDE;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
addMouseListener(new MouseListener() {
|
addMouseListener(new MouseListener() {
|
||||||
@Override
|
@Override
|
||||||
public void mouseClicked(MouseEvent e) {
|
public void mouseClicked(MouseEvent e) {
|
||||||
@ -105,17 +113,17 @@ public class Widget extends JPanel implements
|
|||||||
//nothing to do
|
//nothing to do
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (visibleProperty.isEnabled()) {
|
// if (visibleProperty.isEnabled()) {
|
||||||
Visibility visibility
|
// Visibility visibility
|
||||||
= Visibility.valueOf(visibilityProperty.getValue());
|
// = Visibility.valueOf(visibilityProperty.getValue());
|
||||||
if (visibility.isStronglyColored()) {
|
// if (visibility.isStronglyColored()) {
|
||||||
visibilityProperty
|
// visibilityProperty
|
||||||
.setValue(Visibility.WEAKLY_COLORED.name());
|
// .setValue(Visibility.WEAKLY_COLORED.name());
|
||||||
} else {
|
// } else {
|
||||||
visibilityProperty
|
// visibilityProperty
|
||||||
.setValue(Visibility.STRONGLY_COLORED.name());
|
// .setValue(Visibility.STRONGLY_COLORED.name());
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -138,6 +146,46 @@ public class Widget extends JPanel implements
|
|||||||
mouseOver = false;
|
mouseOver = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Widget widget = this;
|
||||||
|
addMouseListener(new MouseAdapter() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mousePressed(MouseEvent e) {
|
||||||
|
showPopup(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseReleased(MouseEvent e) {
|
||||||
|
showPopup(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showPopup(MouseEvent e) {
|
||||||
|
if(widgetMenu == null) {
|
||||||
|
widgetMenu = new WidgetMenu(widget, createRefreshConsumer());
|
||||||
|
List<JMenu> additionalMenus = createAdditionalMenus();
|
||||||
|
if(additionalMenus != null) {
|
||||||
|
additionalMenus.forEach(m-> widgetMenu.add(m));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
widgetMenu.refresh();
|
||||||
|
widgetMenu.markAsSelected(WidgetType.valueOf(typeProperty.getValue().toUpperCase(
|
||||||
|
Locale.ROOT)));
|
||||||
|
if (e.isPopupTrigger()) {
|
||||||
|
widgetMenu.show(e.getComponent(),
|
||||||
|
e.getX(), e.getY());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
protected Consumer<Object> createRefreshConsumer() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
protected List<JMenu> createAdditionalMenus() {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getTimerDelay() {
|
public int getTimerDelay() {
|
||||||
|
@ -0,0 +1,116 @@
|
|||||||
|
package org.nanoboot.utils.timecalc.swing.common;
|
||||||
|
|
||||||
|
import org.nanoboot.utils.timecalc.app.TimeCalcException;
|
||||||
|
import org.nanoboot.utils.timecalc.entity.WidgetType;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.progress.Battery;
|
||||||
|
|
||||||
|
import javax.swing.JMenu;
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
|
import javax.swing.JPopupMenu;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author pc00289
|
||||||
|
* @since 21.03.2024
|
||||||
|
*/
|
||||||
|
public class WidgetMenu extends JPopupMenu {
|
||||||
|
private final JMenuItem typeMinuteMenuItem;
|
||||||
|
private final JMenuItem typeHourMenuItem;
|
||||||
|
private final JMenuItem typeDayMenuItem;
|
||||||
|
private final JMenuItem typeWeekMenuItem;
|
||||||
|
private final JMenuItem typeMonthMenuItem;
|
||||||
|
private final JMenuItem typeYearMenuItem;
|
||||||
|
private final Widget widget;
|
||||||
|
private WidgetType selectedType;
|
||||||
|
private Consumer<Object> refreshConsumer;
|
||||||
|
|
||||||
|
public WidgetMenu(Widget widget) {
|
||||||
|
this(widget, null);
|
||||||
|
}
|
||||||
|
public WidgetMenu(Widget widget, Consumer<Object> refreshConsumer) {
|
||||||
|
this.widget = widget;
|
||||||
|
this.refreshConsumer = refreshConsumer;
|
||||||
|
|
||||||
|
JMenuItem typeMenuItem = new JMenu("Type"/*,*/
|
||||||
|
/*new ImageIcon("images/newproject.png")*/);
|
||||||
|
//menuItem.setMnemonic(KeyEvent.VK_P);
|
||||||
|
//menuItem.getAccessibleContext().setAccessibleDescription("New Project");
|
||||||
|
add(typeMenuItem);
|
||||||
|
|
||||||
|
this.typeMinuteMenuItem = new JMenuItem(WidgetType.MINUTE.name());
|
||||||
|
this.typeHourMenuItem = new JMenuItem(WidgetType.HOUR.name());
|
||||||
|
this.typeDayMenuItem = new JMenuItem(WidgetType.DAY.name());
|
||||||
|
this.typeWeekMenuItem = new JMenuItem(WidgetType.WEEK.name());
|
||||||
|
this.typeMonthMenuItem = new JMenuItem(WidgetType.MONTH.name());
|
||||||
|
this.typeYearMenuItem = new JMenuItem(WidgetType.YEAR.name());
|
||||||
|
typeMenuItem.add(typeMinuteMenuItem);
|
||||||
|
typeMenuItem.add(typeHourMenuItem);
|
||||||
|
typeMenuItem.add(typeDayMenuItem);
|
||||||
|
typeMenuItem.add(typeWeekMenuItem);
|
||||||
|
typeMenuItem.add(typeMonthMenuItem);
|
||||||
|
typeMenuItem.add(typeYearMenuItem);
|
||||||
|
|
||||||
|
BiConsumer<JMenuItem, WidgetType> typeActionCreator = (m,w) -> {
|
||||||
|
m.addActionListener(e -> {
|
||||||
|
if(widget instanceof Battery && !widget.typeProperty.getValue().equals(w.name().toLowerCase(Locale.ROOT))) {
|
||||||
|
//nothing to do
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
markAsSelected(w);
|
||||||
|
widget.typeProperty.setValue(w.name().toLowerCase(Locale.ROOT));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
typeActionCreator.accept(typeMinuteMenuItem, WidgetType.MINUTE);
|
||||||
|
typeActionCreator.accept(typeHourMenuItem, WidgetType.HOUR);
|
||||||
|
typeActionCreator.accept(typeDayMenuItem, WidgetType.DAY);
|
||||||
|
typeActionCreator.accept(typeWeekMenuItem, WidgetType.WEEK);
|
||||||
|
typeActionCreator.accept(typeMonthMenuItem, WidgetType.MONTH);
|
||||||
|
typeActionCreator.accept(typeYearMenuItem, WidgetType.YEAR);
|
||||||
|
|
||||||
|
typeWeekMenuItem.addActionListener(e -> {
|
||||||
|
markAsSelected(WidgetType.WEEK);
|
||||||
|
widget.typeProperty.setValue(WidgetType.WEEK
|
||||||
|
.name().toLowerCase(Locale.ROOT));
|
||||||
|
});
|
||||||
|
typeMonthMenuItem.addActionListener(e -> {
|
||||||
|
markAsSelected(WidgetType.MONTH);
|
||||||
|
widget.typeProperty.setValue(WidgetType.MONTH
|
||||||
|
.name().toLowerCase(Locale.ROOT));
|
||||||
|
});
|
||||||
|
typeYearMenuItem.addActionListener(e -> {
|
||||||
|
markAsSelected(WidgetType.YEAR);
|
||||||
|
widget.typeProperty.setValue(WidgetType.YEAR
|
||||||
|
.name().toLowerCase(Locale.ROOT));
|
||||||
|
});
|
||||||
|
//if(!aClass.getSimpleName().contains("Battery")) {
|
||||||
|
add(typeMenuItem);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
public void markAsSelected(WidgetType widgetType) {
|
||||||
|
this.typeMinuteMenuItem.setText(WidgetType.MINUTE.name());
|
||||||
|
this.typeHourMenuItem .setText(WidgetType.HOUR.name());
|
||||||
|
this.typeDayMenuItem.setText(WidgetType.DAY.name());
|
||||||
|
this.typeWeekMenuItem.setText(WidgetType.WEEK.name());
|
||||||
|
this.typeMonthMenuItem.setText(WidgetType.MONTH.name());
|
||||||
|
this.typeYearMenuItem.setText(WidgetType.YEAR.name());
|
||||||
|
switch (widgetType) {
|
||||||
|
case MINUTE: typeMinuteMenuItem.setText(typeMinuteMenuItem.getText() + " (*)");break;
|
||||||
|
case HOUR: typeHourMenuItem.setText(typeHourMenuItem.getText() + " (*)");break;
|
||||||
|
case DAY: typeDayMenuItem.setText(typeDayMenuItem.getText() + " (*)");break;
|
||||||
|
case WEEK: typeWeekMenuItem.setText(typeWeekMenuItem.getText() + " (*)");break;
|
||||||
|
case MONTH: typeMonthMenuItem.setText(typeMonthMenuItem.getText() + " (*)");break;
|
||||||
|
case YEAR: typeYearMenuItem.setText(typeYearMenuItem.getText() + " (*)");break;
|
||||||
|
default: throw new TimeCalcException("Unsupported WidgetType: " + widgetType);
|
||||||
|
}
|
||||||
|
this.selectedType = widgetType;
|
||||||
|
}
|
||||||
|
public void refresh () {
|
||||||
|
if(refreshConsumer == null) {
|
||||||
|
//nothing to do
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.refreshConsumer.accept(null);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package org.nanoboot.utils.timecalc.swing.controls;
|
||||||
|
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author pc00289
|
||||||
|
* @since 21.03.2024
|
||||||
|
*/
|
||||||
|
public class TMenuItem extends JMenuItem {
|
||||||
|
private static final String ENABLED = " (*)";
|
||||||
|
private boolean enabledMenuItem = false;
|
||||||
|
|
||||||
|
public TMenuItem(String text) {
|
||||||
|
super(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void disableMenuItem() {
|
||||||
|
if(getText().endsWith(ENABLED)) {
|
||||||
|
setText(getText().substring(0, getText().length() - ENABLED.length()));
|
||||||
|
}
|
||||||
|
enabledMenuItem = false;
|
||||||
|
}
|
||||||
|
public void enableMenuItem() {
|
||||||
|
if(!getText().endsWith(ENABLED)) {
|
||||||
|
setText(getText() + ENABLED);
|
||||||
|
}
|
||||||
|
enabledMenuItem = true;
|
||||||
|
}
|
||||||
|
public void setEnabledMenuItem(boolean value) {
|
||||||
|
|
||||||
|
if(value) {enableMenuItem();} else {
|
||||||
|
disableMenuItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
enabledMenuItem = value;
|
||||||
|
}
|
||||||
|
public void flip() {
|
||||||
|
setEnabledMenuItem(!enabledMenuItem);
|
||||||
|
}
|
||||||
|
}
|
@ -5,14 +5,15 @@ import org.nanoboot.utils.timecalc.entity.Visibility;
|
|||||||
import org.nanoboot.utils.timecalc.entity.WidgetType;
|
import org.nanoboot.utils.timecalc.entity.WidgetType;
|
||||||
import org.nanoboot.utils.timecalc.swing.common.SwingUtils;
|
import org.nanoboot.utils.timecalc.swing.common.SwingUtils;
|
||||||
import org.nanoboot.utils.timecalc.swing.common.Widget;
|
import org.nanoboot.utils.timecalc.swing.common.Widget;
|
||||||
|
import org.nanoboot.utils.timecalc.swing.controls.TMenuItem;
|
||||||
import org.nanoboot.utils.timecalc.utils.common.DateFormats;
|
import org.nanoboot.utils.timecalc.utils.common.DateFormats;
|
||||||
import org.nanoboot.utils.timecalc.utils.common.NumberFormats;
|
|
||||||
import org.nanoboot.utils.timecalc.utils.common.TTime;
|
import org.nanoboot.utils.timecalc.utils.common.TTime;
|
||||||
import org.nanoboot.utils.timecalc.utils.property.BooleanProperty;
|
import org.nanoboot.utils.timecalc.utils.property.BooleanProperty;
|
||||||
import org.nanoboot.utils.timecalc.utils.property.IntegerProperty;
|
import org.nanoboot.utils.timecalc.utils.property.IntegerProperty;
|
||||||
import org.nanoboot.utils.timecalc.utils.property.StringProperty;
|
import org.nanoboot.utils.timecalc.utils.property.StringProperty;
|
||||||
|
|
||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
|
import javax.swing.JMenu;
|
||||||
import java.awt.BasicStroke;
|
import java.awt.BasicStroke;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
@ -20,9 +21,12 @@ import java.awt.Font;
|
|||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.RenderingHints;
|
import java.awt.RenderingHints;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
//https://kodejava.org/how-do-i-write-a-simple-analog-clock-using-java-2d/
|
//https://kodejava.org/how-do-i-write-a-simple-analog-clock-using-java-2d/
|
||||||
public class AnalogClock extends Widget {
|
public class AnalogClock extends Widget {
|
||||||
@ -99,6 +103,11 @@ public class AnalogClock extends Widget {
|
|||||||
public final BooleanProperty percentProgressVisibleProperty = new BooleanProperty("percentProgressVisibleProperty");
|
public final BooleanProperty percentProgressVisibleProperty = new BooleanProperty("percentProgressVisibleProperty");
|
||||||
private Color customCircleColor = null;
|
private Color customCircleColor = null;
|
||||||
private double dayProgress;
|
private double dayProgress;
|
||||||
|
private TMenuItem millisecondHandMenuItem;
|
||||||
|
private TMenuItem secondHandMenuItem;
|
||||||
|
private TMenuItem minuteHandMenuItem;
|
||||||
|
private TMenuItem hourHandMenuItem;
|
||||||
|
private List<JMenu> menuItems = null;
|
||||||
|
|
||||||
public AnalogClock() {
|
public AnalogClock() {
|
||||||
typeProperty.setValue(WidgetType.DAY.name().toLowerCase(Locale.ROOT));
|
typeProperty.setValue(WidgetType.DAY.name().toLowerCase(Locale.ROOT));
|
||||||
@ -411,4 +420,76 @@ public class AnalogClock extends Widget {
|
|||||||
return 100;
|
return 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<JMenu> createAdditionalMenus() {
|
||||||
|
if(menuItems == null) {
|
||||||
|
menuItems = new ArrayList<>();
|
||||||
|
JMenu hands = new JMenu("Hands");
|
||||||
|
menuItems.add(hands);
|
||||||
|
|
||||||
|
this.millisecondHandMenuItem = new TMenuItem("Millisecond");
|
||||||
|
this.secondHandMenuItem = new TMenuItem("Second");
|
||||||
|
this.minuteHandMenuItem = new TMenuItem("Minute");
|
||||||
|
this.hourHandMenuItem = new TMenuItem("Hour");
|
||||||
|
|
||||||
|
if (millisecondEnabledProperty.isEnabled()) {
|
||||||
|
millisecondHandMenuItem.enableMenuItem();
|
||||||
|
}
|
||||||
|
if (secondEnabledProperty.isEnabled()) {
|
||||||
|
secondHandMenuItem.enableMenuItem();
|
||||||
|
}
|
||||||
|
if (minuteEnabledProperty.isEnabled()) {
|
||||||
|
minuteHandMenuItem.enableMenuItem();
|
||||||
|
}
|
||||||
|
if (hourEnabledProperty.isEnabled()) {
|
||||||
|
hourHandMenuItem.enableMenuItem();
|
||||||
|
}
|
||||||
|
millisecondEnabledProperty.addListener(
|
||||||
|
(property, oldValue, newValue) -> millisecondHandMenuItem
|
||||||
|
.setEnabledMenuItem(newValue));
|
||||||
|
secondEnabledProperty.addListener(
|
||||||
|
(property, oldValue, newValue) -> secondHandMenuItem
|
||||||
|
.setEnabledMenuItem(newValue));
|
||||||
|
minuteEnabledProperty.addListener(
|
||||||
|
(property, oldValue, newValue) -> minuteHandMenuItem
|
||||||
|
.setEnabledMenuItem(newValue));
|
||||||
|
hourEnabledProperty.addListener(
|
||||||
|
(property, oldValue, newValue) -> hourHandMenuItem
|
||||||
|
.setEnabledMenuItem(newValue));
|
||||||
|
|
||||||
|
hands.add(millisecondHandMenuItem);
|
||||||
|
hands.add(secondHandMenuItem);
|
||||||
|
hands.add(minuteHandMenuItem);
|
||||||
|
hands.add(hourHandMenuItem);
|
||||||
|
|
||||||
|
millisecondHandMenuItem
|
||||||
|
.addActionListener(e -> millisecondEnabledProperty.flip());
|
||||||
|
secondHandMenuItem
|
||||||
|
.addActionListener(e -> secondEnabledProperty.flip());
|
||||||
|
minuteHandMenuItem
|
||||||
|
.addActionListener(e -> minuteEnabledProperty.flip());
|
||||||
|
hourHandMenuItem.addActionListener(e -> hourEnabledProperty.flip());
|
||||||
|
}
|
||||||
|
return this.menuItems;
|
||||||
|
}
|
||||||
|
protected Consumer<Object> createRefreshConsumer() {
|
||||||
|
return (o) -> {
|
||||||
|
millisecondHandMenuItem.disableMenuItem();
|
||||||
|
secondHandMenuItem.disableMenuItem();
|
||||||
|
minuteHandMenuItem.disableMenuItem();
|
||||||
|
hourHandMenuItem.disableMenuItem();
|
||||||
|
if (millisecondEnabledProperty.isEnabled()) {
|
||||||
|
millisecondHandMenuItem.enableMenuItem();
|
||||||
|
}
|
||||||
|
if (secondEnabledProperty.isEnabled()) {
|
||||||
|
secondHandMenuItem.enableMenuItem();
|
||||||
|
}
|
||||||
|
if (minuteEnabledProperty.isEnabled()) {
|
||||||
|
minuteHandMenuItem.enableMenuItem();
|
||||||
|
}
|
||||||
|
if (hourEnabledProperty.isEnabled()) {
|
||||||
|
hourHandMenuItem.enableMenuItem();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user