From 2d5bb07504bc5219cb2181afda0c070fd0c9e365 Mon Sep 17 00:00:00 2001 From: Diamond Date: Thu, 21 Sep 2017 14:50:39 +0200 Subject: [PATCH 1/5] Allow setting Calendar image in code and TextArea constructor with a uiid --- .../src/com/codename1/ui/Calendar.java | 29 +++++++++++++++++-- .../src/com/codename1/ui/TextArea.java | 13 +++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/CodenameOne/src/com/codename1/ui/Calendar.java b/CodenameOne/src/com/codename1/ui/Calendar.java index 9d612aabe1..e5099a85ba 100644 --- a/CodenameOne/src/com/codename1/ui/Calendar.java +++ b/CodenameOne/src/com/codename1/ui/Calendar.java @@ -120,14 +120,37 @@ public Calendar() { * @param tmz a reference timezone */ public Calendar(long time, TimeZone tmz) { + this(time, java.util.TimeZone.getDefault(), null, null); + } + + /** + * Constructs a calendar with the current date and time with left and right images set + * + * @param leftArrowImage an image for calendar left arrow + * @param rightArrowImage an image for calendar right arrow + */ + public Calendar(Image leftArrowImage, Image rightArrowImage) { + this(System.currentTimeMillis(), java.util.TimeZone.getDefault(), leftArrowImage, rightArrowImage); + } + + /** + * Creates a new instance of Calendar set to the given date based on time + * since epoch (the java.util.Date convention) + * + * @param time time since epoch + * @param tmz a reference timezone + * @param leftArrowImage an image for calendar left arrow + * @param rightArrowImage an image for calendar right arrow + */ + public Calendar(long time, TimeZone tmz, Image leftArrowImage, Image rightArrowImage) { super(new BorderLayout()); this.tmz = tmz; setUIID("Calendar"); mv = new MonthView(time); - Image leftArrow = UIManager.getInstance().getThemeImageConstant("calendarLeftImage"); - if (leftArrow != null) { - Image rightArrow = UIManager.getInstance().getThemeImageConstant("calendarRightImage"); + Image leftArrow = leftArrowImage != null ? leftArrowImage : UIManager.getInstance().getThemeImageConstant("calendarLeftImage"); + Image rightArrow = rightArrowImage != null ? rightArrowImage : UIManager.getInstance().getThemeImageConstant("calendarRightImage"); + if (leftArrow != null && rightArrow != null) { final Button left = new Button(leftArrow, "CalendarLeft"); final Button right = new Button(rightArrow, "CalendarRight"); ActionListener progress = new ActionListener() { diff --git a/CodenameOne/src/com/codename1/ui/TextArea.java b/CodenameOne/src/com/codename1/ui/TextArea.java index e00037edcc..6d0b077c56 100644 --- a/CodenameOne/src/com/codename1/ui/TextArea.java +++ b/CodenameOne/src/com/codename1/ui/TextArea.java @@ -302,6 +302,19 @@ public TextArea(String text, int maxSize){ this(text,maxSize, 1, 3, ANY); } + /** + * Creates an area with the given text, this constructor + * will create a single line text area similar to a text field! + * + * @param text the text to be displayed; if text is null, the empty + * string "" will be displayed + * @param uiid the uiid to apply + */ + public TextArea(String text, String uiid) { + this(text, Math.max(defaultMaxSize, nl(text)), 1, numCols(text), ANY); + setUIID(uiid); + } + /** * Creates an area with the given text, this constructor * will create a single line text area similar to a text field! From b0f20df0769c44b0f80f2acf8064171ad1ee3fea Mon Sep 17 00:00:00 2001 From: Diamond Date: Thu, 21 Sep 2017 15:28:06 +0200 Subject: [PATCH 2/5] Revert "TextArea constructor with a uiid" --- CodenameOne/src/com/codename1/ui/TextArea.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/CodenameOne/src/com/codename1/ui/TextArea.java b/CodenameOne/src/com/codename1/ui/TextArea.java index 5e0bb0c081..cf45533c9b 100644 --- a/CodenameOne/src/com/codename1/ui/TextArea.java +++ b/CodenameOne/src/com/codename1/ui/TextArea.java @@ -301,20 +301,7 @@ public TextArea(String text, int rows, int columns, int constraint){ public TextArea(String text, int maxSize){ this(text,maxSize, 1, 3, ANY); } - - /** - * Creates an area with the given text, this constructor - * will create a single line text area similar to a text field! - * - * @param text the text to be displayed; if text is null, the empty - * string "" will be displayed - * @param uiid the uiid to apply - */ - public TextArea(String text, String uiid) { - this(text, Math.max(defaultMaxSize, nl(text)), 1, numCols(text), ANY); - setUIID(uiid); - } - + /** * Creates an area with the given text, this constructor * will create a single line text area similar to a text field! From 2f44b5c99dcf1e5d3b6c7d180dc6704f514a35f0 Mon Sep 17 00:00:00 2001 From: Shai Almog Date: Thu, 21 Sep 2017 16:56:01 +0300 Subject: [PATCH 3/5] Fixed file prefix so file: will be used for Android file paths by default --- CodenameOne/src/cn1-version-numbers | 2 +- .../impl/android/AndroidImplementation.java | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CodenameOne/src/cn1-version-numbers b/CodenameOne/src/cn1-version-numbers index 86f01ea3e4..5e917d446b 100644 --- a/CodenameOne/src/cn1-version-numbers +++ b/CodenameOne/src/cn1-version-numbers @@ -1 +1 @@ -7ff2ab7747628f6d0777b0bf0db2c282b2f76933 +c9b9c14d28bcb89e6348b2b2eebb392226d61531 diff --git a/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java b/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java index c3f82dd8b7..366869895d 100644 --- a/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java +++ b/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java @@ -4827,6 +4827,14 @@ public int getStorageEntrySize(String name) { return (int)new File(getContext().getFilesDir(), name).length(); } + private String addFile(String s) { + // I explicitly don't create a "proper URL" since code might rely on the fact that the file isn't encoded + if(s != null && s.startsWith("/")) { + return "file:/" + s; + } + return s; + } + /** * @inheritDoc */ @@ -4840,10 +4848,10 @@ public String[] listFilesystemRoots() { if(storageDirs != null){ String [] roots = new String[storageDirs.length + 1]; System.arraycopy(storageDirs, 0, roots, 0, storageDirs.length); - roots[roots.length - 1] = Environment.getRootDirectory().getAbsolutePath(); + roots[roots.length - 1] = addFile(Environment.getRootDirectory().getAbsolutePath()); return roots; } - return new String[]{Environment.getRootDirectory().getAbsolutePath()}; + return new String[]{addFile(Environment.getRootDirectory().getAbsolutePath())}; } @Override From bd1738e5a22bf04c0dad34b9fce7c9bbba8defe1 Mon Sep 17 00:00:00 2001 From: Diamond Date: Thu, 21 Sep 2017 16:20:14 +0200 Subject: [PATCH 4/5] Introduced monthChangedListener that fires only when a new month is selected --- .../src/com/codename1/ui/Calendar.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/CodenameOne/src/com/codename1/ui/Calendar.java b/CodenameOne/src/com/codename1/ui/Calendar.java index e5099a85ba..5abe18d758 100644 --- a/CodenameOne/src/com/codename1/ui/Calendar.java +++ b/CodenameOne/src/com/codename1/ui/Calendar.java @@ -85,6 +85,7 @@ public class Calendar extends Container { static final long WEEK = DAY * 7; private EventDispatcher dispatcher = new EventDispatcher(); private EventDispatcher dataChangedListeners = new EventDispatcher(); + private EventDispatcher monthChangedListeners = new EventDispatcher(); private long[] dates = new long[42]; private boolean changesSelectedDateEnabled = true; private TimeZone tmz; @@ -124,7 +125,8 @@ public Calendar(long time, TimeZone tmz) { } /** - * Constructs a calendar with the current date and time with left and right images set + * Constructs a calendar with the current date and time with left and right + * images set * * @param leftArrowImage an image for calendar left arrow * @param rightArrowImage an image for calendar right arrow @@ -437,6 +439,24 @@ public void removeActionListener(ActionListener l) { mv.removeActionListener(l); } + /** + * Fires when a new month is selected + * + * @param l listener to add + */ + public void addMonthChangedListener(ActionListener l) { + mv.addMonthChangedListener(l); + } + + /** + * Fires when a new month is selected + * + * @param l listener to remove + */ + public void removeMonthChangedListener(ActionListener l) { + mv.removeMonthChangedListener(l); + } + /** * Adds an ActionListener to the day buttons. This is different from * {@code Calendar.addActionListener} and will only fire when an active day @@ -1144,6 +1164,7 @@ private void setMonth(int year, int month) { cal.setTime(new Date(d)); } setCurrentDay(d); + fireMonthChangedEvent(); } public void decrementMonth() { @@ -1171,6 +1192,14 @@ public void removeActionListener(ActionListener l) { dispatcher.removeListener(l); } + public void addMonthChangedListener(ActionListener l) { + monthChangedListeners.addListener(l); + } + + public void removeMonthChangedListener(ActionListener l) { + monthChangedListeners.removeListener(l); + } + public void addDayActionListener(ActionListener l) { dayListeners.add(l); for (Component cmp : components) { @@ -1209,6 +1238,10 @@ protected void fireActionEvent() { dispatcher.fireActionEvent(new ActionEvent(Calendar.this, ActionEvent.Type.Calendar)); } + protected void fireMonthChangedEvent() { + monthChangedListeners.fireActionEvent(new ActionEvent(Calendar.this, ActionEvent.Type.Calendar)); + } + public void actionPerformed(ActionEvent evt) { Object src = evt.getSource(); if (src instanceof ComboBox) { From e6dc03d03ae013be0366c0c576707cfec3a8c84f Mon Sep 17 00:00:00 2001 From: Diamond Date: Thu, 21 Sep 2017 16:56:14 +0200 Subject: [PATCH 5/5] Calls fireChangedEvent() earlier --- CodenameOne/src/com/codename1/ui/Calendar.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodenameOne/src/com/codename1/ui/Calendar.java b/CodenameOne/src/com/codename1/ui/Calendar.java index 5abe18d758..3710bd297d 100644 --- a/CodenameOne/src/com/codename1/ui/Calendar.java +++ b/CodenameOne/src/com/codename1/ui/Calendar.java @@ -1148,6 +1148,7 @@ public void setSelectedDay(long selectedDay) { } private void setMonth(int year, int month) { + fireMonthChangedEvent(); java.util.Calendar cal = java.util.Calendar.getInstance(tmz); cal.setTimeZone(TimeZone.getDefault()); cal.set(java.util.Calendar.MONTH, month); @@ -1164,7 +1165,6 @@ private void setMonth(int year, int month) { cal.setTime(new Date(d)); } setCurrentDay(d); - fireMonthChangedEvent(); } public void decrementMonth() {