OSDN Git Service

リスト形式の裏番組マークの問題修正(再コミット)
authorpeeweedee <peeweedee@users.sourceforge.jp>
Fri, 31 Jan 2014 18:03:13 +0000 (03:03 +0900)
committerpeeweedee <peeweedee@users.sourceforge.jp>
Fri, 31 Jan 2014 18:03:13 +0000 (03:03 +0900)
TinyBannavi/src/tainavi/AbsListedView.java

index 42b8d2f..6856fb6 100644 (file)
@@ -323,7 +323,6 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
 \r
        private class Marker {\r
                RsvMark rsvmark = null;\r
-               RsvMark uramark = null;\r
                RsvMark pickmark = null;\r
                String myself = null;\r
                String color = null;\r
@@ -335,7 +334,7 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
        }\r
 \r
        private static final String PICKUP_COLOR                = CommonUtils.color2str(Color.BLACK);\r
-       private static final String URABAN_COLOR                = CommonUtils.color2str(Color.BLACK);\r
+       private static final String URABAN_COLOR                = "#666666";\r
        private static final String DUPMARK_COLOR               = "#FFB6C1";\r
        \r
        private static final String TreeExpRegFile_Listed = "env"+File.separator+"tree_expand_listed.xml";\r
@@ -2423,108 +2422,155 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
         */\r
        private Marker getReservedMarkChar(ListedItem data) {\r
                \r
-               //\r
-               HDDRecorder recorder = null;                                            // その番組の予約がみつかった最初のレコーダ\r
-               ReserveList reserve = null;                                                     // 見つかった予約情報\r
-               String start = null;                                                            // 実行予定が複数あったら一番近いのを選ぶ\r
-               String end = "";                                                                        // 同上\r
-               long diff = 86400L*30L;\r
-               \r
-               String myself = getSelectedRecorderOnToolbar();\r
-               HDDRecorderList recs = recorders.findInstance(myself);\r
-\r
                // コンボボックスの指定はピックアップである\r
+               String myself = getSelectedRecorderOnToolbar();\r
                boolean isPickupOnly = ( myself == HDDRecorder.SELECTED_PICKUP ) ;\r
-               \r
+\r
+               Marker mark = new Marker("", "");\r
+               boolean marked = false;\r
+\r
                if ( ! isPickupOnly ) {\r
-                       \r
                        // 「ピックアップ」が選択されていればここは通らない\r
-                       \r
-                       // 基準日時\r
-                       String critDateTime = CommonUtils.getCritDateTime(env.getDisplayPassedReserve());\r
-                       \r
-                       // 全予約をなめて、一番近い予約を探さなければならない\r
-                       for ( HDDRecorder rec : recs )\r
-                       {\r
-                               if (diff == 0) break;\r
-                               \r
-                               for ( ReserveList res : rec.getReserves() )\r
-                               {\r
-                                       if (diff == 0) break;\r
-                                       \r
-                                       // Exec == ON ?\r
-                                       if ( env.getDisplayOnlyExecOnEntry() && ! res.getExec()) {\r
+\r
+                       // 表示対象のレコーダを絞る\r
+                       HDDRecorderList s_recorders = recorders.findInstance(myself);\r
+\r
+                       // 近傍の予約を探す\r
+                       ArrayList<NeighborReserveList> n_reserves = findOverlapReserves(s_recorders, data);\r
+\r
+                       for ( NeighborReserveList n_res : n_reserves ) {\r
+                               if ( ! data.tvd.center.equals(n_res.getReserve().getCh_name()) ) {\r
+                                       // 他局はアウト\r
+                                       continue;\r
+                               }\r
+\r
+                               // 予約マーク\r
+                               mark = new Marker(n_res.getRecorder().Myself(), n_res.getRecorder().getColor(n_res.getReserve().getTuner()));\r
+                               marked = _getReservedMarkCharNormal(mark, data, n_res);\r
+                               break;\r
+                       }\r
+\r
+                       // 裏番組予約マーク\r
+                       if ( env.getShowRsvUra() && ! marked ) {\r
+                               for ( NeighborReserveList n_res : n_reserves ) {\r
+                                       if ( data.tvd.center.equals(n_res.getReserve().getCh_name()) ) {\r
+                                               // 裏番組だから、同じ局はアウト\r
                                                continue;\r
                                        }\r
-                                       \r
-                                       if (res.getCh_name() == null) {\r
-                                               // 警告したい!\r
+                                       if ( ! n_res.getReserve().getExec() ) {\r
+                                               // 実行不可なら裏番組にはならない\r
                                                continue;\r
                                        }\r
-                                       \r
-                                       // 局が一致して\r
-                                       if ( ! data.tvd.center.equals(res.getCh_name())) {\r
+\r
+                                       // 予約マーク\r
+                                       marked = _getReservedMarkCharUra(mark, data) || marked;\r
+                                       break;\r
+                               }\r
+\r
+                       }\r
+               }\r
+\r
+               // ピックアップマーク\r
+               if ( env.getShowRsvPickup() ) {\r
+                       marked = _getReservedMarkCharPickup(mark, data) || marked;\r
+               }\r
+\r
+               return(marked ? mark : null);\r
+       }\r
+\r
+       /**\r
+        * その番組の近傍の予約情報のリストを作成する\r
+        */\r
+       private ArrayList<NeighborReserveList> findOverlapReserves(HDDRecorderList s_recorders, ListedItem data) {\r
+\r
+               // 近傍予約のリスト\r
+               ArrayList<NeighborReserveList> n_reserves = new ArrayList<NeighborReserveList>();\r
+\r
+               // 基準日時\r
+               String critDateTime = CommonUtils.getCritDateTime(env.getDisplayPassedReserve());\r
+\r
+               // 全予約をなめて、一番近い予約を探さなければならない\r
+               for ( HDDRecorder rec : s_recorders ) {\r
+                       for ( ReserveList res : rec.getReserves() ) {\r
+                               if ( env.getDisplayOnlyExecOnEntry() && ! res.getExec() ) {\r
+                                       // 実行可能な予約しかいらない場合\r
+                                       continue;\r
+                               }\r
+\r
+                               if ( res.getCh_name() == null ) {\r
+                                       // TODO 警告したい!\r
+                                       continue;\r
+                               }\r
+\r
+                               // 開始終了日時リストを生成する\r
+                               ArrayList<String> starts = new ArrayList<String>();\r
+                               ArrayList<String> ends = new ArrayList<String>();\r
+                               CommonUtils.getStartEndList(starts, ends, res);\r
+\r
+                               for ( int j=0; j<starts.size(); j++ ) {\r
+                                       if ( critDateTime.compareTo(ends.get(j)) > 0 ) {\r
+                                               // 終了済みは対象外\r
                                                continue;\r
                                        }\r
-                                               \r
-                                       // 開始終了日時リストを生成する\r
-                                       ArrayList<String> starts = new ArrayList<String>();\r
-                                       ArrayList<String> ends = new ArrayList<String>();\r
-                                       CommonUtils.getStartEndList(starts, ends, res);\r
-                                       \r
-                                       for (int j=0; j<starts.size(); j++) {\r
-                                               if (critDateTime.compareTo(ends.get(j)) > 0) {\r
-                                                       // 終了済みは対象外\r
-                                                       continue;\r
-                                               }\r
-                                               if ( CommonUtils.isOverlap(data.tvd.startDateTime, data.tvd.endDateTime, starts.get(j), ends.get(j), true) ) {\r
-                                                       // より開始時刻が近いものを選ぶ\r
-                                                       if ( start == null ) {\r
-                                                               start = starts.get(j);\r
-                                                       }\r
-                                                       long df = CommonUtils.getDiffDateTime(starts.get(j), data.tvd.startDateTime);\r
-                                                       if ( diff > df ) {\r
-                                                               recorder = rec;\r
-                                                               reserve = res;\r
-                                                               start = starts.get(j);\r
-                                                               end = ends.get(j);\r
-                                                               diff = df;\r
+                                       if ( CommonUtils.isOverlap(data.tvd.startDateTime, data.tvd.endDateTime, starts.get(j), ends.get(j), true) ) {\r
+                                               // 重なってる(開始時間=終了時間は除外)\r
+                                               long df = CommonUtils.getDiffDateTime(starts.get(j), data.tvd.startDateTime);\r
+                                               NeighborReserveList n_res = new NeighborReserveList(rec, res, starts.get(j), ends.get(j), df);\r
+\r
+                                               // 距離昇順に並べる\r
+                                               int index = 0;\r
+                                               for ( ; index < n_reserves.size(); index++ ) {\r
+                                                       if ( n_res.getDiff() < n_reserves.get(index).getDiff() ) {\r
+                                                               break;\r
                                                        }\r
                                                }\r
+                                               n_reserves.add(index, n_res);\r
+\r
+                                               break;\r
                                        }\r
                                }\r
                        }\r
                }\r
-               \r
-               // 予約されている\r
-               \r
-               Marker mark;\r
-               boolean marked = false;\r
 \r
-               // 予約マーク\r
-               if (recorder != null) {\r
-                       mark = new Marker(recorder.Myself(), recorder.getColor(reserve.getTuner()));\r
-                       marked = marked || _getReservedMarkCharNormal(mark, data, recorder, reserve, start, end);\r
-               }\r
-               else {\r
-                       mark = new Marker("", "");\r
-               }\r
-               // 裏番組予約マーク\r
-               if (env.getShowRsvUra() && mark.rsvmark == null) {\r
-                       marked = _getReservedMarkCharUra(mark, data) || marked;\r
+               return n_reserves;\r
+       }\r
+\r
+       private class NeighborReserveList {\r
+               public NeighborReserveList(HDDRecorder recorder, ReserveList reserve, String start, String end, long diff) {\r
+                       this.recorder = recorder;\r
+                       this.reserve = reserve;\r
+                       this.start = start;\r
+                       this.end = end;\r
+                       this.diff = diff;\r
                }\r
-               // ピックアップマーク\r
-               marked = _getReservedMarkCharPickup(mark, data) || marked;\r
 \r
-               return(marked ? mark : null);\r
+               private HDDRecorder recorder;\r
+               public HDDRecorder getRecorder() { return recorder; }\r
+\r
+               private ReserveList reserve;\r
+               public ReserveList getReserve() { return reserve; }\r
+\r
+               private long diff;\r
+               public long getDiff() { return diff; }\r
+\r
+               private String start;\r
+               public String getStart() { return start; }\r
+\r
+               private String end;\r
+               public String getEnd() { return end; }\r
        }\r
+\r
        /**\r
         * @see #getReservedMarkChar(ListedItem)\r
         */\r
-       private boolean _getReservedMarkCharNormal(Marker mark, ListedItem data, HDDRecorder recorder, ReserveList reserve, String start, String end) {\r
+       private boolean _getReservedMarkCharNormal(Marker mark, ListedItem data, NeighborReserveList n_reserve) {\r
                \r
                // ここに入ってくる場合は時間の重なりが確認できているものだけである\r
-               \r
+               HDDRecorder recorder = n_reserve.getRecorder();\r
+               ReserveList reserve = n_reserve.getReserve();\r
+               String start = n_reserve.getStart();\r
+               String end = n_reserve.getEnd();\r
+\r
                RSVMARK_COND cond = getReservedMarkCond(data, start, end);\r
                \r
                if (debug) System.err.println(DBGID+data.tvd.title+" "+data.tvd.startDateTime+" "+data.tvd.endDateTime+" "+start+" "+end+" "+cond);\r
@@ -2656,6 +2702,14 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
        }\r
        \r
        private boolean _getReservedMarkCharUra(Marker mark, ListedItem data) {\r
+\r
+               mark.rsvmark = RsvMark.URABAN;\r
+               return true;\r
+               /*\r
+               if ( mark.rsvmark != null ) {\r
+                       return false;\r
+               }\r
+\r
                //\r
                String myself = getSelectedRecorderOnToolbar();\r
                HDDRecorderList recs = recorders.findInstance(myself);\r
@@ -2679,17 +2733,18 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
                                CommonUtils.getStartEndList(starts, ends, res);\r
                                for (int j=0; j<starts.size(); j++) {\r
                                        if ( CommonUtils.isOverlap(data.tvd.startDateTime, data.tvd.endDateTime, starts.get(j), ends.get(j), env.getAdjoiningNotRepetition()) ) {\r
-                                               mark.uramark = RsvMark.URABAN;\r
+                                               mark.rsvmark = RsvMark.URABAN;\r
                                                return true;\r
                                        }\r
                                }\r
                        }\r
                }\r
+\r
                return false;\r
+               */\r
        }\r
-       \r
-       \r
-       \r
+\r
+\r
        \r
        \r
        /*\r
@@ -4056,7 +4111,7 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
                        {\r
                                // 予約が入っているか否か\r
                                if ( c.marker != null ) {\r
-                                       if ( c.marker.rsvmark != null && c.marker.rsvmark != RsvMark.NOEXEC  ) {\r
+                                       if ( c.marker.rsvmark != null && c.marker.rsvmark != RsvMark.NOEXEC && c.marker.rsvmark != RsvMark.URABAN ) {\r
                                                prechkreserved = true;\r
                                        }\r
                                        else if ( c.marker.pickmark != null ) {\r
@@ -4143,7 +4198,7 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener
                        if ( c.size( ) > column ) {\r
                                // 特殊なカラム\r
                                if ( column == ListedColumn.RSVMARK.getColumn() ) {\r
-                                       if ( c.marker != null && c.marker.rsvmark != null ) {\r
+                                       if ( c.marker != null  && c.marker.rsvmark != null ) {\r
                                                if ( c.marker.rsvmark != RsvMark.URABAN ) {\r
                                                        return c.marker.rsvmark.mark+"\0"+c.hide_rsvmarkcolor;\r
                                                }\r