Changeset 26215 in osm for applications


Ignore:
Timestamp:
2011-06-30T13:06:56+02:00 (13 years ago)
Author:
boman
Message:

the editor supports now the 12 hour and the 24 hour clock

Location:
applications/editors/josm/plugins/OpeningHoursEditor/src/org/openstreetmap/josm/plugins/ohe
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/OpeningHoursEditor/src/org/openstreetmap/josm/plugins/ohe/OhePlugin.java

    r26002 r26215  
    1111import java.util.Collection;
    1212import java.util.HashMap;
     13import java.util.Locale;
    1314import java.util.Map;
    1415import java.util.Map.Entry;
     
    2021import javax.swing.AbstractAction;
    2122import javax.swing.ButtonGroup;
     23import javax.swing.JCheckBox;
    2224import javax.swing.JDialog;
    2325import javax.swing.JLabel;
     
    5153     * {key, value, key-to-edit} key and value can contain regular expressions
    5254     */
    53     private final String[][] TAG_EDIT_STRINGS = new String[][] { { "opening_hours", ".*", "opening_hours" },
     55    private final String[][] TAG_EDIT_STRINGS = new String[][] {
     56            { "opening_hours", ".*", "opening_hours" },
    5457            { "collection_times", ".*", "collection_times" },
    55             { "collection_times:local", ".*", "collection_times:local" }, { "shop", ".*", "opening_hours" },
    56             { "amenity", "post_box", "collection_times" }, { "amenity", ".*", "opening_hours" },
    57             { "lit", ".*", "lit" }, { "highway", ".*", "lit" } };
     58            { "collection_times:local", ".*", "collection_times:local" },
     59            { "shop", ".*", "opening_hours" },
     60            { "amenity", "post_box", "collection_times" },
     61            { "amenity", "recycling", "collection_times" },
     62            { "amenity", ".*", "opening_hours" },
     63            { "lit", ".*", "lit" },
     64            { "highway", ".*", "lit" } };
    5865
    5966    /**
     
    216223                            preSelectedKey = pattern[2];
    217224                            break searchLoop;
    218                         } else if (value instanceof Map<?, ?>)
     225                        } else if (value instanceof Map<?, ?>) {
    219226                            for (String v : ((Map<String, Integer>) value).keySet())
    220227                                if (valuePattern.matcher(v).matches()) {
     
    222229                                    break searchLoop;
    223230                                }
     231                        }
    224232                    }
    225233                }
     
    227235            int preSelectedRow = -1;
    228236            for (int i = 0; i < propertyData.getRowCount(); ++i)
    229                 if (preSelectedKey.equals(propertyData.getValueAt(i, 0)))
     237                if (preSelectedKey.equals(propertyData.getValueAt(i, 0))) {
    230238                    preSelectedRow = i;
     239                }
    231240            if (preSelectedRow != -1) {
    232241                propertyTable.setEnabled(true);
     
    241250            }
    242251
     252            JCheckBox useTwelveHourClock = new JCheckBox(tr("Display clock in 12h mode."),
     253                    ClockSystem.getClockSystem(Locale.getDefault()) == ClockSystem.TWELVE_HOURS);
     254
    243255            JPanel dlgPanel = new JPanel(new GridBagLayout());
    244             dlgPanel.add(editButton, GBC.std().anchor(GBC.CENTER));
     256            dlgPanel.add(editButton, GBC.std().anchor(GBC.WEST));
    245257            dlgPanel.add(sp, GBC.eol().fill(GBC.BOTH));
    246             dlgPanel.add(newButton, GBC.std().anchor(GBC.CENTER));
     258            dlgPanel.add(newButton, GBC.std().anchor(GBC.WEST));
    247259            dlgPanel.add(newTagField, GBC.eol().fill(GBC.HORIZONTAL));
     260            dlgPanel.add(useTwelveHourClock, GBC.eol().fill(GBC.HORIZONTAL).insets(0, 5, 0, 5));
    248261
    249262            JOptionPane optionPane = new JOptionPane(dlgPanel, JOptionPane.QUESTION_MESSAGE,
     
    262275                    keyToEdit = (String) propertyData.getValueAt(propertyTable.getSelectedRow(), 0);
    263276                    valuesToEdit = propertyData.getValueAt(propertyTable.getSelectedRow(), 1);
    264                 } else if (newButton.isSelected())
     277                } else if (newButton.isSelected()) {
    265278                    keyToEdit = newTagField.getText();
     279                }
    266280            if (keyToEdit == null)
    267281                return;
    268282
    269             OheDialogPanel panel = new OheDialogPanel(OhePlugin.this, keyToEdit, valuesToEdit);
     283            OheDialogPanel panel = new OheDialogPanel(OhePlugin.this, keyToEdit, valuesToEdit,
     284                    useTwelveHourClock.isSelected() ? ClockSystem.TWELVE_HOURS : ClockSystem.TWENTYFOUR_HOURS);
    270285
    271286            optionPane = new JOptionPane(panel, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
     
    276291            String[] changedKeyValuePair = null;
    277292            answer = optionPane.getValue();
    278             if (!(answer == null || answer == JOptionPane.UNINITIALIZED_VALUE || (answer instanceof Integer && (Integer) answer != JOptionPane.OK_OPTION)))
     293            if (!(answer == null || answer == JOptionPane.UNINITIALIZED_VALUE || (answer instanceof Integer && (Integer) answer != JOptionPane.OK_OPTION))) {
    279294                changedKeyValuePair = panel.getChangedKeyValuePair();
     295            }
    280296            if (changedKeyValuePair == null)
    281297                return;
  • applications/editors/josm/plugins/OpeningHoursEditor/src/org/openstreetmap/josm/plugins/ohe/OpeningTimeUtils.java

    r23192 r26215  
    1717
    1818            // test if the given entry is a single dayspan
    19             if (dateTime.daySpans.size() == 1
    20                     && dateTime.daySpans.get(0).isSpan()) {
     19            if (dateTime.daySpans.size() == 1 && dateTime.daySpans.get(0).isSpan()) {
    2120                ArrayList<DaySpan> partDaySpans = new ArrayList<DaySpan>();
    2221                int start_day = dateTime.daySpans.get(0).startDay;
     
    2524                while (i + 1 < dateTimes.size()) {
    2625                    ArrayList<DaySpan> following = dateTimes.get(i + 1).daySpans;
    27                     if (following.size() == 1
    28                             && following.get(0).startDay > dateTime.daySpans
    29                                     .get(0).startDay
    30                             && following.get(0).endDay < dateTime.daySpans
    31                                     .get(0).endDay) {
    32                         partDaySpans.add(new DaySpan(start_day, following
    33                                 .get(0).startDay - 1));
     26                    if (following.size() == 1 && following.get(0).startDay > dateTime.daySpans.get(0).startDay
     27                            && following.get(0).endDay < dateTime.daySpans.get(0).endDay) {
     28                        partDaySpans.add(new DaySpan(start_day, following.get(0).startDay - 1));
    3429                        start_day = following.get(0).endDay + 1;
    3530                        newDateTimes.add(dateTimes.get(i + 1));
    3631                        i++;
    37                     } else
     32                    } else {
    3833                        break;
    39                 }
    40 
    41                 partDaySpans.add(new DaySpan(start_day, dateTime.daySpans
    42                         .get(0).endDay));
    43                 newDateTimes.add(new DateTime(partDaySpans,
    44                         dateTime.daytimeSpans));
    45             }
    46             if (newDateTimes.isEmpty())
     34                    }
     35                }
     36
     37                partDaySpans.add(new DaySpan(start_day, dateTime.daySpans.get(0).endDay));
     38                newDateTimes.add(new DateTime(partDaySpans, dateTime.daytimeSpans));
     39            }
     40            if (newDateTimes.isEmpty()) {
    4741                newDateTimes.add(dateTime);
     42            }
    4843
    4944            // create the int-array
     
    5247                for (DaySpan dayspan : dateTime2.daySpans) {
    5348                    for (DaytimeSpan timespan : dateTime2.daytimeSpans) {
    54                         if (!timespan.isOff())
    55                             ret.add(new int[] { dayspan.startDay,
    56                                     dayspan.endDay, timespan.startMinute,
     49                        if (!timespan.isOff()) {
     50                            ret.add(new int[] { dayspan.startDay, dayspan.endDay, timespan.startMinute,
    5751                                    timespan.endMinute });
     52                        }
    5853                    }
    5954                }
     
    10398        public ArrayList<DaytimeSpan> daytimeSpans;
    10499
    105         public DateTime(ArrayList<DaySpan> daySpans,
    106                 ArrayList<DaytimeSpan> daytimeSpans) {
     100        public DateTime(ArrayList<DaySpan> daySpans, ArrayList<DaytimeSpan> daytimeSpans) {
    107101            this.daySpans = daySpans;
    108102            this.daytimeSpans = daytimeSpans;
     
    116110        // in a week
    117111        boolean[][] minuteArray = new boolean[7][24 * 60 + 2];
    118         for (int day = 0; day < 7; ++day)
    119             for (int minute = 0; minute < 24 * 60 + 2; ++minute)
     112        for (int day = 0; day < 7; ++day) {
     113            for (int minute = 0; minute < 24 * 60 + 2; ++minute) {
    120114                minuteArray[day][minute] = false;
    121         for (TimeRect timeRect : givenTimeRects)
    122             for (int day = timeRect.getDayStart(); day <= timeRect.getDayEnd(); ++day)
    123                 for (int minute = timeRect.getMinuteStart(); minute <= timeRect
    124                         .getMinuteEnd(); ++minute)
     115            }
     116        }
     117        for (TimeRect timeRect : givenTimeRects) {
     118            for (int day = timeRect.getDayStart(); day <= timeRect.getDayEnd(); ++day) {
     119                for (int minute = timeRect.getMinuteStart(); minute <= timeRect.getMinuteEnd(); ++minute) {
    125120                    minuteArray[day][minute] = true;
     121                }
     122            }
     123        }
    126124
    127125        String ret = "";
     
    153151                if (sameDayCount == 1) {
    154152                    // a single Day with this special opening_hours
    155                     add = OpeningTimeCompiler.WEEKDAYS[i] + " "
    156                             + makeStringFromMinuteArray(minuteArray[i]);
     153                    add = OpeningTimeCompiler.WEEKDAYS[i] + " " + makeStringFromMinuteArray(minuteArray[i]);
    157154                } else if (sameDayCount == 2) {
    158155                    // exactly two Days with this special opening_hours
    159                     add = OpeningTimeCompiler.WEEKDAYS[i] + ","
    160                             + OpeningTimeCompiler.WEEKDAYS[lastSameDay] + " "
    161                             + makeStringFromMinuteArray(minuteArray[i]);
     156                    add = OpeningTimeCompiler.WEEKDAYS[i] + "," + OpeningTimeCompiler.WEEKDAYS[lastSameDay] + " "
     157                    + makeStringFromMinuteArray(minuteArray[i]);
    162158                } else if (sameDayCount > 2) {
    163159                    // more than two Days with this special opening_hours
    164                     add = OpeningTimeCompiler.WEEKDAYS[i] + "-"
    165                             + OpeningTimeCompiler.WEEKDAYS[lastSameDay] + " "
    166                             + makeStringFromMinuteArray(minuteArray[i]);
     160                    add = OpeningTimeCompiler.WEEKDAYS[i] + "-" + OpeningTimeCompiler.WEEKDAYS[lastSameDay] + " "
     161                    + makeStringFromMinuteArray(minuteArray[i]);
    167162                    for (int j = i + 1; j < lastSameDay; ++j) {
    168                         if (days[j] == 0)
     163                        if (days[j] == 0) {
    169164                            days[j] = -i - 1;
     165                        }
    170166                    }
    171167                }
     
    173169
    174170            if (!add.isEmpty()) {
    175                 if (!ret.isEmpty())
     171                if (!ret.isEmpty()) {
    176172                    ret += "; ";
     173                }
    177174                ret += add;
    178175            }
     
    188185            if (minutes[i]) {
    189186                int start = i;
    190                 while (i < minutes.length && minutes[i])
     187                while (i < minutes.length && minutes[i]) {
    191188                    ++i;
     189                }
    192190                String addString = timeString(start);
    193                 if (i - 1 == 24 * 60 + 1) // open end
     191                if (i - 1 == 24 * 60 + 1) {
    194192                    addString += "+";
    195                 else if (start != i - 1) // closing time
     193                } else if (start != i - 1) {
    196194                    addString += "-" + timeString(i - 1);
    197                 if (!ret.isEmpty())
     195                }
     196                if (!ret.isEmpty()) {
    198197                    ret += ",";
     198                }
    199199                ret += addString;
    200200            }
     
    204204
    205205    public static String timeString(int minutes) {
     206        return timeString(minutes, ClockSystem.TWENTYFOUR_HOURS);
     207    }
     208
     209    public static String timeString(int minutes, ClockSystem hourMode) {
     210        return timeString(minutes, hourMode, false);
     211    }
     212
     213    public static String timeString(int minutes, ClockSystem hourMode, boolean showPeriod) {
    206214        int h = minutes / 60;
     215        String period = "";
     216        if (hourMode == ClockSystem.TWELVE_HOURS) {
     217            if (showPeriod) {
     218                period = h <= 12 ? " AM" : " PM";
     219            }
     220            h %= 12;
     221            if (h == 0) {
     222                h = 12;
     223            }
     224        }
    207225        int m = minutes % 60;
    208         return (h < 10 ? "0" : "") + h + ":" + (m < 10 ? "0" : "") + m;
     226        return (h < 10 ? "0" : "") + h + ":" + (m < 10 ? "0" : "") + m + period;
    209227    }
    210228
     
    218236    private static boolean arraysEqual(boolean[] bs, boolean[] bs2) {
    219237        boolean ret = true;
    220         for (int i = 0; i < bs.length; i++)
     238        for (int i = 0; i < bs.length; i++) {
    221239            ret &= bs[i] == bs2[i];
     240        }
    222241        return ret;
    223242    }
  • applications/editors/josm/plugins/OpeningHoursEditor/src/org/openstreetmap/josm/plugins/ohe/gui/OheDialogPanel.java

    r26002 r26215  
    1616import javax.swing.JPanel;
    1717import javax.swing.JTextField;
    18 import javax.swing.SwingUtilities;
    1918
     19import org.openstreetmap.josm.plugins.ohe.ClockSystem;
    2020import org.openstreetmap.josm.plugins.ohe.OhePlugin;
    2121import org.openstreetmap.josm.plugins.ohe.OpeningTimeUtils;
     
    4141    private final String oldkey;
    4242
     43    private ClockSystem clockSystem;
     44
    4345    /**
    4446     * The Panel for editing the time-values.
     
    5052     *            multiple values and their number of occurences
    5153     */
    52     public OheDialogPanel(OhePlugin plugin, String key, Object valuesToEdit) {
     54    public OheDialogPanel(OhePlugin plugin, String key, Object valuesToEdit, ClockSystem clockSystem) {
     55        this.clockSystem = clockSystem;
     56
    5357        oldkey = key;
    5458        keyField = new JTextField(key);
     
    177181        actualPostionLabel.setText(positionText);
    178182    }
     183
     184    /**
     185     * @return the hourMode
     186     */
     187    public ClockSystem getHourMode() {
     188        return clockSystem;
     189    }
    179190}
  • applications/editors/josm/plugins/OpeningHoursEditor/src/org/openstreetmap/josm/plugins/ohe/gui/OheEditor.java

    r26002 r26215  
    1616
    1717import org.openstreetmap.josm.Main;
     18import org.openstreetmap.josm.plugins.ohe.ClockSystem;
    1819import org.openstreetmap.josm.plugins.ohe.OpeningTimeUtils;
    1920import org.openstreetmap.josm.plugins.ohe.parser.OpeningTimeCompiler;
    2021
    21 public class OheEditor extends JPanel implements MouseListener,
    22         MouseMotionListener {
     22public class OheEditor extends JPanel implements MouseListener, MouseMotionListener {
    2323    final OheDialogPanel dialog;
    2424
     
    3232
    3333    public OheEditor(OheDialogPanel oheDialogPanel) {
    34         dialog = oheDialogPanel;
    35 
    36         // the MainPanel for showing the TimeRects
    37         contentPanel = new JPanel() {
    38             @Override
    39             public void setSize(Dimension d) {
    40                 super.setSize(d);
    41                 repositionTimeRects();
    42             }
    43 
    44             @Override
    45             public void paintComponent(Graphics g) {
    46                 if (OheEditor.this.isEnabled()) {
    47                     g.setColor(Color.WHITE);
    48                     g.fillRect(0, 0, getWidth(), getHeight());
    49 
    50                     // horizontal Lines
    51                     for (int i = 1; i < 24; ++i) {
    52                         if (i % 3 == 0)
    53                             g.setColor(Color.BLACK);
    54                         else
    55                             g.setColor(Color.LIGHT_GRAY);
    56 
    57                         g.drawLine(0, getMinutePosition(i * 60), getWidth(),
    58                                 getMinutePosition(i * 60));
    59                     }
    60 
    61                     // vertical Lines
    62                     g.setColor(Color.BLACK);
    63                     for (int i = 1; i < 7; ++i)
    64                         g.drawLine(getDayPosition(i), 0, getDayPosition(i),
    65                                 getHeight());
    66 
    67                     // if a new Rect is dragged draw it
    68                     if (day0 >= 0) {
    69                         Graphics2D g2D = (Graphics2D) g;
    70 
    71                         int day2 = Math.min(day0, day1);
    72                         int day3 = Math.max(day0, day1);
    73                         int minute2 = Math.min(minute0, minute1);
    74                         int minute3 = Math.max(minute0, minute1);
    75                         Rectangle bounds = getPanelBoundsForTimeinterval(day2,
    76                                 day3 + 1, minute2, minute3);
    77 
    78                         TimeRect.drawTimeRect(g2D, bounds, minute2 == minute3,
    79                                 false);
    80                     }
    81                 } else {
    82                     g.setColor(Color.LIGHT_GRAY);
    83                     g.fillRect(0, 0, getWidth(), getHeight());
    84                 }
    85             }
    86         };
    87         contentPanel.addMouseListener(this);
    88         contentPanel.addMouseMotionListener(this);
    89         contentPanel.setLayout(null);
    90         contentPanel.setPreferredSize(new Dimension(180, 384));
    91 
    92         initTimeRects();
    93 
    94         scrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
    95                 JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    96         scrollPane.setViewportView(contentPanel);
    97 
    98         // the upper Panel for showing Weekdays
    99         scrollPane.setColumnHeaderView(new JPanel() {
    100             @Override
    101             public Dimension getPreferredSize() {
    102                 return new Dimension(contentPanel.getWidth(), dayAxisHeight);
    103             }
    104 
    105             @Override
    106             public void paintComponent(Graphics g) {
    107                 g.setColor(Color.WHITE);
    108                 g.fillRect(0, 0, getWidth(), getHeight());
    109 
    110                 g.setColor(Color.BLACK);
    111                 for (int i = 0; i < 7; ++i) {
    112                     if (i > 0)
    113                         g.drawLine(getDayPosition(i) + 1, 0,
    114                                 getDayPosition(i) + 1, getHeight());
    115 
    116                     String text = OpeningTimeCompiler.WEEKDAYS[i];
    117                     g.drawString(text, (int) (getDayPosition(i + 0.5) - g
    118                             .getFontMetrics().stringWidth(text) * 0.5),
    119                             (int) (dayAxisHeight * 0.5 + g.getFontMetrics()
    120                                     .getHeight() * 0.35));
    121                 }
    122             }
    123         });
    124 
    125         // the left Panel for showing the hours
    126         scrollPane.setRowHeaderView(new JPanel() {
    127             @Override
    128             public Dimension getPreferredSize() {
    129                 return new Dimension(timeAxisWidth, contentPanel.getHeight());
    130             }
    131 
    132             @Override
    133             public void paintComponent(Graphics g) {
    134                 g.setColor(Color.WHITE);
    135                 g.fillRect(0, 0, getWidth(), getHeight());
    136 
    137                 for (int i = 1; i < 24; ++i) {
    138                     if (i % 3 == 0) {
    139                         g.setColor(Color.BLACK);
    140                         String text = ((i < 10) ? "0" + i : i) + ":00";
    141                         g.drawString(
    142                                 text,
    143                                 timeAxisWidth - 10
    144                                         - g.getFontMetrics().stringWidth(text),
    145                                 getMinutePosition(i * 60)
    146                                         + (int) (g.getFontMetrics().getHeight() * 0.35));
    147                     } else
    148                         g.setColor(Color.LIGHT_GRAY);
    149 
    150                     g.drawLine(getWidth() - 4, getMinutePosition(i * 60) + 1,
    151                             getWidth(), getMinutePosition(i * 60) + 1);
    152                 }
    153             }
    154         });
    155 
    156         setLayout(new BorderLayout());
    157         add(scrollPane, BorderLayout.CENTER);
     34        dialog = oheDialogPanel;
     35
     36        // the MainPanel for showing the TimeRects
     37        contentPanel = new JPanel() {
     38            @Override
     39            public void setSize(Dimension d) {
     40                super.setSize(d);
     41                repositionTimeRects();
     42            }
     43
     44            @Override
     45            public void paintComponent(Graphics g) {
     46                if (OheEditor.this.isEnabled()) {
     47                    g.setColor(Color.WHITE);
     48                    g.fillRect(0, 0, getWidth(), getHeight());
     49                    if (dialog.getHourMode() == ClockSystem.TWELVE_HOURS) {
     50                        g.setColor(new Color(255, 255, 218));
     51                        g.fillRect(0, getMinutePosition(12 * 60), getWidth(), getHeight() - getMinutePosition(12 * 60));
     52                    }
     53
     54                    // horizontal Lines
     55                    for (int i = 1; i < 24; ++i) {
     56                        if (i % 3 == 0) {
     57                            g.setColor(Color.BLACK);
     58                        } else {
     59                            g.setColor(Color.LIGHT_GRAY);
     60                        }
     61
     62                        g.drawLine(0, getMinutePosition(i * 60), getWidth(), getMinutePosition(i * 60));
     63                    }
     64
     65                    // vertical Lines
     66                    g.setColor(Color.BLACK);
     67                    for (int i = 1; i < 7; ++i) {
     68                        g.drawLine(getDayPosition(i), 0, getDayPosition(i), getHeight());
     69                    }
     70
     71                    // if a new Rect is dragged draw it
     72                    if (day0 >= 0) {
     73                        Graphics2D g2D = (Graphics2D) g;
     74
     75                        int day2 = Math.min(day0, day1);
     76                        int day3 = Math.max(day0, day1);
     77                        int minute2 = Math.min(minute0, minute1);
     78                        int minute3 = Math.max(minute0, minute1);
     79                        Rectangle bounds = getPanelBoundsForTimeinterval(day2, day3 + 1, minute2, minute3);
     80
     81                        TimeRect.drawTimeRect(g2D, bounds, minute2 == minute3, false);
     82                    }
     83                } else {
     84                    g.setColor(Color.LIGHT_GRAY);
     85                    g.fillRect(0, 0, getWidth(), getHeight());
     86                }
     87            }
     88        };
     89        contentPanel.addMouseListener(this);
     90        contentPanel.addMouseMotionListener(this);
     91        contentPanel.setLayout(null);
     92        contentPanel.setPreferredSize(new Dimension(180, 384));
     93
     94        initTimeRects();
     95
     96        scrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
     97                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
     98        scrollPane.setViewportView(contentPanel);
     99
     100        // the upper Panel for showing Weekdays
     101        scrollPane.setColumnHeaderView(new JPanel() {
     102            @Override
     103            public Dimension getPreferredSize() {
     104                return new Dimension(contentPanel.getWidth(), dayAxisHeight);
     105            }
     106
     107            @Override
     108            public void paintComponent(Graphics g) {
     109                g.setColor(Color.WHITE);
     110                g.fillRect(0, 0, getWidth(), getHeight());
     111
     112                g.setColor(Color.BLACK);
     113                for (int i = 0; i < 7; ++i) {
     114                    if (i > 0) {
     115                        g.drawLine(getDayPosition(i) + 1, 0, getDayPosition(i) + 1, getHeight());
     116                    }
     117
     118                    String text = OpeningTimeCompiler.WEEKDAYS[i];
     119                    g.drawString(text, (int) (getDayPosition(i + 0.5) - g.getFontMetrics().stringWidth(text) * 0.5),
     120                            (int) (dayAxisHeight * 0.5 + g.getFontMetrics().getHeight() * 0.35));
     121                }
     122            }
     123        });
     124
     125        // the left Panel for showing the hours
     126        scrollPane.setRowHeaderView(new JPanel() {
     127            @Override
     128            public Dimension getPreferredSize() {
     129                return new Dimension(timeAxisWidth, contentPanel.getHeight());
     130            }
     131
     132            @Override
     133            public void paintComponent(Graphics g) {
     134                g.setColor(Color.WHITE);
     135                g.fillRect(0, 0, getWidth(), getHeight());
     136                if (dialog.getHourMode() == ClockSystem.TWELVE_HOURS) {
     137                    g.setColor(new Color(255, 255, 218));
     138                    g.fillRect(0, getMinutePosition(12 * 60), getWidth(), getHeight() - getMinutePosition(12 * 60));
     139                }
     140
     141                for (int i = 1; i < 24; ++i) {
     142                    if (i % 3 == 0) {
     143                        g.setColor(Color.BLACK);
     144                        String text = OpeningTimeUtils.timeString(i * 60, dialog.getHourMode(), false);
     145                        g.drawString(text, (timeAxisWidth - g.getFontMetrics().stringWidth(text)) / 2,
     146                                getMinutePosition(i * 60) + (int) (g.getFontMetrics().getHeight() * 0.35));
     147                    } else {
     148                        g.setColor(Color.LIGHT_GRAY);
     149                    }
     150
     151                    g.drawLine(getWidth() - 4, getMinutePosition(i * 60), getWidth(), getMinutePosition(i * 60));
     152                }
     153
     154                g.setColor(Color.BLACK);
     155                String text = OpeningTimeUtils.timeString(0, dialog.getHourMode(), false);
     156                g.drawString(text, (timeAxisWidth - g.getFontMetrics().stringWidth(text)) / 2, getMinutePosition(0)
     157                        + (int) (g.getFontMetrics().getHeight() * 1.0));
     158                if (dialog.getHourMode() == ClockSystem.TWELVE_HOURS) {
     159                    text = "AM";
     160                    g.drawString(text, (timeAxisWidth - g.getFontMetrics().stringWidth(text)) / 2, getMinutePosition(0)
     161                            + (int) (g.getFontMetrics().getHeight() * 1.85));
     162                    text = "PM";
     163                    g.drawString(text, (timeAxisWidth - g.getFontMetrics().stringWidth(text)) / 2,
     164                            getMinutePosition(12 * 60) + (int) (g.getFontMetrics().getHeight() * 1.2));
     165                }
     166            }
     167        });
     168
     169        setLayout(new BorderLayout());
     170        add(scrollPane, BorderLayout.CENTER);
    158171    }
    159172
    160173    // update all the TimeRects with new Data
    161174    public void initTimeRects() {
    162         contentPanel.removeAll();
    163 
    164         ArrayList<int[]> time;
    165         try {
    166             time = dialog.getTime();
    167         } catch (Exception exc) {
    168             setEnabled(false);
    169             return;
    170         }
    171 
    172         setEnabled(true);
    173         timeRects = new ArrayList<TimeRect>();
    174         if (time != null) {
    175             for (int[] timeRectValues : time) {
    176                 int day0 = timeRectValues[0];
    177                 int day1 = timeRectValues[1];
    178                 int minute0 = timeRectValues[2];
    179                 int minute1 = timeRectValues[3];
    180                 TimeRect timeRect = new TimeRect(OheEditor.this, day0, day1,
    181                         minute0, minute1);
    182                 timeRects.add(timeRect);
    183                 contentPanel.add(timeRect);
    184             }
    185         }
    186 
    187         repositionTimeRects();
    188         repaint();
     175        contentPanel.removeAll();
     176
     177        ArrayList<int[]> time;
     178        try {
     179            time = dialog.getTime();
     180        } catch (Exception exc) {
     181            setEnabled(false);
     182            return;
     183        }
     184
     185        setEnabled(true);
     186        timeRects = new ArrayList<TimeRect>();
     187        if (time != null) {
     188            for (int[] timeRectValues : time) {
     189                int day0 = timeRectValues[0];
     190                int day1 = timeRectValues[1];
     191                int minute0 = timeRectValues[2];
     192                int minute1 = timeRectValues[3];
     193                TimeRect timeRect = new TimeRect(OheEditor.this, day0, day1, minute0, minute1);
     194                timeRects.add(timeRect);
     195                contentPanel.add(timeRect);
     196            }
     197        }
     198
     199        repositionTimeRects();
     200        repaint();
    189201    }
    190202
    191203    protected void repositionTimeRects() {
    192         if (timeRects != null)
    193             for (TimeRect timeRect : timeRects)
    194                 timeRect.reposition();
     204        if (timeRects != null) {
     205            for (TimeRect timeRect : timeRects) {
     206                timeRect.reposition();
     207            }
     208        }
    195209    }
    196210
    197211    // returns the physical Borders of the TimeRect on the mainPanel
    198     public Rectangle getPanelBoundsForTimeinterval(int dayStart, int dayEnd,
    199             int minutesStart, int minutesEnd) {
    200         int x = getDayPosition(dayStart);
    201         int y = getMinutePosition(minutesStart);
    202         int width = getDayPosition(dayEnd) - getDayPosition(dayStart);
    203         int height = getMinutePosition(minutesEnd)
    204                 - getMinutePosition(minutesStart);
    205 
    206         // work around openjdk bug
    207         if (Main.isOpenjdk) {
    208             x++;
    209             y++;
    210         }
    211 
    212         if (minutesStart == minutesEnd)
    213             return new Rectangle(x, y - 2 - TimeRect.verticalNonDrawedPixels,
    214                     width, height + 5 + 2 * TimeRect.verticalNonDrawedPixels);
    215 
    216         return new Rectangle(x, y, width, height + 1);
     212    public Rectangle getPanelBoundsForTimeinterval(int dayStart, int dayEnd, int minutesStart, int minutesEnd) {
     213        int x = getDayPosition(dayStart);
     214        int y = getMinutePosition(minutesStart);
     215        int width = getDayPosition(dayEnd) - getDayPosition(dayStart);
     216        int height = getMinutePosition(minutesEnd) - getMinutePosition(minutesStart);
     217
     218        // work around openjdk bug
     219        if (Main.isOpenjdk) {
     220            x++;
     221            y++;
     222        }
     223
     224        if (minutesStart == minutesEnd)
     225            return new Rectangle(x, y - 2 - TimeRect.verticalNonDrawedPixels, width, height + 5 + 2
     226                    * TimeRect.verticalNonDrawedPixels);
     227
     228        return new Rectangle(x, y, width, height + 1);
    217229    }
    218230
    219231    public double getDayWidth() {
    220         return (contentPanel.getWidth() - 1) / 7.0;
     232        return (contentPanel.getWidth() - 1) / 7.0;
    221233    }
    222234
    223235    public int getDayPosition(double d) {
    224         return (int) (d * getDayWidth());
     236        return (int) (d * getDayWidth());
    225237    }
    226238
    227239    public double getMinuteHeight() {
    228         return (contentPanel.getHeight() - 1) / (24.0 * 60);
     240        return (contentPanel.getHeight() - 1) / (24.0 * 60);
    229241    }
    230242
    231243    public int getMinutePosition(int minute) {
    232         return (int) (minute * getMinuteHeight());
     244        return (int) (minute * getMinuteHeight());
    233245    }
    234246
    235247    // removes the given timerect from the panel and from the arraylist
    236248    public void removeTimeRect(TimeRect timeRectToRemove) {
    237         timeRects.remove(timeRectToRemove);
    238         contentPanel.remove(timeRectToRemove);
    239         dialog.updateValueField(timeRects);
    240         repaint();
     249        timeRects.remove(timeRectToRemove);
     250        contentPanel.remove(timeRectToRemove);
     251        dialog.updateValueField(timeRects);
     252        repaint();
    241253    }
    242254
     
    255267    @Override
    256268    public void mouseEntered(MouseEvent evt) {
    257         mousePositionChanged(0, 0, true);
     269        mousePositionChanged(0, 0, true);
    258270    }
    259271
    260272    @Override
    261273    public void mouseExited(MouseEvent evt) {
    262         mousePositionChanged(0, 0, false);
     274        mousePositionChanged(0, 0, false);
    263275    }
    264276
    265277    @Override
    266278    public void mousePressed(MouseEvent evt) {
    267         day0 = (int) Math.floor(evt.getX() / getDayWidth());
    268         minute0 = (int) Math.floor(evt.getY()
    269                 / (getMinuteHeight() * TimeRect.minuteResterize))
    270                 * TimeRect.minuteResterize;
    271         day1 = day0;
    272         minute1 = minute0;
    273         xDragStart = evt.getX();
    274         yDragStart = evt.getY();
     279        day0 = (int) Math.floor(evt.getX() / getDayWidth());
     280        minute0 = (int) Math.floor(evt.getY() / (getMinuteHeight() * TimeRect.minuteResterize))
     281        * TimeRect.minuteResterize;
     282        day1 = day0;
     283        minute1 = minute0;
     284        xDragStart = evt.getX();
     285        yDragStart = evt.getY();
    275286    }
    276287
    277288    @Override
    278289    public void mouseReleased(MouseEvent evt) {
    279         // mouse must be moved 5px before creating a rect
    280         if (xDragStart == -1
    281                 || Math.abs(evt.getX() - xDragStart)
    282                         + Math.abs(evt.getY() - yDragStart) > 5) {
    283             int day2 = Math.min(day0, day1);
    284             int day3 = Math.max(day0, day1);
    285             int minute2 = Math.min(minute0, minute1);
    286             int minute3 = Math.max(minute0, minute1);
    287 
    288             TimeRect timeRect = new TimeRect(OheEditor.this, day2, day3,
    289                     minute2, minute3);
    290             timeRects.add(timeRect);
    291             contentPanel.add(timeRect);
    292             timeRect.reposition();
    293             dialog.updateValueField(timeRects);
    294 
    295             day0 = -1;
    296             repaint();
    297         }
     290        // mouse must be moved 5px before creating a rect
     291        if (xDragStart == -1 || Math.abs(evt.getX() - xDragStart) + Math.abs(evt.getY() - yDragStart) > 5) {
     292            int day2 = Math.min(day0, day1);
     293            int day3 = Math.max(day0, day1);
     294            int minute2 = Math.min(minute0, minute1);
     295            int minute3 = Math.max(minute0, minute1);
     296
     297            TimeRect timeRect = new TimeRect(OheEditor.this, day2, day3, minute2, minute3);
     298            timeRects.add(timeRect);
     299            contentPanel.add(timeRect);
     300            timeRect.reposition();
     301            dialog.updateValueField(timeRects);
     302
     303            day0 = -1;
     304            repaint();
     305        }
    298306    }
    299307
    300308    @Override
    301309    public void mouseDragged(MouseEvent evt) {
    302         // mouse must be moved 5px before drawing a rect
    303         if (xDragStart == -1
    304                 || Math.abs(evt.getX() - xDragStart)
    305                         + Math.abs(evt.getY() - yDragStart) > 5) {
    306             xDragStart = -1;
    307             day1 = (int) Math.floor(evt.getX() / getDayWidth());
    308             minute1 = (int) Math.floor(evt.getY()
    309                     / (getMinuteHeight() * TimeRect.minuteResterize))
    310                     * TimeRect.minuteResterize;
    311 
    312             // ensure that the new time is in a valid range
    313             day1 = Math.max(day1, 0);
    314             day1 = Math.min(day1, 6);
    315             minute1 = Math.max(minute1, 0);
    316             minute1 = Math.min(minute1, 24 * 60);
    317 
    318             repaint();
    319         }
    320         mousePositionChanged(evt.getX(), evt.getY(), true);
     310        // mouse must be moved 5px before drawing a rect
     311        if (xDragStart == -1 || Math.abs(evt.getX() - xDragStart) + Math.abs(evt.getY() - yDragStart) > 5) {
     312            xDragStart = -1;
     313            day1 = (int) Math.floor(evt.getX() / getDayWidth());
     314            minute1 = (int) Math.floor(evt.getY() / (getMinuteHeight() * TimeRect.minuteResterize))
     315            * TimeRect.minuteResterize;
     316
     317            // ensure that the new time is in a valid range
     318            day1 = Math.max(day1, 0);
     319            day1 = Math.min(day1, 6);
     320            minute1 = Math.max(minute1, 0);
     321            minute1 = Math.min(minute1, 24 * 60);
     322
     323            repaint();
     324        }
     325        mousePositionChanged(evt.getX(), evt.getY(), true);
    321326    }
    322327
    323328    @Override
    324329    public void mouseMoved(MouseEvent evt) {
    325         mousePositionChanged(evt.getX(), evt.getY(), true);
    326     }
    327 
    328     public void mousePositionChanged(int x, int y,  boolean mouseInside) {
    329         if (mouseInside) {
    330             int actualDay = (int) Math.floor(x / getDayWidth());
    331             int minutes = (int) Math.floor(y
    332                     / (getMinuteHeight() * TimeRect.minuteResterize))
    333                     * TimeRect.minuteResterize;
    334             actualDay = Math.max(0, Math.min(6, actualDay));
    335             minutes = Math.max(0, Math.min(24 * 60, minutes));
    336             dialog.setMousePositionText(OpeningTimeCompiler.WEEKDAYS[actualDay]
    337                     + " " + OpeningTimeUtils.timeString(minutes));
    338         } else
    339             dialog.setMousePositionText("-");
     330        mousePositionChanged(evt.getX(), evt.getY(), true);
     331    }
     332
     333    public void mousePositionChanged(int x, int y, boolean mouseInside) {
     334        if (mouseInside) {
     335            int actualDay = (int) Math.floor(x / getDayWidth());
     336            int minutes = (int) Math.floor(y / (getMinuteHeight() * TimeRect.minuteResterize))
     337            * TimeRect.minuteResterize;
     338            actualDay = Math.max(0, Math.min(6, actualDay));
     339            minutes = Math.max(0, Math.min(24 * 60, minutes));
     340            dialog.setMousePositionText(OpeningTimeCompiler.WEEKDAYS[actualDay] + " "
     341                    + OpeningTimeUtils.timeString(minutes, dialog.getHourMode(), true));
     342        } else {
     343            dialog.setMousePositionText("-");
     344        }
    340345    }
    341346}
Note: See TracChangeset for help on using the changeset viewer.