\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
}\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
*/\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
}\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
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
{\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
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