/* * Copyright 2015 the original author or authors. * @https://github.com/scouter-project/scouter * * 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 scouter.client.popup; import java.awt.Point; import java.util.ArrayList; import java.util.Date; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.DateTime; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import scouter.client.util.ConsoleProxy; import scouter.client.util.TimeUtil; import scouter.client.util.UIUtil; import scouter.util.CastUtil; import scouter.util.DateUtil; public class CalendarDialog { private final Display display; private final ILoadCalendarDialog callback; public CalendarDialog(Display display, ILoadCalendarDialog callback) { this.display = display; this.callback = callback; } public void show() { show(-1, -1, -1); } public void show(int x, int y, long time){ final Shell dialog = new Shell(display, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); dialog.setLayout (new GridLayout (2, true)); dialog.setText("Date"); UIUtil.setDialogDefaultFunctions(dialog); final DateTime calendar = new DateTime(dialog, SWT.CALENDAR); GridData data = new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1); calendar.setLayoutData(data); if (time > 0) { String yyyymmdd = DateUtil.format(time, "yyyy-MM-dd"); String[] date = yyyymmdd.split("-"); calendar.setDate(Integer.parseInt(date[0]), Integer.parseInt(date[1]) - 1, Integer.parseInt(date[2])); } Button okButton = new Button(dialog, SWT.PUSH); okButton.setText("&OK"); okButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); okButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { switch (event.type) { case SWT.Selection: try { String date = (calendar.getMonth () + 1) + "/" + calendar.getDay() + "/" + calendar.getYear(); date = DateUtil.format(DateUtil.getTime(date, "MM/dd/yyyy"), "yyyyMMdd"); dialog.close(); callback.onPressedOk(date); } catch (Exception e) { MessageDialog.openError(dialog, "Error55", "Date format error:" + e.getMessage()); } break; } } }); Button cancelButton = new Button(dialog, SWT.PUSH); cancelButton.setText("&Cancel"); cancelButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); cancelButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { switch (event.type) { case SWT.Selection: callback.onPressedCancel(); dialog.close(); break; } } }); dialog.addListener(SWT.Close, new Listener() { public void handleEvent(Event event) { callback.onPressedCancel(); } }); dialog.setDefaultButton(okButton); dialog.pack(); if(x > 0 && y > 0){ dialog.setLocation(x, y); } dialog.open(); } public void showWithTime() { showWithTime(-1, -1, -1); } public void showWithTime(Point p, long time){ if(p != null) showWithTime((int)p.getX(), (int)p.getY() + 10, time); } public void showWithTime(int x, int y, long time) { final Shell dialog = new Shell(display, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); dialog.setLayout (new GridLayout (4, false)); dialog.setText("Date/Time"); UIUtil.setDialogDefaultFunctions(dialog); final DateTime calendar = new DateTime(dialog, SWT.CALENDAR); GridData data = new GridData(SWT.FILL, SWT.CENTER, false, false, 4, 1); calendar.setLayoutData(data); if(time > 0){ int year = CastUtil.cint(DateUtil.format(time, "yyyy")); int month = CastUtil.cint(DateUtil.format(time, "MM")) - 1; int day = CastUtil.cint(DateUtil.format(time, "dd")); calendar.setDate(year, month, day); calendar.setDay(day); } Label label = new Label(dialog, SWT.NONE); label.setText("From"); final DateTime startTime = new DateTime(dialog, SWT.TIME | SWT.SHORT); if(time > 0){ int hours = CastUtil.cint(DateUtil.format(time, "HH")); int minutes = CastUtil.cint(DateUtil.format(time, "mm")); int seconds = CastUtil.cint(DateUtil.format(time, "ss")); startTime.setTime(hours, minutes, seconds); }else{ startTime.setHours(7); startTime.setMinutes(0); } label = new Label(dialog, SWT.NONE); label.setText("To"); final Combo afterMinutes = new Combo (dialog, SWT.DROP_DOWN | SWT.READ_ONLY); ArrayList<String> minuteStrList = new ArrayList<String>(); for (AfterMinuteUnit minute : AfterMinuteUnit.values()) { minuteStrList.add(minute.getLabel()); } afterMinutes.setItems (minuteStrList.toArray(new String[AfterMinuteUnit.values().length])); afterMinutes.select(0); afterMinutes.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); Button okButton = new Button(dialog, SWT.PUSH); okButton.setText("&OK"); okButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1)); okButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { switch (event.type) { case SWT.Selection: try { String fromTime = (calendar.getMonth () + 1) + "/" + calendar.getDay() + "/" + calendar.getYear() + " " + startTime.getHours() + ":" + (startTime.getMinutes () < 10 ? "0" : "") + startTime.getMinutes (); long startTime = DateUtil.getTime(fromTime, "MM/dd/yyyy HH:mm"); long endTime = 0; String afterMinute = afterMinutes.getText(); AfterMinuteUnit m = AfterMinuteUnit.fromString(afterMinute); if (m != null) { endTime = startTime + m.getTime(); } if (endTime <= startTime) { MessageDialog.openWarning(dialog, "Warning", "Time range is incorrect"); } else { if (DateUtil.isSameDay(new Date(startTime), new Date(endTime)) == false) { endTime = DateUtil.getTime((calendar.getMonth () + 1) + "/" + calendar.getDay() + "/" + calendar.getYear() + " 23:59", "MM/dd/yyyy HH:mm"); } callback.onPressedOk(startTime, endTime); dialog.close(); } } catch (Exception e) { e.printStackTrace(); MessageDialog.openError(dialog, "Error", "Date format error:" + e.getMessage()); } break; } } }); Button cancelButton = new Button(dialog, SWT.PUSH); cancelButton.setText("&Cancel"); cancelButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1)); cancelButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { switch (event.type) { case SWT.Selection: callback.onPressedCancel(); dialog.close(); break; } } }); dialog.setDefaultButton(okButton); dialog.pack(); if(x > 0 && y > 0){ dialog.setLocation(x, y); } dialog.open(); } public void showWithEndTime() { long etime=(TimeUtil.getCurrentTime()/60000)*60000 ; long stime=etime-DateUtil.MILLIS_PER_FIVE_MINUTE; showWithEndTime(stime, etime); } public void showWithEndTime(long stime, long etime) { final Shell dialog = new Shell(display, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); dialog.setLayout (new GridLayout (4, false)); dialog.setText("Date/Time"); final DateTime calendar = new DateTime(dialog, SWT.CALENDAR); GridData data = new GridData(SWT.FILL, SWT.CENTER, false, false, 4, 1); calendar.setLayoutData(data); int year = CastUtil.cint(DateUtil.format(stime, "yyyy")); int month = CastUtil.cint(DateUtil.format(stime, "MM")) - 1; int day = CastUtil.cint(DateUtil.format(stime, "dd")); calendar.setDate(year, month, day); calendar.setDay(day); Label label = new Label(dialog, SWT.NONE); label.setText("From"); final DateTime startTime = new DateTime(dialog, SWT.TIME | SWT.SHORT); startTime.setHours(DateUtil.getHour(stime)); startTime.setMinutes(DateUtil.getMin(stime)); label = new Label(dialog, SWT.NONE); label.setText("To"); final DateTime endTime = new DateTime(dialog, SWT.TIME | SWT.SHORT); endTime.setHours(DateUtil.getHour(etime)); endTime.setMinutes(DateUtil.getMin(etime)); Button okButton = new Button(dialog, SWT.PUSH); okButton.setText("&OK"); okButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1)); okButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { switch (event.type) { case SWT.Selection: try { String fromTime = (calendar.getMonth () + 1) + "/" + calendar.getDay() + "/" + calendar.getYear() + " " + (startTime.getHours () < 10 ? "0" : "") + startTime.getHours() + ":" + (startTime.getMinutes () < 10 ? "0" : "") + startTime.getMinutes (); String toTime = (calendar.getMonth () + 1) + "/" + calendar.getDay() + "/" + calendar.getYear() + " " + (endTime.getHours () < 10 ? "0" : "") + endTime.getHours() + ":" + (endTime.getMinutes () < 10 ? "0" : "") + endTime.getMinutes (); long startTime = DateUtil.getTime(fromTime, "MM/dd/yyyy HH:mm"); long endTime = DateUtil.getTime(toTime, "MM/dd/yyyy HH:mm"); if (endTime <= startTime) { MessageDialog.openWarning(dialog, "Warning", "Time range is incorrect"); } else { if (DateUtil.isSameDay(new Date(startTime), new Date(endTime)) == false) { endTime = DateUtil.getTime((calendar.getMonth () + 1) + "/" + calendar.getDay() + "/" + calendar.getYear() + " 23:59", "MM/dd/yyyy HH:mm"); } callback.onPressedOk(startTime, endTime); dialog.close(); } } catch (Exception e) { e.printStackTrace(); MessageDialog.openError(dialog, "Error", "Date format error:" + e.getMessage()); } break; } } }); Button cancelButton = new Button(dialog, SWT.PUSH); cancelButton.setText("&Cancel"); cancelButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1)); cancelButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { switch (event.type) { case SWT.Selection: callback.onPressedCancel(); dialog.close(); break; } } }); dialog.setDefaultButton(okButton); dialog.pack(); dialog.open(); } public interface ILoadCalendarDialog { void onPressedOk(long startTime, long endTime); void onPressedOk(String date); void onPressedCancel(); } public enum AfterMinuteUnit { FIVE_MIN ("5 min", 5 * 60 * 1000), TEN_MIN ("10 min", 10 * 60 * 1000), TWT_MIN("20 min", 20 * 60 * 1000), THIRTY_MIN("30 min", 30 * 60 * 1000), ONE_HOUR("1 hour", 60 * 60 * 1000), FOUR_HOURS("4 hours", 4 * 60 * 60 * 1000); private String label; private long time; private AfterMinuteUnit(String label, long time) { this.label = label; this.time = time; } public String getLabel() { return this.label; } public long getTime() { return this.time; } public static AfterMinuteUnit fromString(String text) { if (text != null) { for (AfterMinuteUnit b : AfterMinuteUnit.values()) { if (text.equalsIgnoreCase(b.label)) { return b; } } } return null; } } }