/** アクション{@value}。 */\r
public static final String CMD_FONTSIZESEL = "FONTSIZESEL";\r
\r
- private static final KeyStroke KEY_F1 = KeyStroke.getKeyStroke("F1");\r
- private static final KeyStroke KEY_F3 = KeyStroke.getKeyStroke("F3");\r
- private static final KeyStroke KEY_SHIFT_F3 =\r
- KeyStroke.getKeyStroke("shift F3");\r
- private static final KeyStroke KEY_F5 = KeyStroke.getKeyStroke("F5");\r
- private static final KeyStroke KEY_CTRL_F =\r
- KeyStroke.getKeyStroke("ctrl F");\r
-\r
/** WWWアイコン。 */\r
public static final Icon ICON_WWW = GUIUtils.getWWWIcon();\r
/** 検索アイコン。 */\r
/** 発言エディタアイコン。 */\r
public static final Icon ICON_EDITOR;\r
\r
+ private static final KeyStroke KEY_F1 = KeyStroke.getKeyStroke("F1");\r
+ private static final KeyStroke KEY_F3 = KeyStroke.getKeyStroke("F3");\r
+ private static final KeyStroke KEY_SHIFT_F3 =\r
+ KeyStroke.getKeyStroke("shift F3");\r
+ private static final KeyStroke KEY_F5 = KeyStroke.getKeyStroke("F5");\r
+ private static final KeyStroke KEY_CTRL_F =\r
+ KeyStroke.getKeyStroke("ctrl F");\r
+\r
static{\r
URL iconurl;\r
\r
Pattern.DOTALL);\r
}\r
\r
+\r
+ private final CharSequence source;\r
+ private final int startPos;\r
+ private final int endPos;\r
+ private final int day;\r
+ private final int hour;\r
+ private final int minute;\r
+ private final int talkNo;\r
+\r
+\r
+ /**\r
+ * アンカーのコンストラクタ。\r
+ * @param source アンカーが含まれる文字列\r
+ * @param startPos アンカーの始まる位置\r
+ * @param endPos アンカーの終わる位置\r
+ * @param talkNo 公開発言番号\r
+ */\r
+ private Anchor(CharSequence source, int startPos, int endPos,\r
+ int talkNo ){\r
+ super();\r
+\r
+ if(talkNo <= 0) throw new IllegalArgumentException();\r
+\r
+ this.source = source;\r
+ this.startPos = startPos;\r
+ this.endPos = endPos;\r
+ this.day = -1;\r
+ this.hour = -1;\r
+ this.minute = -1;\r
+ this.talkNo = talkNo;\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * アンカーのコンストラクタ。\r
+ * @param source アンカーが含まれる文字列\r
+ * @param startPos アンカーの始まる位置\r
+ * @param endPos アンカーの終わる位置\r
+ * @param day 日\r
+ * @param hour 時間(0-23)\r
+ * @param minute 分(0-59)\r
+ */\r
+ private Anchor(CharSequence source, int startPos, int endPos,\r
+ int day, int hour, int minute ){\r
+ super();\r
+\r
+ this.source = source;\r
+ this.startPos = startPos;\r
+ this.endPos = endPos;\r
+ this.day = day;\r
+ this.hour = hour;\r
+ this.minute = minute;\r
+ this.talkNo = -1;\r
+\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* 与えられた範囲指定文字列からアンカーを抽出する。\r
* @param source 検索対象文字列\r
return anchor;\r
}\r
\r
- private final CharSequence source;\r
- private final int startPos;\r
- private final int endPos;\r
- private final int day;\r
- private final int hour;\r
- private final int minute;\r
- private final int talkNo;\r
-\r
- /**\r
- * アンカーのコンストラクタ。\r
- * @param source アンカーが含まれる文字列\r
- * @param startPos アンカーの始まる位置\r
- * @param endPos アンカーの終わる位置\r
- * @param day 日\r
- * @param hour 時間(0-23)\r
- * @param minute 分(0-59)\r
- */\r
- private Anchor(CharSequence source, int startPos, int endPos,\r
- int day, int hour, int minute ){\r
- super();\r
-\r
- this.source = source;\r
- this.startPos = startPos;\r
- this.endPos = endPos;\r
- this.day = day;\r
- this.hour = hour;\r
- this.minute = minute;\r
- this.talkNo = -1;\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * アンカーのコンストラクタ。\r
- * @param source アンカーが含まれる文字列\r
- * @param startPos アンカーの始まる位置\r
- * @param endPos アンカーの終わる位置\r
- * @param talkNo 公開発言番号\r
- */\r
- private Anchor(CharSequence source, int startPos, int endPos,\r
- int talkNo ){\r
- super();\r
-\r
- if(talkNo <= 0) throw new IllegalArgumentException();\r
-\r
- this.source = source;\r
- this.startPos = startPos;\r
- this.endPos = endPos;\r
- this.day = -1;\r
- this.hour = -1;\r
- this.minute = -1;\r
- this.talkNo = talkNo;\r
-\r
- return;\r
- }\r
-\r
/**\r
* アンカーの含まれる文字列を返す。\r
* @return アンカーの含まれる文字列\r
*/\r
public class Avatar implements Comparable<Avatar> {\r
\r
+ /** ゲルト。 */\r
+ public static final Avatar AVATAR_GERD;\r
+\r
private static final List<Avatar> AVATAR_LIST;\r
private static final Map<String, Avatar> AVATAR_MAP;\r
\r
private static final Pattern AVATAR_PATTERN;\r
\r
- /** ゲルト。 */\r
- public static final Avatar AVATAR_GERD;\r
-\r
static{\r
List<PreDefAvatar> predefs;\r
try{\r
assert AVATAR_GERD != null;\r
}\r
\r
+\r
+ private final String name;\r
+ private final String jobTitle;\r
+ private final String fullName;\r
+ private final int idNum;\r
+ private final String identifier;\r
+ private final int hashNum;\r
+\r
+\r
+ /**\r
+ * Avatarを生成する。\r
+ * @param name 名前\r
+ * @param jobTitle 職業名\r
+ * @param idNum 通し番号\r
+ * @param identifier 識別文字列\r
+ */\r
+ private Avatar(String name,\r
+ String jobTitle,\r
+ int idNum,\r
+ String identifier ){\r
+ this.name = name.intern();\r
+ this.jobTitle = jobTitle.intern();\r
+ this.idNum = idNum;\r
+ this.identifier = identifier.intern();\r
+\r
+ this.fullName = (this.jobTitle + " " + this.name).intern();\r
+\r
+ this.hashNum = this.fullName.hashCode() ^ this.idNum;\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * Avatarを生成する。\r
+ * @param fullName フルネーム\r
+ */\r
+ // TODO 当面は呼ばれないはず。Z国とか向け。\r
+ public Avatar(String fullName){\r
+ this.fullName = fullName.intern();\r
+ this.idNum = -1;\r
+\r
+ String[] tokens = this.fullName.split("\\p{Blank}+", 2);\r
+ if(tokens.length == 1){\r
+ this.jobTitle = null;\r
+ this.name = this.fullName;\r
+ }else if(tokens.length == 2){\r
+ this.jobTitle = tokens[0].intern();\r
+ this.name = tokens[1].intern();\r
+ }else{\r
+ this.jobTitle = null;\r
+ this.name = null;\r
+ assert false;\r
+ }\r
+\r
+ this.identifier = "???".intern();\r
+\r
+ this.hashNum = this.fullName.hashCode() ^ this.idNum;\r
+\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* 定義済みAvatar群の生成。\r
* @param predefs 定義済みAvatar元データ群\r
return null;\r
}\r
\r
- private final String name;\r
- private final String jobTitle;\r
- private final String fullName;\r
- private final int idNum;\r
- private final String identifier;\r
- private final int hashNum;\r
-\r
- /**\r
- * Avatarを生成する。\r
- * @param name 名前\r
- * @param jobTitle 職業名\r
- * @param idNum 通し番号\r
- * @param identifier 識別文字列\r
- */\r
- private Avatar(String name,\r
- String jobTitle,\r
- int idNum,\r
- String identifier ){\r
- this.name = name.intern();\r
- this.jobTitle = jobTitle.intern();\r
- this.idNum = idNum;\r
- this.identifier = identifier.intern();\r
-\r
- this.fullName = (this.jobTitle + " " + this.name).intern();\r
-\r
- this.hashNum = this.fullName.hashCode() ^ this.idNum;\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * Avatarを生成する。\r
- * @param fullName フルネーム\r
- */\r
- // TODO 当面は呼ばれないはず。Z国とか向け。\r
- public Avatar(String fullName){\r
- this.fullName = fullName.intern();\r
- this.idNum = -1;\r
-\r
- String[] tokens = this.fullName.split("\\p{Blank}+", 2);\r
- if(tokens.length == 1){\r
- this.jobTitle = null;\r
- this.name = this.fullName;\r
- }else if(tokens.length == 2){\r
- this.jobTitle = tokens[0].intern();\r
- this.name = tokens[1].intern();\r
- }else{\r
- this.jobTitle = null;\r
- this.name = null;\r
- assert false;\r
- }\r
-\r
- this.identifier = "???".intern();\r
-\r
- this.hashNum = this.fullName.hashCode() ^ this.idNum;\r
-\r
- return;\r
- }\r
-\r
/**\r
* フルネームを取得する。\r
* @return フルネーム\r
\r
private static final int RADIUS = 5;\r
\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ */\r
+ public BalloonBorder(){\r
+ super();\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* 隙間が透明なフキダシ装飾を任意のコンポーネントに施す。\r
* @param inner 装飾対象のコンポーネント\r
}\r
\r
/**\r
- * コンストラクタ。\r
- */\r
- public BalloonBorder(){\r
- super();\r
- return;\r
- }\r
-\r
- /**\r
* {@inheritDoc}\r
* @param comp {@inheritDoc}\r
* @return {@inheritDoc}\r
/** アクション{@value}。 */\r
public static final String ACTION_SELALL = "ACTION_SELALL";\r
\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * @param name ポップアップメニュー名\r
+ * @param command アクションコマンド名\r
+ */\r
+ protected ClipboardAction(String name, String command){\r
+ super(name);\r
+ setActionCommand(command);\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* 文字列をクリップボードにコピーする。\r
* @param data 文字列\r
}\r
\r
/**\r
- * コンストラクタ。\r
- * @param name ポップアップメニュー名\r
- * @param command アクションコマンド名\r
- */\r
- protected ClipboardAction(String name, String command){\r
- super(name);\r
- setActionCommand(command);\r
- return;\r
- }\r
-\r
- /**\r
* アクションコマンド名を設定する。\r
* @param actionCommand アクションコマンド名\r
*/\r
OPT_NOCONF("noconfdir"),\r
;\r
\r
+\r
+ private final List<String> nameList = new LinkedList<String>();\r
+\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * @param names 頭のハイフンを除いたオプション名の一覧\r
+ */\r
+ private CmdOption(CharSequence ... names){\r
+ if(names == null) throw new NullPointerException();\r
+ if(names.length <= 0) throw new IllegalArgumentException();\r
+\r
+ for(CharSequence name : names){\r
+ if(name == null) throw new NullPointerException();\r
+ this.nameList.add(name.toString().intern());\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* オプション名に合致するEnumを返す。\r
* @param seq ハイフン付きオプション名\r
return helpText;\r
}\r
\r
- private final List<String> nameList = new LinkedList<String>();\r
-\r
- /**\r
- * コンストラクタ。\r
- * @param names 頭のハイフンを除いたオプション名の一覧\r
- */\r
- private CmdOption(CharSequence ... names){\r
- if(names == null) throw new NullPointerException();\r
- if(names.length <= 0) throw new IllegalArgumentException();\r
-\r
- for(CharSequence name : names){\r
- if(name == null) throw new NullPointerException();\r
- this.nameList.add(name.toString().intern());\r
- }\r
-\r
- return;\r
- }\r
-\r
/**\r
* 頭のハイフンを除いたオプション名を返す。\r
* オプション名が複数指定されていた場合は最初のオプション名\r
\r
\r
/**\r
+ * 隠れコンストラクタ。\r
+ */\r
+ private ConfigFile(){\r
+ super();\r
+ return;\r
+ }\r
+\r
+\r
+ /**\r
* 設定格納ディレクトリのセットアップ。\r
* @return 設定格納ディレクトリ\r
*/\r
}\r
\r
/**\r
- * 隠れコンストラクタ。\r
- */\r
- private ConfigFile(){\r
- super();\r
- return;\r
- }\r
-\r
- /**\r
* ロックエラーダイアログの表示。\r
* 呼び出しから戻ってもまだロックオブジェクトが\r
* ロックファイルのオーナーでない場合、\r
private static final JFileChooser chooser = buildChooser();\r
// TODO staticなGUIパーツってどうなんだ…\r
\r
+\r
+ /**\r
+ * 隠しコンストラクタ。\r
+ */\r
+ private CsvExporter(){\r
+ assert false;\r
+ throw new AssertionError();\r
+ }\r
+\r
+\r
/**\r
* Charsetが日本語エンコーダを持っているか確認する。\r
* @param cs Charset\r
}\r
\r
/**\r
- * 隠しコンストラクタ。\r
- */\r
- private CsvExporter(){\r
- assert false;\r
- throw new AssertionError();\r
- }\r
-\r
- /**\r
* CSVファイル表示用フィルタ。\r
* 名前が「*.csv」の通常ファイルとディレクトリのみ表示させる。\r
* ※ 表示の可否を問うものであって、選択の可否を問うものではない。\r
@SuppressWarnings("serial")\r
public class DaySummary extends JDialog\r
implements WindowListener, ActionListener, ItemListener{\r
+\r
private static final String FRAMETITLE =\r
"発言集計 - " + Jindolf.TITLE;\r
private static final NumberFormat AVERAGE_FORM;\r
AVERAGE_FORM.setMinimumFractionDigits(1);\r
}\r
\r
- /**\r
- * 初期のデータモデルを生成する。\r
- * @return データモデル\r
- */\r
- private static DefaultTableModel createInitModel(){\r
- DefaultTableModel result;\r
- result = new DefaultTableModel();\r
-\r
- Object[] rowHeads = {"名前", "発言回数", "平均文字列長", "最終発言"};\r
- result.setColumnCount(rowHeads.length);\r
- result.setColumnIdentifiers(rowHeads);\r
-\r
- return result;\r
- }\r
\r
private final DefaultTableModel tableModel;\r
private final TableColumn avatarColumn;\r
private TalkType talkFilter;\r
private Period period;\r
\r
+\r
/**\r
* コンストラクタ。\r
* 集計結果を表示するモーダルダイアログを生成する。\r
return;\r
}\r
\r
+\r
+ /**\r
+ * 初期のデータモデルを生成する。\r
+ * @return データモデル\r
+ */\r
+ private static DefaultTableModel createInitModel(){\r
+ DefaultTableModel result;\r
+ result = new DefaultTableModel();\r
+\r
+ Object[] rowHeads = {"名前", "発言回数", "平均文字列長", "最終発言"};\r
+ result.setColumnCount(rowHeads.length);\r
+ result.setColumnIdentifiers(rowHeads);\r
+\r
+ return result;\r
+ }\r
+\r
+\r
/**\r
* テーブルをクリアする。\r
*/\r
}\r
}\r
\r
+\r
+ /**\r
+ * 隠れコンストラクタ。\r
+ */\r
+ private EnvInfo(){\r
+ throw new AssertionError();\r
+ }\r
+\r
+\r
/**\r
* 可能ならシステムプロパティを読み込む。\r
* @param key キー\r
return result.toString();\r
}\r
\r
- /**\r
- * 隠れコンストラクタ。\r
- */\r
- private EnvInfo(){\r
- throw new AssertionError();\r
- }\r
-\r
}\r
assert ! ( isMacOSXFs() && isWindowsOSFs() );\r
}\r
\r
+\r
+ /**\r
+ * 隠しコンストラクタ。\r
+ */\r
+ private FileUtils(){\r
+ assert false;\r
+ throw new AssertionError();\r
+ }\r
+\r
+\r
/**\r
* なるべく自分にだけ許可を与え自分以外には許可を与えないように\r
* ファイル属性を操作する。\r
return "<code>" + pathName + "</code>";\r
}\r
\r
- /**\r
- * 隠しコンストラクタ。\r
- */\r
- private FileUtils(){\r
- assert false;\r
- throw new AssertionError();\r
- }\r
-\r
}\r
private static final String HASH_USEAA = "useAntiAlias";\r
private static final String HASH_FRACTIONAL = "useFractional";\r
\r
+\r
+ private Font font;\r
+ private FontRenderContext context;\r
+\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * デフォルトフォントとそれに適した描画属性が指定される。\r
+ */\r
+ public FontInfo(){\r
+ this(FontUtils.createDefaultSpeechFont());\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * 描画設定はフォント属性に応じて自動的に調整される。\r
+ * @param font フォント\r
+ * @throws NullPointerException 引数がnull\r
+ */\r
+ public FontInfo(Font font)\r
+ throws NullPointerException{\r
+ this(font, createBestContext(font));\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * @param font フォント\r
+ * @param context 描画設定\r
+ * @throws NullPointerException 引数がnull\r
+ */\r
+ public FontInfo(Font font, FontRenderContext context)\r
+ throws NullPointerException{\r
+ super();\r
+ if(font == null || context == null) throw new NullPointerException();\r
+ this.font = font;\r
+ this.context = context;\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* フォントに応じた最適な描画設定を生成する。\r
* @param font フォント\r
return result;\r
}\r
\r
- private Font font;\r
- private FontRenderContext context;\r
-\r
- /**\r
- * コンストラクタ。\r
- * デフォルトフォントとそれに適した描画属性が指定される。\r
- */\r
- public FontInfo(){\r
- this(FontUtils.createDefaultSpeechFont());\r
- return;\r
- }\r
-\r
- /**\r
- * コンストラクタ。\r
- * 描画設定はフォント属性に応じて自動的に調整される。\r
- * @param font フォント\r
- * @throws NullPointerException 引数がnull\r
- */\r
- public FontInfo(Font font)\r
- throws NullPointerException{\r
- this(font, createBestContext(font));\r
- return;\r
- }\r
-\r
- /**\r
- * コンストラクタ。\r
- * @param font フォント\r
- * @param context 描画設定\r
- * @throws NullPointerException 引数がnull\r
- */\r
- public FontInfo(Font font, FontRenderContext context)\r
- throws NullPointerException{\r
- super();\r
- if(font == null || context == null) throw new NullPointerException();\r
- this.font = font;\r
- this.context = context;\r
- return;\r
- }\r
-\r
/**\r
* フォントを返す。\r
* @return フォント\r
/** JIS0208:1990 チェック用。 */\r
private static final String JPCHECK_CODE = "9Aあゑアアヴヰ┼ЖΩ峠凜熙";\r
\r
+\r
+ /**\r
+ * 隠れコンストラクタ。\r
+ */\r
+ private FontUtils(){\r
+ assert false;\r
+ }\r
+\r
+\r
/**\r
* システムに存在する有効なファミリ名か判定する。\r
* @param family フォントファミリ名。\r
return font.getFamily(ROOT);\r
}\r
\r
- /**\r
- * 隠れコンストラクタ。\r
- */\r
- private FontUtils(){\r
- assert false;\r
- }\r
-\r
}\r
OP_MONOIMG = new ColorConvertOp(mono, null);\r
}\r
\r
+\r
+ /**\r
+ * 隠れコンストラクタ。\r
+ */\r
+ private GUIUtils(){\r
+ assert false;\r
+ throw new AssertionError();\r
+ }\r
+\r
+\r
/**\r
* 描画品質優先の描画ヒントを返す。\r
* @return 描画ヒント\r
return result;\r
}\r
\r
- /**\r
- * 隠れコンストラクタ。\r
- */\r
- private GUIUtils(){\r
- assert false;\r
- throw new AssertionError();\r
- }\r
-\r
}\r
public static final Comparator<Player> COMPARATOR_CASTING =\r
new CastingComparator();\r
\r
- /**\r
- * プレイヤーのリストから役職バランス文字列を得る。\r
- * ex) "村村占霊狂狼"\r
- * @param players プレイヤーのリスト\r
- * @return 役職バランス文字列\r
- */\r
- public static String getRoleBalanceSequence(List<Player> players){\r
- List<GameRole> roleList = new LinkedList<GameRole>();\r
- for(Player player : players){\r
- GameRole role = player.getRole();\r
- roleList.add(role);\r
- }\r
- Collections.sort(roleList, GameRole.getPowerBalanceComparator());\r
-\r
- StringBuilder result = new StringBuilder();\r
- for(GameRole role : roleList){\r
- char ch = role.getShortName();\r
- result.append(ch);\r
- }\r
-\r
- return result.toString();\r
- }\r
\r
private final Map<Avatar, Player> playerMap =\r
new HashMap<Avatar, Player>();\r
private long talk1stTimeMs = -1;\r
private long talkLastTimeMs = -1;\r
\r
+\r
/**\r
* コンストラクタ。\r
* @param village 村\r
return;\r
}\r
\r
+\r
+ /**\r
+ * プレイヤーのリストから役職バランス文字列を得る。\r
+ * ex) "村村占霊狂狼"\r
+ * @param players プレイヤーのリスト\r
+ * @return 役職バランス文字列\r
+ */\r
+ public static String getRoleBalanceSequence(List<Player> players){\r
+ List<GameRole> roleList = new LinkedList<GameRole>();\r
+ for(Player player : players){\r
+ GameRole role = player.getRole();\r
+ roleList.add(role);\r
+ }\r
+ Collections.sort(roleList, GameRole.getPowerBalanceComparator());\r
+\r
+ StringBuilder result = new StringBuilder();\r
+ for(GameRole role : roleList){\r
+ char ch = role.getShortName();\r
+ result.append(ch);\r
+ }\r
+\r
+ return result.toString();\r
+ }\r
+\r
/**\r
* サマライズ処理。\r
*/\r
SIZE_FORMAT.setGroupingUsed(true);\r
}\r
\r
+\r
+ /**\r
+ * 隠れコンストラクタ。\r
+ */\r
+ private HttpUtils(){\r
+ super();\r
+ assert false;\r
+ throw new AssertionError();\r
+ }\r
+\r
+\r
/**\r
* ネットワークのスループット報告用文字列を生成する。\r
* @param size 転送サイズ(バイト数)\r
return charset;\r
}\r
\r
- /**\r
- * 隠れコンストラクタ。\r
- */\r
- private HttpUtils(){\r
- super();\r
- assert false;\r
- throw new AssertionError();\r
- }\r
-\r
}\r
});\r
}\r
\r
+\r
+ private final File lockFile;\r
+ private boolean isFileOwner = false;\r
+ private FileOutputStream stream = null;\r
+\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * この時点ではまだロックファイルの存在は確認されない。\r
+ * @param lockFile ロックファイル\r
+ * @throws NullPointerException 引数がnull\r
+ */\r
+ public InterVMLock(File lockFile) throws NullPointerException{\r
+ if(lockFile == null) throw new NullPointerException();\r
+ this.lockFile = lockFile;\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* 所持するロックオブジェクト一覧への登録。\r
* @param lock 登録するロックオブジェクト\r
return;\r
}\r
\r
-\r
- private final File lockFile;\r
- private boolean isFileOwner = false;\r
- private FileOutputStream stream = null;\r
-\r
- /**\r
- * コンストラクタ。\r
- * この時点ではまだロックファイルの存在は確認されない。\r
- * @param lockFile ロックファイル\r
- * @throws NullPointerException 引数がnull\r
- */\r
- public InterVMLock(File lockFile) throws NullPointerException{\r
- if(lockFile == null) throw new NullPointerException();\r
- this.lockFile = lockFile;\r
- return;\r
- }\r
-\r
/**\r
* ロック対象のファイルを返す。\r
* @return ロック対象ファイル\r
public static final long EPOCHMS_LOADED;\r
\r
\r
- /** バージョン定義リソース。 */\r
- private static final String RES_VERDEF = "resources/version.properties";\r
-\r
/** タイトル。 */\r
public static final String TITLE;\r
/** バージョン。 */\r
private static OptionInfo option;\r
private static AppSetting setting;\r
\r
+ /** バージョン定義リソース。 */\r
+ private static final String RES_VERDEF = "resources/version.properties";\r
+\r
static{\r
SELF_KLASS = Jindolf.class;\r
SELF_PACKAGE = SELF_KLASS.getPackage();\r
new Jindolf();\r
}\r
\r
+\r
+ /**\r
+ * 隠れコンストラクタ。\r
+ */\r
+ private Jindolf(){\r
+ super();\r
+ assert this.getClass() == SELF_KLASS;\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* 起動オプション情報を返す。\r
* @return 起動オプション情報\r
return;\r
}\r
\r
- /**\r
- * 隠れコンストラクタ。\r
- */\r
- private Jindolf(){\r
- super();\r
- assert this.getClass() == SELF_KLASS;\r
- return;\r
- }\r
-\r
}\r
// 古国ID\r
private static final String ID_VANILLAWOLF = "wolf";\r
\r
+\r
+ private final LandDef landDef;\r
+ private final ServerAccess serverAccess;\r
+ private final HtmlParser parser = new HtmlParser();\r
+ private final VillageListHandler handler = new VillageListHandler();\r
+\r
+ private final List<Village> villageList = new LinkedList<Village>();\r
+\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * @param landDef 国定義\r
+ * @throws java.lang.IllegalArgumentException 不正な国定義\r
+ */\r
+ public Land(LandDef landDef) throws IllegalArgumentException{\r
+ super();\r
+\r
+ this.landDef = landDef;\r
+\r
+ URL url;\r
+ try{\r
+ url = this.landDef.getCgiURI().toURL();\r
+ }catch(MalformedURLException e){\r
+ throw new IllegalArgumentException(e);\r
+ }\r
+ this.serverAccess = new ServerAccess(url, this.landDef.getEncoding());\r
+\r
+ this.parser.setBasicHandler(this.handler);\r
+\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* クエリー文字列から特定キーの値を得る。\r
* クエリーの書式例:「a=b&c=d&e=f」この場合キーcの値はd\r
return villageID;\r
}\r
\r
- private final LandDef landDef;\r
- private final ServerAccess serverAccess;\r
- private final HtmlParser parser = new HtmlParser();\r
- private final VillageListHandler handler = new VillageListHandler();\r
-\r
- private final List<Village> villageList = new LinkedList<Village>();\r
-\r
- /**\r
- * コンストラクタ。\r
- * @param landDef 国定義\r
- * @throws java.lang.IllegalArgumentException 不正な国定義\r
- */\r
- public Land(LandDef landDef) throws IllegalArgumentException{\r
- super();\r
-\r
- this.landDef = landDef;\r
-\r
- URL url;\r
- try{\r
- url = this.landDef.getCgiURI().toURL();\r
- }catch(MalformedURLException e){\r
- throw new IllegalArgumentException(e);\r
- }\r
- this.serverAccess = new ServerAccess(url, this.landDef.getEncoding());\r
-\r
- this.parser.setBasicHandler(this.handler);\r
-\r
- return;\r
- }\r
-\r
/**\r
* 国定義を得る。\r
* @return 国定義\r
@SuppressWarnings("serial")\r
public class LandInfoPanel extends JPanel{\r
\r
- /**\r
- * 国の状態を文字列化する。\r
- * @param state 国状態\r
- * @return 文字列化された国状態\r
- */\r
- private static String getStatusMark(LandState state){\r
- String result;\r
-\r
- switch(state){\r
- case CLOSED: result = "サービス終了"; break;\r
- case HISTORICAL: result = "過去ログ提供のみ"; break;\r
- case ACTIVE: result = "稼動中"; break;\r
- default:\r
- assert false;\r
- result = "";\r
- break;\r
- }\r
-\r
- return result;\r
- }\r
-\r
private final JLabel landName = new JLabel();\r
private final JLabel landIdentifier = new JLabel();\r
private final WebButton webURL = new WebButton();\r
return;\r
}\r
\r
+\r
+ /**\r
+ * 国の状態を文字列化する。\r
+ * @param state 国状態\r
+ * @return 文字列化された国状態\r
+ */\r
+ private static String getStatusMark(LandState state){\r
+ String result;\r
+\r
+ switch(state){\r
+ case CLOSED: result = "サービス終了"; break;\r
+ case HISTORICAL: result = "過去ログ提供のみ"; break;\r
+ case ACTIVE: result = "稼動中"; break;\r
+ default:\r
+ assert false;\r
+ result = "";\r
+ break;\r
+ }\r
+\r
+ return result;\r
+ }\r
+\r
/**\r
* 一行分レイアウトする。\r
* @param item 項目名\r
*/\r
public class LandsModel implements TreeModel{ // ComboBoxModelも付けるか?\r
\r
- /**\r
- * 村IDで範囲指定した、村のセクション集合。国-村間の中間ツリー。\r
- * @see javax.swing.tree.TreeModel\r
- */\r
- private static final class VillageSection{\r
-\r
- /**\r
- * 与えられた国の全ての村を、指定されたinterval間隔でセクション化する。\r
- * @param land 国\r
- * @param interval セクションの間隔\r
- * @return セクションのリスト\r
- * @throws java.lang.IllegalArgumentException intervalが正でない\r
- */\r
- private static List<VillageSection> getSectionList(Land land,\r
- int interval )\r
- throws IllegalArgumentException{\r
- if(interval <= 0){\r
- throw new IllegalArgumentException();\r
- }\r
-\r
- List<Village> villageList = land.getVillageList();\r
- Village village1st = villageList.get(0);\r
- Village villageLast = villageList.get(villageList.size() - 1);\r
-\r
- int startID = village1st.getVillageIDNum();\r
- int endID = villageLast.getVillageIDNum();\r
-\r
- List<VillageSection> result = new LinkedList<VillageSection>();\r
-\r
- int fixedStart = startID / interval * interval;\r
- for(int ct = fixedStart; ct <= endID; ct += interval){\r
- VillageSection section =\r
- new VillageSection(land, ct, ct + interval - 1);\r
- result.add(section);\r
- }\r
-\r
- return Collections.unmodifiableList(result);\r
- }\r
-\r
- private final int startID;\r
- private final int endID;\r
- private final String prefix;\r
-\r
- private final List<Village> villageList = new LinkedList<Village>();\r
-\r
- /**\r
- * セクション集合を生成する。\r
- * @param land 国\r
- * @param startID 開始村ID\r
- * @param endID 終了村ID\r
- * @throws java.lang.IndexOutOfBoundsException IDの範囲指定が変\r
- */\r
- private VillageSection(Land land, int startID, int endID)\r
- throws IndexOutOfBoundsException{\r
- super();\r
-\r
- if(startID < 0 || startID > endID){\r
- throw new IndexOutOfBoundsException();\r
- }\r
-\r
- this.startID = startID;\r
- this.endID = endID;\r
- this.prefix = land.getLandDef().getLandPrefix();\r
-\r
- for(Village village : land.getVillageList()){\r
- int id = village.getVillageIDNum();\r
- if(startID <= id && id <= endID){\r
- this.villageList.add(village);\r
- }\r
- }\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * セクションに含まれる村の総数を返す。\r
- * @return 村の総数\r
- */\r
- private int getVillageCount(){\r
- return this.villageList.size();\r
- }\r
-\r
- /**\r
- * セクションに含まれるindex番目の村を返す。\r
- * @param index インデックス\r
- * @return index番目の村\r
- */\r
- private Village getVillage(int index){\r
- return this.villageList.get(index);\r
- }\r
-\r
- /**\r
- * セクションにおける、指定された子(村)のインデックス位置を返す。\r
- * @param child 子\r
- * @return インデックス位置\r
- */\r
- private int getIndexOfVillage(Object child){\r
- return this.villageList.indexOf(child);\r
- }\r
-\r
- /**\r
- * セクションの文字列表記。\r
- * JTree描画に反映される。\r
- * @return 文字列表記\r
- */\r
- @Override\r
- public String toString(){\r
- StringBuilder result = new StringBuilder();\r
- result.append(this.prefix).append(this.startID);\r
- result.append(" ~ ");\r
- result.append(this.prefix).append(this.endID);\r
- return result.toString();\r
- }\r
- }\r
-\r
private static final String ROOT = "ROOT";\r
private static final int SECTION_INTERVAL = 100;\r
\r
+\r
private final List<Land> landList = new LinkedList<Land>();\r
private final List<Land> unmodList =\r
Collections.unmodifiableList(this.landList);\r
throw new UnsupportedOperationException("Not supported yet.");\r
}\r
\r
+ /**\r
+ * 村IDで範囲指定した、村のセクション集合。国-村間の中間ツリー。\r
+ * @see javax.swing.tree.TreeModel\r
+ */\r
+ private static final class VillageSection{\r
+\r
+ private final int startID;\r
+ private final int endID;\r
+ private final String prefix;\r
+\r
+ private final List<Village> villageList = new LinkedList<Village>();\r
+\r
+\r
+ /**\r
+ * セクション集合を生成する。\r
+ * @param land 国\r
+ * @param startID 開始村ID\r
+ * @param endID 終了村ID\r
+ * @throws java.lang.IndexOutOfBoundsException IDの範囲指定が変\r
+ */\r
+ private VillageSection(Land land, int startID, int endID)\r
+ throws IndexOutOfBoundsException{\r
+ super();\r
+\r
+ if(startID < 0 || startID > endID){\r
+ throw new IndexOutOfBoundsException();\r
+ }\r
+\r
+ this.startID = startID;\r
+ this.endID = endID;\r
+ this.prefix = land.getLandDef().getLandPrefix();\r
+\r
+ for(Village village : land.getVillageList()){\r
+ int id = village.getVillageIDNum();\r
+ if(startID <= id && id <= endID){\r
+ this.villageList.add(village);\r
+ }\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+\r
+ /**\r
+ * 与えられた国の全ての村を、指定されたinterval間隔でセクション化する。\r
+ * @param land 国\r
+ * @param interval セクションの間隔\r
+ * @return セクションのリスト\r
+ * @throws java.lang.IllegalArgumentException intervalが正でない\r
+ */\r
+ private static List<VillageSection> getSectionList(Land land,\r
+ int interval )\r
+ throws IllegalArgumentException{\r
+ if(interval <= 0){\r
+ throw new IllegalArgumentException();\r
+ }\r
+\r
+ List<Village> villageList = land.getVillageList();\r
+ Village village1st = villageList.get(0);\r
+ Village villageLast = villageList.get(villageList.size() - 1);\r
+\r
+ int startID = village1st.getVillageIDNum();\r
+ int endID = villageLast.getVillageIDNum();\r
+\r
+ List<VillageSection> result = new LinkedList<VillageSection>();\r
+\r
+ int fixedStart = startID / interval * interval;\r
+ for(int ct = fixedStart; ct <= endID; ct += interval){\r
+ VillageSection section =\r
+ new VillageSection(land, ct, ct + interval - 1);\r
+ result.add(section);\r
+ }\r
+\r
+ return Collections.unmodifiableList(result);\r
+ }\r
+\r
+ /**\r
+ * セクションに含まれる村の総数を返す。\r
+ * @return 村の総数\r
+ */\r
+ private int getVillageCount(){\r
+ return this.villageList.size();\r
+ }\r
+\r
+ /**\r
+ * セクションに含まれるindex番目の村を返す。\r
+ * @param index インデックス\r
+ * @return index番目の村\r
+ */\r
+ private Village getVillage(int index){\r
+ return this.villageList.get(index);\r
+ }\r
+\r
+ /**\r
+ * セクションにおける、指定された子(村)のインデックス位置を返す。\r
+ * @param child 子\r
+ * @return インデックス位置\r
+ */\r
+ private int getIndexOfVillage(Object child){\r
+ return this.villageList.indexOf(child);\r
+ }\r
+\r
+ /**\r
+ * セクションの文字列表記。\r
+ * JTree描画に反映される。\r
+ * @return 文字列表記\r
+ */\r
+ @Override\r
+ public String toString(){\r
+ StringBuilder result = new StringBuilder();\r
+ result.append(this.prefix).append(this.startID);\r
+ result.append(" ~ ");\r
+ result.append(this.prefix).append(this.endID);\r
+ return result.toString();\r
+ }\r
+ }\r
+\r
}\r
\r
\r
/**\r
+ * 隠しコンストラクタ。\r
+ */\r
+ private Monodizer(){\r
+ super();\r
+ return;\r
+ }\r
+\r
+\r
+ /**\r
* 等幅フォントか否か判定する。\r
* @param font フォント\r
* @return 等幅フォントならtrue\r
return;\r
}\r
\r
- /**\r
- * 隠しコンストラクタ。\r
- */\r
- private Monodizer(){\r
- super();\r
- return;\r
- }\r
-\r
}\r
+"(?:(\\+|\\-)([1-9][0-9]*)(\\+|\\-)([1-9][0-9]*))?"\r
);\r
\r
+\r
+ private Integer frameWidth = null;\r
+ private Integer frameHeight = null;\r
+ private Integer frameXpos = null;\r
+ private Integer frameYpos = null;\r
+\r
+ private final List<String> invokeArgs = new LinkedList<String>();\r
+ private final List<CmdOption> optionList = new LinkedList<CmdOption>();\r
+ private final Map<CmdOption, Boolean> boolOptionMap =\r
+ new EnumMap<CmdOption, Boolean>(CmdOption.class);\r
+ private final Map<CmdOption, String> stringOptionMap =\r
+ new EnumMap<CmdOption, String>(CmdOption.class);\r
+\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ */\r
+ protected OptionInfo(){\r
+ super();\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* オプション文字列を解析する。\r
* @param args main()に渡されるオプション文字列\r
}\r
\r
\r
- private Integer frameWidth = null;\r
- private Integer frameHeight = null;\r
- private Integer frameXpos = null;\r
- private Integer frameYpos = null;\r
-\r
- private final List<String> invokeArgs = new LinkedList<String>();\r
- private final List<CmdOption> optionList = new LinkedList<CmdOption>();\r
- private final Map<CmdOption, Boolean> boolOptionMap =\r
- new EnumMap<CmdOption, Boolean>(CmdOption.class);\r
- private final Map<CmdOption, String> stringOptionMap =\r
- new EnumMap<CmdOption, String>(CmdOption.class);\r
-\r
- /**\r
- * コンストラクタ。\r
- */\r
- protected OptionInfo(){\r
- super();\r
- return;\r
- }\r
-\r
/**\r
* 全引数のリストを返す。\r
* @return 全引数のリスト\r
PARSER.setTalkHandler (HANDLER);\r
}\r
\r
- /**\r
- * Periodを更新する。Topicのリストが更新される。\r
- * @param period 日\r
- * @param force trueなら強制再読み込み。\r
- * falseならまだ読み込んで無い時のみ読み込み。\r
- * @throws IOException ネットワーク入力エラー\r
- */\r
- public static void parsePeriod(Period period, boolean force)\r
- throws IOException{\r
- if( ! force && period.hasLoaded() ) return;\r
-\r
- Village village = period.getVillage();\r
- Land land = village.getParentLand();\r
- ServerAccess server = land.getServerAccess();\r
-\r
- if(village.getState() != VillageState.PROGRESS){\r
- period.isFullOpen = true;\r
- }else if(period.getType() != PeriodType.PROGRESS){\r
- period.isFullOpen = true;\r
- }else{\r
- period.isFullOpen = false;\r
- }\r
-\r
- HtmlSequence html = server.getHTMLPeriod(period);\r
-\r
- period.topicList.clear();\r
-\r
- boolean wasHot = period.isHot();\r
-\r
- HANDLER.setPeriod(period);\r
- DecodedContent content = html.getContent();\r
- try{\r
- PARSER.parseAutomatic(content);\r
- }catch(HtmlParseException e){\r
- Jindolf.logger().warn("発言抽出に失敗", e);\r
- }\r
-\r
- if(wasHot && ! period.isHot() ){\r
- parsePeriod(period, true);\r
- return;\r
- }\r
-\r
- return;\r
- }\r
-\r
private final Village homeVillage;\r
private final PeriodType periodType;\r
private final int day;\r
private final List<Topic> unmodList =\r
Collections.unmodifiableList(this.topicList);\r
\r
+\r
/**\r
* この Period が進行中の村の最新日で、\r
* 今まさに次々と発言が蓄積されているときは\r
*/\r
private boolean isHot;\r
\r
+\r
/**\r
* Periodを生成する。\r
* この段階では発言データのロードは行われない。\r
return;\r
}\r
\r
+\r
+ /**\r
+ * Periodを更新する。Topicのリストが更新される。\r
+ * @param period 日\r
+ * @param force trueなら強制再読み込み。\r
+ * falseならまだ読み込んで無い時のみ読み込み。\r
+ * @throws IOException ネットワーク入力エラー\r
+ */\r
+ public static void parsePeriod(Period period, boolean force)\r
+ throws IOException{\r
+ if( ! force && period.hasLoaded() ) return;\r
+\r
+ Village village = period.getVillage();\r
+ Land land = village.getParentLand();\r
+ ServerAccess server = land.getServerAccess();\r
+\r
+ if(village.getState() != VillageState.PROGRESS){\r
+ period.isFullOpen = true;\r
+ }else if(period.getType() != PeriodType.PROGRESS){\r
+ period.isFullOpen = true;\r
+ }else{\r
+ period.isFullOpen = false;\r
+ }\r
+\r
+ HtmlSequence html = server.getHTMLPeriod(period);\r
+\r
+ period.topicList.clear();\r
+\r
+ boolean wasHot = period.isHot();\r
+\r
+ HANDLER.setPeriod(period);\r
+ DecodedContent content = html.getContent();\r
+ try{\r
+ PARSER.parseAutomatic(content);\r
+ }catch(HtmlParseException e){\r
+ Jindolf.logger().warn("発言抽出に失敗", e);\r
+ }\r
+\r
+ if(wasHot && ! period.isHot() ){\r
+ parsePeriod(period, true);\r
+ return;\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
/**\r
* 所属する村を返す。\r
* @return 村\r
@SuppressWarnings("serial")\r
public class ProxyChooser extends JPanel implements ItemListener{\r
\r
- /**\r
- * ポート番号選択肢を生成する。\r
- * @return ポート番号選択肢\r
- */\r
- private static ComboBoxModel buildPortRecommender(){\r
- DefaultComboBoxModel model = new DefaultComboBoxModel();\r
- model.addElement("80");\r
- model.addElement("1080");\r
- model.addElement("3128");\r
- model.addElement("8000");\r
- model.addElement("8080");\r
- model.addElement("10080");\r
- return model;\r
- }\r
-\r
private final JRadioButton isDirect =\r
new JRadioButton("直接接続");\r
private final JRadioButton isHttp =\r
return;\r
}\r
\r
+\r
+ /**\r
+ * ポート番号選択肢を生成する。\r
+ * @return ポート番号選択肢\r
+ */\r
+ private static ComboBoxModel buildPortRecommender(){\r
+ DefaultComboBoxModel model = new DefaultComboBoxModel();\r
+ model.addElement("80");\r
+ model.addElement("1080");\r
+ model.addElement("3128");\r
+ model.addElement("8000");\r
+ model.addElement("8080");\r
+ model.addElement("10080");\r
+ return model;\r
+ }\r
+\r
/**\r
* レイアウトを行う。\r
* @param content コンテナ\r
private static final String HASH_HOST = "host";\r
private static final String HASH_PORT = "port";\r
\r
- /**\r
- * プロクシ設定をJSON形式にエンコードする。\r
- * @param proxyInfo プロクシ設定\r
- * @return JSON object\r
- */\r
- public static JsObject buildJson(ProxyInfo proxyInfo){\r
- JsPair type = new JsPair(HASH_TYPE, proxyInfo.getType().name());\r
- JsPair host = new JsPair(HASH_HOST, proxyInfo.getHostName());\r
- JsPair port = new JsPair(HASH_PORT, proxyInfo.getPort());\r
-\r
- JsObject result = new JsObject();\r
- result.putPair(type);\r
- result.putPair(host);\r
- result.putPair(port);\r
-\r
- return result;\r
- }\r
-\r
- /**\r
- * JSONからのプロクシ設定復元。\r
- * @param obj JSON object\r
- * @return 復元されたプロクシ設定。\r
- */\r
- public static ProxyInfo decodeJson(JsObject obj){\r
- JsValue value;\r
-\r
- Proxy.Type type = Proxy.Type.DIRECT;\r
- value = obj.getValue(HASH_TYPE);\r
- if(value instanceof JsString){\r
- JsString string = (JsString) value;\r
- try{\r
- type = Enum.valueOf(Proxy.Type.class, string.toRawString());\r
- }catch(IllegalArgumentException e){\r
- // NOTHING\r
- }\r
- }\r
-\r
- String host = "0.0.0.0";\r
- value = obj.getValue(HASH_HOST);\r
- if(value instanceof JsString){\r
- JsString string = (JsString) value;\r
- host = string.toRawString();\r
- }\r
-\r
- int port = 0;\r
- value = obj.getValue(HASH_PORT);\r
- if(value instanceof JsNumber){\r
- JsNumber number = (JsNumber) value;\r
- port = number.intValue();\r
- }\r
-\r
- return new ProxyInfo(type, host, port);\r
- }\r
\r
private final Proxy proxy;\r
private final InetSocketAddress inetAddr;\r
\r
+\r
/**\r
* コンストラクタ。\r
* 直接接続プロクシが暗黙に指定される。\r
return;\r
}\r
\r
+\r
+ /**\r
+ * プロクシ設定をJSON形式にエンコードする。\r
+ * @param proxyInfo プロクシ設定\r
+ * @return JSON object\r
+ */\r
+ public static JsObject buildJson(ProxyInfo proxyInfo){\r
+ JsPair type = new JsPair(HASH_TYPE, proxyInfo.getType().name());\r
+ JsPair host = new JsPair(HASH_HOST, proxyInfo.getHostName());\r
+ JsPair port = new JsPair(HASH_PORT, proxyInfo.getPort());\r
+\r
+ JsObject result = new JsObject();\r
+ result.putPair(type);\r
+ result.putPair(host);\r
+ result.putPair(port);\r
+\r
+ return result;\r
+ }\r
+\r
+ /**\r
+ * JSONからのプロクシ設定復元。\r
+ * @param obj JSON object\r
+ * @return 復元されたプロクシ設定。\r
+ */\r
+ public static ProxyInfo decodeJson(JsObject obj){\r
+ JsValue value;\r
+\r
+ Proxy.Type type = Proxy.Type.DIRECT;\r
+ value = obj.getValue(HASH_TYPE);\r
+ if(value instanceof JsString){\r
+ JsString string = (JsString) value;\r
+ try{\r
+ type = Enum.valueOf(Proxy.Type.class, string.toRawString());\r
+ }catch(IllegalArgumentException e){\r
+ // NOTHING\r
+ }\r
+ }\r
+\r
+ String host = "0.0.0.0";\r
+ value = obj.getValue(HASH_HOST);\r
+ if(value instanceof JsString){\r
+ JsString string = (JsString) value;\r
+ host = string.toRawString();\r
+ }\r
+\r
+ int port = 0;\r
+ value = obj.getValue(HASH_PORT);\r
+ if(value instanceof JsNumber){\r
+ JsNumber number = (JsNumber) value;\r
+ port = number.intValue();\r
+ }\r
+\r
+ return new ProxyInfo(type, host, port);\r
+ }\r
+\r
/**\r
* {@inheritDoc}\r
* @param obj {@inheritDoc}\r
private static final String REGEX_CHAR = ".?+*\\$(|)[]{}^-&";\r
\r
\r
+ private final String editSource;\r
+ private final boolean isRegex;\r
+ private final Pattern pattern;\r
+ private final String comment;\r
+\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ *\r
+ * @param editSource リテラル文字列または正規表現\r
+ * @param isRegex 指定文字列が正規表現ならtrue。リテラルならfalse\r
+ * @param flag 正規表現フラグ\r
+ * @param comment コメント\r
+ * @throws java.util.regex.PatternSyntaxException 正規表現がおかしい\r
+ */\r
+ public RegexPattern(String editSource,\r
+ boolean isRegex,\r
+ int flag,\r
+ String comment)\r
+ throws PatternSyntaxException{\r
+ super();\r
+ if(editSource == null) throw new NullPointerException();\r
+\r
+ this.isRegex = isRegex;\r
+ if(comment != null) this.comment = comment;\r
+ else this.comment = "";\r
+\r
+ String regexExpr;\r
+ if(this.isRegex){\r
+ this.editSource = editSource;\r
+ regexExpr = this.editSource;\r
+ }else{\r
+ String newSource = "";\r
+ regexExpr = "";\r
+\r
+ String[] tokens = editSource.split(REGEX_DELIM);\r
+ for(String token : tokens){\r
+ if(token == null || token.length() <= 0) continue;\r
+\r
+ if(newSource.length() <= 0) newSource = token;\r
+ else newSource += " " + token;\r
+\r
+ String quoted = "(?:" + quote(token) + ")";\r
+ if(regexExpr.length() <= 0) regexExpr = quoted;\r
+ else regexExpr += "|" + quoted;\r
+ }\r
+\r
+ this.editSource = newSource;\r
+ }\r
+\r
+ this.pattern = Pattern.compile(regexExpr, flag);\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ *\r
+ * @param editSource リテラル文字列または正規表現\r
+ * @param isRegex 指定文字列が正規表現ならtrue。リテラルならfalse\r
+ * @param flag 正規表現フラグ\r
+ * @throws java.util.regex.PatternSyntaxException 正規表現がおかしい\r
+ */\r
+ public RegexPattern(String editSource,\r
+ boolean isRegex,\r
+ int flag )\r
+ throws PatternSyntaxException{\r
+ this(editSource, isRegex, flag, " ");\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* 正規表現とまぎらわしい字を含むか判定する。\r
* @param seq 文字列\r
}\r
\r
\r
- private final String editSource;\r
- private final boolean isRegex;\r
- private final Pattern pattern;\r
- private final String comment;\r
-\r
- /**\r
- * コンストラクタ。\r
- *\r
- * @param editSource リテラル文字列または正規表現\r
- * @param isRegex 指定文字列が正規表現ならtrue。リテラルならfalse\r
- * @param flag 正規表現フラグ\r
- * @param comment コメント\r
- * @throws java.util.regex.PatternSyntaxException 正規表現がおかしい\r
- */\r
- public RegexPattern(String editSource,\r
- boolean isRegex,\r
- int flag,\r
- String comment)\r
- throws PatternSyntaxException{\r
- super();\r
- if(editSource == null) throw new NullPointerException();\r
-\r
- this.isRegex = isRegex;\r
- if(comment != null) this.comment = comment;\r
- else this.comment = "";\r
-\r
- String regexExpr;\r
- if(this.isRegex){\r
- this.editSource = editSource;\r
- regexExpr = this.editSource;\r
- }else{\r
- String newSource = "";\r
- regexExpr = "";\r
-\r
- String[] tokens = editSource.split(REGEX_DELIM);\r
- for(String token : tokens){\r
- if(token == null || token.length() <= 0) continue;\r
-\r
- if(newSource.length() <= 0) newSource = token;\r
- else newSource += " " + token;\r
-\r
- String quoted = "(?:" + quote(token) + ")";\r
- if(regexExpr.length() <= 0) regexExpr = quoted;\r
- else regexExpr += "|" + quoted;\r
- }\r
-\r
- this.editSource = newSource;\r
- }\r
-\r
- this.pattern = Pattern.compile(regexExpr, flag);\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * コンストラクタ。\r
- *\r
- * @param editSource リテラル文字列または正規表現\r
- * @param isRegex 指定文字列が正規表現ならtrue。リテラルならfalse\r
- * @param flag 正規表現フラグ\r
- * @throws java.util.regex.PatternSyntaxException 正規表現がおかしい\r
- */\r
- public RegexPattern(String editSource,\r
- boolean isRegex,\r
- int flag )\r
- throws PatternSyntaxException{\r
- this(editSource, isRegex, flag, " ");\r
- return;\r
- }\r
-\r
/**\r
* 元の入力文字列を返す。\r
* @return 入力文字列\r
IMAGE_CACHE = Collections.synchronizedMap(cache);\r
}\r
\r
+\r
+ private final URL baseURL;\r
+ private final Charset charset;\r
+ private Proxy proxy = Proxy.NO_PROXY;\r
+ private long lastServerMs;\r
+ private long lastLocalMs;\r
+ private long lastSystemMs;\r
+ private AccountCookie cookieAuth = null;\r
+ private String encodedUserID = null;\r
+\r
+\r
+ /**\r
+ * 人狼BBSサーバとの接続管理を生成する。\r
+ * この時点ではまだ通信は行われない。\r
+ * @param baseURL 国別のベースURL\r
+ * @param charset 国のCharset\r
+ */\r
+ public ServerAccess(URL baseURL, Charset charset){\r
+ this.baseURL = baseURL;\r
+ this.charset = charset;\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* 画像キャッシュを検索する。\r
* @param key キー\r
return formEncode(new String(formData));\r
}\r
\r
- private final URL baseURL;\r
- private final Charset charset;\r
- private Proxy proxy = Proxy.NO_PROXY;\r
- private long lastServerMs;\r
- private long lastLocalMs;\r
- private long lastSystemMs;\r
- private AccountCookie cookieAuth = null;\r
- private String encodedUserID = null;\r
-\r
- /**\r
- * 人狼BBSサーバとの接続管理を生成する。\r
- * この時点ではまだ通信は行われない。\r
- * @param baseURL 国別のベースURL\r
- * @param charset 国のCharset\r
- */\r
- public ServerAccess(URL baseURL, Charset charset){\r
- this.baseURL = baseURL;\r
- this.charset = charset;\r
- return;\r
- }\r
-\r
/**\r
* HTTP-Proxyを返す。\r
* @return HTTP-Proxy\r
\r
private static final int SUPLEN = 5;\r
\r
+\r
+ /**\r
+ * ダミーコンストラクタ。\r
+ */\r
+ private StringUtils(){\r
+ super();\r
+ assert false;\r
+ throw new AssertionError();\r
+ }\r
+\r
+\r
/**\r
* 正規表現にマッチした領域を数値化する。\r
* @param seq 文字列\r
return result;\r
}\r
\r
- /**\r
- * ダミーコンストラクタ。\r
- */\r
- private StringUtils(){\r
- super();\r
- assert false;\r
- throw new AssertionError();\r
- }\r
-\r
// TODO 文字エンコーダ・デコーダ処理の一本化。\r
// TODO 文字エンコーダ・デコーダのカスタム化。「~」対策など。\r
}\r
*/\r
public class Talk implements Topic{\r
\r
- /**\r
- * 会話種別から色名への変換を行う。\r
- * @param type 会話種別\r
- * @return 色名\r
- */\r
- public static String encodeColorName(TalkType type){\r
- String result;\r
-\r
- switch(type){\r
- case PUBLIC: result = "白"; break;\r
- case PRIVATE: result = "灰"; break;\r
- case WOLFONLY: result = "赤"; break;\r
- case GRAVE: result = "青"; break;\r
- default: assert false; return null;\r
- }\r
-\r
- return result;\r
- }\r
-\r
private final Period homePeriod;\r
private final TalkType talkType;\r
private final Avatar avatar;\r
private final int charNum;\r
private int count = -1;\r
\r
+\r
/**\r
* Talkの生成。\r
* @param homePeriod 発言元Period\r
return;\r
}\r
\r
+\r
+ /**\r
+ * 会話種別から色名への変換を行う。\r
+ * @param type 会話種別\r
+ * @return 色名\r
+ */\r
+ public static String encodeColorName(TalkType type){\r
+ String result;\r
+\r
+ switch(type){\r
+ case PUBLIC: result = "白"; break;\r
+ case PRIVATE: result = "灰"; break;\r
+ case WOLFONLY: result = "赤"; break;\r
+ case GRAVE: result = "青"; break;\r
+ default: assert false; return null;\r
+ }\r
+\r
+ return result;\r
+ }\r
+\r
/**\r
* 発言が交わされたPeriodを返す。\r
* @return Period\r
SQUARE_PRIVATE = createSquareImage(COLOR_PRIVATE);\r
}\r
\r
+\r
+ private final Talk talk;\r
+ private Anchor showingAnchor;\r
+\r
+ private final GlyphDraw caption;\r
+ private BufferedImage faceImage;\r
+ private final GlyphDraw dialog;\r
+ private final List<AnchorDraw> anchorTalks = new LinkedList<AnchorDraw>();\r
+ private Point imageOrigin;\r
+ private Point dialogOrigin;\r
+ private Point tipOrigin;\r
+ private int baloonWidth;\r
+ private int baloonHeight;\r
+\r
+ private FontInfo anchorFontInfo;\r
+ private DialogPref dialogPref;\r
+\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * @param talk 一発言\r
+ */\r
+ public TalkDraw(Talk talk){\r
+ this(talk, new DialogPref(), FontInfo.DEFAULT_FONTINFO);\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * @param talk 一発言\r
+ * @param dialogPref 発言表示設定\r
+ * @param fontInfo フォント設定\r
+ */\r
+ public TalkDraw(Talk talk, DialogPref dialogPref, FontInfo fontInfo){\r
+ super(fontInfo);\r
+\r
+ this.talk = talk;\r
+ this.anchorFontInfo = deriveAnchorFontInfo(this.fontInfo);\r
+ this.dialogPref = dialogPref;\r
+\r
+ this.faceImage = getFaceImage();\r
+ this.caption = new GlyphDraw(getCaptionString(), this.fontInfo);\r
+ this.dialog = new GlyphDraw(this.talk.getDialog(), this.fontInfo);\r
+\r
+ setColorDesign();\r
+\r
+ Period period = this.talk.getPeriod();\r
+ List<Anchor> anchorList = Anchor.getAnchorList(this.talk.getDialog(),\r
+ period.getDay() );\r
+ this.dialog.setAnchorSet(anchorList);\r
+\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* 指定した色で描画したクサビイメージを取得する。\r
* @param color 色\r
return result;\r
}\r
\r
- private final Talk talk;\r
- private Anchor showingAnchor;\r
-\r
- private final GlyphDraw caption;\r
- private BufferedImage faceImage;\r
- private final GlyphDraw dialog;\r
- private final List<AnchorDraw> anchorTalks = new LinkedList<AnchorDraw>();\r
- private Point imageOrigin;\r
- private Point dialogOrigin;\r
- private Point tipOrigin;\r
- private int baloonWidth;\r
- private int baloonHeight;\r
-\r
- private FontInfo anchorFontInfo;\r
- private DialogPref dialogPref;\r
-\r
- /**\r
- * コンストラクタ。\r
- * @param talk 一発言\r
- */\r
- public TalkDraw(Talk talk){\r
- this(talk, new DialogPref(), FontInfo.DEFAULT_FONTINFO);\r
- return;\r
- }\r
-\r
- /**\r
- * コンストラクタ。\r
- * @param talk 一発言\r
- * @param dialogPref 発言表示設定\r
- * @param fontInfo フォント設定\r
- */\r
- public TalkDraw(Talk talk, DialogPref dialogPref, FontInfo fontInfo){\r
- super(fontInfo);\r
-\r
- this.talk = talk;\r
- this.anchorFontInfo = deriveAnchorFontInfo(this.fontInfo);\r
- this.dialogPref = dialogPref;\r
-\r
- this.faceImage = getFaceImage();\r
- this.caption = new GlyphDraw(getCaptionString(), this.fontInfo);\r
- this.dialog = new GlyphDraw(this.talk.getDialog(), this.fontInfo);\r
-\r
- setColorDesign();\r
-\r
- Period period = this.talk.getPeriod();\r
- List<Anchor> anchorList = Anchor.getAnchorList(this.talk.getDialog(),\r
- period.getDay() );\r
- this.dialog.setAnchorSet(anchorList);\r
-\r
- return;\r
- }\r
-\r
/**\r
* 配色を設定する。\r
*/\r
\r
private static final Color COLOR_ACTIVATED = Color.GRAY;\r
\r
- /**\r
- * 指定された文字列の指定された位置から、\r
- * 最大何文字まで1発言におさめる事ができるか判定する。\r
- * @param source 検査対象\r
- * @param start 検査開始位置\r
- * @return 1発言に納めていい長さ。\r
- */\r
- public static int choplimit(CharSequence source, int start){\r
- int length = source.length();\r
- if(start >= length) return 0;\r
-\r
- int chars = 0;\r
- int lines = 0;\r
-\r
- for(int pos = start; pos < length; pos++){\r
- chars++;\r
- if(chars >= MAX_CHARS) break;\r
- char ch = source.charAt(pos);\r
- if(ch == '\n'){\r
- lines++;\r
- if(lines >= MAX_LINES) break;\r
- }\r
- }\r
-\r
- return chars;\r
- }\r
\r
private final PlainDocument document = new PlainDocument();\r
\r
\r
private Font textFont;\r
\r
+\r
/**\r
* コンストラクタ。\r
* 通し番号は0が指定される。\r
return;\r
}\r
\r
+\r
+ /**\r
+ * 指定された文字列の指定された位置から、\r
+ * 最大何文字まで1発言におさめる事ができるか判定する。\r
+ * @param source 検査対象\r
+ * @param start 検査開始位置\r
+ * @return 1発言に納めていい長さ。\r
+ */\r
+ public static int choplimit(CharSequence source, int start){\r
+ int length = source.length();\r
+ if(start >= length) return 0;\r
+\r
+ int chars = 0;\r
+ int lines = 0;\r
+\r
+ for(int pos = start; pos < length; pos++){\r
+ chars++;\r
+ if(chars >= MAX_CHARS) break;\r
+ char ch = source.charAt(pos);\r
+ if(ch == '\n'){\r
+ lines++;\r
+ if(lines >= MAX_LINES) break;\r
+ }\r
+ }\r
+\r
+ return chars;\r
+ }\r
+\r
/**\r
* レイアウトを行う。\r
*/\r
\r
private static final int BUFSIZE = 2 * 1024;\r
\r
- /**\r
- * HTTPコネクションから入力ストリームを得る。\r
- * @param conn HTTPコネクション\r
- * @return 入力ストリーム\r
- * @throws java.io.IOException 入出力エラー\r
- */\r
- public static InputStream getInputStream(HttpURLConnection conn)\r
- throws IOException{\r
- return new TallyInputStream(conn);\r
- }\r
\r
private final HttpURLConnection conn;\r
private final InputStream in;\r
private long nanoLap;\r
private boolean hasClosed;\r
\r
+\r
/**\r
* コンストラクタ。\r
* @param conn HTTPコネクション\r
return;\r
}\r
\r
+\r
+ /**\r
+ * HTTPコネクションから入力ストリームを得る。\r
+ * @param conn HTTPコネクション\r
+ * @return 入力ストリーム\r
+ * @throws java.io.IOException 入出力エラー\r
+ */\r
+ public static InputStream getInputStream(HttpURLConnection conn)\r
+ throws IOException{\r
+ return new TallyInputStream(conn);\r
+ }\r
+\r
/**\r
* 読み込みバイト数を返す。\r
* @return 読み込みバイト数。\r
\r
private static final int BUFSIZE = 512;\r
\r
- /**\r
- * HTTPコネクションから出力ストリームを得る。\r
- * @param conn HTTPコネクション\r
- * @return 出力ストリーム\r
- * @throws java.io.IOException 入出力エラー\r
- */\r
- public static OutputStream getOutputStream(HttpURLConnection conn)\r
- throws IOException{\r
- return new TallyOutputStream(conn);\r
- }\r
\r
private final HttpURLConnection conn;\r
private final OutputStream out;\r
private long counter;\r
private long nanoLap;\r
\r
+\r
/**\r
* コンストラクタ。\r
* @param conn HTTPコネクション\r
return;\r
}\r
\r
+\r
+ /**\r
+ * HTTPコネクションから出力ストリームを得る。\r
+ * @param conn HTTPコネクション\r
+ * @return 出力ストリーム\r
+ * @throws java.io.IOException 入出力エラー\r
+ */\r
+ public static OutputStream getOutputStream(HttpURLConnection conn)\r
+ throws IOException{\r
+ return new TallyOutputStream(conn);\r
+ }\r
+\r
/**\r
* 書き込みバイト数を返す。\r
* @return 書き込みバイト数。\r
private class CustomFilter extends DocumentFilter{\r
\r
/**\r
+ * コンストラクタ。\r
+ */\r
+ public CustomFilter(){\r
+ super();\r
+ return;\r
+ }\r
+\r
+ /**\r
* 入力禁止文字の判定。\r
* @param ch 検査対象文字\r
* @return 入力禁止ならfalse。ただしIME操作中は必ずtrue。\r
}\r
\r
/**\r
- * コンストラクタ。\r
- */\r
- public CustomFilter(){\r
- super();\r
- return;\r
- }\r
-\r
- /**\r
* {@inheritDoc}\r
* @param fb {@inheritDoc}\r
* @param offset {@inheritDoc}\r
PARSER.setTalkHandler (HANDLER);\r
}\r
\r
- /**\r
- * 村同士を比較するためのComparatorを返す。\r
- * @return Comparatorインスタンス\r
- */\r
- public static Comparator<Village> comparator(){\r
- return VILLAGE_COMPARATOR;\r
- }\r
-\r
- /**\r
- * 人狼BBSサーバからPeriod一覧情報が含まれたHTMLを取得し、\r
- * Periodリストを更新する。\r
- * @param village 村\r
- * @throws java.io.IOException ネットワーク入出力の異常\r
- */\r
- public static synchronized void updateVillage(Village village)\r
- throws IOException{\r
- Land land = village.getParentLand();\r
- LandDef landDef = land.getLandDef();\r
- LandState landState = landDef.getLandState();\r
- ServerAccess server = land.getServerAccess();\r
-\r
- HtmlSequence html;\r
- if(landState == LandState.ACTIVE){\r
- html = server.getHTMLBoneHead(village);\r
- }else{\r
- html = server.getHTMLVillage(village);\r
- }\r
-\r
- DecodedContent content = html.getContent();\r
- HANDLER.setVillage(village);\r
- try{\r
- PARSER.parseAutomatic(content);\r
- }catch(HtmlParseException e){\r
- Jindolf.logger().warn("村の状態が不明", e);\r
- }\r
-\r
- return;\r
- }\r
\r
private final Land parentLand;\r
private final String villageID;\r
private final Map<Avatar, BufferedImage> bodyMonoImageMap =\r
new HashMap<Avatar, BufferedImage>();\r
\r
+\r
/**\r
* Villageを生成する。\r
* @param parentLand Villageの所属する国\r
return;\r
}\r
\r
+\r
+ /**\r
+ * 村同士を比較するためのComparatorを返す。\r
+ * @return Comparatorインスタンス\r
+ */\r
+ public static Comparator<Village> comparator(){\r
+ return VILLAGE_COMPARATOR;\r
+ }\r
+\r
+ /**\r
+ * 人狼BBSサーバからPeriod一覧情報が含まれたHTMLを取得し、\r
+ * Periodリストを更新する。\r
+ * @param village 村\r
+ * @throws java.io.IOException ネットワーク入出力の異常\r
+ */\r
+ public static synchronized void updateVillage(Village village)\r
+ throws IOException{\r
+ Land land = village.getParentLand();\r
+ LandDef landDef = land.getLandDef();\r
+ LandState landState = landDef.getLandState();\r
+ ServerAccess server = land.getServerAccess();\r
+\r
+ HtmlSequence html;\r
+ if(landState == LandState.ACTIVE){\r
+ html = server.getHTMLBoneHead(village);\r
+ }else{\r
+ html = server.getHTMLVillage(village);\r
+ }\r
+\r
+ DecodedContent content = html.getContent();\r
+ HANDLER.setVillage(village);\r
+ try{\r
+ PARSER.parseAutomatic(content);\r
+ }catch(HtmlParseException e){\r
+ Jindolf.logger().warn("村の状態が不明", e);\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
/**\r
* 所属する国を返す。\r
* @return 村の所属する国(Land)\r
"村のダイジェスト - " + Jindolf.TITLE;\r
private static final String ITEMDELIM = " : ";\r
\r
- /**\r
- * キャプション付き項目をコンテナに追加。\r
- * @param container コンテナ\r
- * @param caption 項目キャプション名\r
- * @param delimiter デリミタ文字\r
- * @param item 項目アイテム\r
- */\r
- private static void addCaptionedItem(Container container,\r
- CharSequence caption,\r
- CharSequence delimiter,\r
- Object item ){\r
- LayoutManager layout = container.getLayout();\r
- if( ! (layout instanceof GridBagLayout) ){\r
- throw new IllegalArgumentException();\r
- }\r
-\r
- JLabel captionLabel = new JLabel(caption.toString());\r
- JLabel delimiterLabel = new JLabel(delimiter.toString());\r
- JComponent itemComp;\r
- if(item instanceof JComponent){\r
- itemComp = (JComponent) item;\r
- }else{\r
- itemComp = new JLabel(item.toString());\r
- }\r
-\r
- GridBagConstraints constraints = new GridBagConstraints();\r
-\r
- constraints.weightx = 0.0;\r
- constraints.weighty = 0.0;\r
- constraints.fill = GridBagConstraints.NONE;\r
- constraints.insets = new Insets(2, 2, 2, 2);\r
-\r
- constraints.gridwidth = 1;\r
- constraints.anchor = GridBagConstraints.NORTHEAST;\r
- container.add(captionLabel, constraints);\r
- container.add(delimiterLabel, constraints);\r
-\r
- constraints.weightx = 1.0;\r
- constraints.gridwidth = GridBagConstraints.REMAINDER;\r
- constraints.anchor = GridBagConstraints.NORTHWEST;\r
- container.add(itemComp, constraints);\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * キャプション付き項目をコンテナに追加。\r
- * @param container コンテナ\r
- * @param caption 項目キャプション名\r
- * @param item 項目アイテム\r
- */\r
- private static void addCaptionedItem(Container container,\r
- CharSequence caption,\r
- Object item ){\r
- addCaptionedItem(container, caption, ITEMDELIM, item);\r
- return;\r
- }\r
-\r
- /**\r
- * レイアウトの最後に詰め物をする。\r
- * @param container コンテナ\r
- */\r
- private static void addFatPad(Container container){\r
- LayoutManager layout = container.getLayout();\r
- if( ! (layout instanceof GridBagLayout) ){\r
- throw new IllegalArgumentException();\r
- }\r
-\r
- JComponent pad = new JPanel();\r
-\r
- GridBagConstraints constraints = new GridBagConstraints();\r
- constraints.weightx = 1.0;\r
- constraints.weighty = 1.0;\r
- constraints.fill = GridBagConstraints.BOTH;\r
- constraints.gridwidth = GridBagConstraints.REMAINDER;\r
- container.add(pad, constraints);\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * GridBagLayoutでレイアウトする空コンポーネントを生成する。\r
- * @return 空コンポーネント\r
- */\r
- private static JComponent createGridBagComponent(){\r
- JComponent result = new JPanel();\r
- LayoutManager layout = new GridBagLayout();\r
- result.setLayout(layout);\r
- return result;\r
- }\r
\r
private final JComponent summaryPanel = buildSummaryPanel();\r
\r
\r
private GameSummary gameSummary;\r
\r
+\r
/**\r
* コンストラクタ。\r
* @param owner 親フレーム\r
return;\r
}\r
\r
+\r
+ /**\r
+ * キャプション付き項目をコンテナに追加。\r
+ * @param container コンテナ\r
+ * @param caption 項目キャプション名\r
+ * @param delimiter デリミタ文字\r
+ * @param item 項目アイテム\r
+ */\r
+ private static void addCaptionedItem(Container container,\r
+ CharSequence caption,\r
+ CharSequence delimiter,\r
+ Object item ){\r
+ LayoutManager layout = container.getLayout();\r
+ if( ! (layout instanceof GridBagLayout) ){\r
+ throw new IllegalArgumentException();\r
+ }\r
+\r
+ JLabel captionLabel = new JLabel(caption.toString());\r
+ JLabel delimiterLabel = new JLabel(delimiter.toString());\r
+ JComponent itemComp;\r
+ if(item instanceof JComponent){\r
+ itemComp = (JComponent) item;\r
+ }else{\r
+ itemComp = new JLabel(item.toString());\r
+ }\r
+\r
+ GridBagConstraints constraints = new GridBagConstraints();\r
+\r
+ constraints.weightx = 0.0;\r
+ constraints.weighty = 0.0;\r
+ constraints.fill = GridBagConstraints.NONE;\r
+ constraints.insets = new Insets(2, 2, 2, 2);\r
+\r
+ constraints.gridwidth = 1;\r
+ constraints.anchor = GridBagConstraints.NORTHEAST;\r
+ container.add(captionLabel, constraints);\r
+ container.add(delimiterLabel, constraints);\r
+\r
+ constraints.weightx = 1.0;\r
+ constraints.gridwidth = GridBagConstraints.REMAINDER;\r
+ constraints.anchor = GridBagConstraints.NORTHWEST;\r
+ container.add(itemComp, constraints);\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * キャプション付き項目をコンテナに追加。\r
+ * @param container コンテナ\r
+ * @param caption 項目キャプション名\r
+ * @param item 項目アイテム\r
+ */\r
+ private static void addCaptionedItem(Container container,\r
+ CharSequence caption,\r
+ Object item ){\r
+ addCaptionedItem(container, caption, ITEMDELIM, item);\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * レイアウトの最後に詰め物をする。\r
+ * @param container コンテナ\r
+ */\r
+ private static void addFatPad(Container container){\r
+ LayoutManager layout = container.getLayout();\r
+ if( ! (layout instanceof GridBagLayout) ){\r
+ throw new IllegalArgumentException();\r
+ }\r
+\r
+ JComponent pad = new JPanel();\r
+\r
+ GridBagConstraints constraints = new GridBagConstraints();\r
+ constraints.weightx = 1.0;\r
+ constraints.weighty = 1.0;\r
+ constraints.fill = GridBagConstraints.BOTH;\r
+ constraints.gridwidth = GridBagConstraints.REMAINDER;\r
+ container.add(pad, constraints);\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * GridBagLayoutでレイアウトする空コンポーネントを生成する。\r
+ * @return 空コンポーネント\r
+ */\r
+ private static JComponent createGridBagComponent(){\r
+ JComponent result = new JPanel();\r
+ LayoutManager layout = new GridBagLayout();\r
+ result.setLayout(layout);\r
+ return result;\r
+ }\r
+\r
/**\r
* 村サマリ画面の生成。\r
* @return 村サマリ画面\r
BROWSE_ENUM = getEnumMember(DESKTOP_ACTION_KLASS, "BROWSE");\r
}\r
\r
+\r
+ private final Object desktop;\r
+\r
+\r
+ /**\r
+ * 見えないコンストラクタ。\r
+ * @throws HeadlessException GUI環境が未接続\r
+ * @throws UnsupportedOperationException 未サポート\r
+ */\r
+ private WebIPC()\r
+ throws HeadlessException,\r
+ UnsupportedOperationException {\r
+ super();\r
+\r
+ try{\r
+ this.desktop = METHOD_GETDESKTOP.invoke(null, (Object[]) null);\r
+ }catch(InvocationTargetException e){\r
+ Throwable targetException = e.getTargetException();\r
+\r
+ if(targetException instanceof RuntimeException){\r
+ throw (RuntimeException) targetException;\r
+ }\r
+ if(targetException instanceof Error){\r
+ throw (Error) targetException;\r
+ }\r
+\r
+ AssertionError thw = new AssertionError();\r
+ thw.initCause(e);\r
+ throw thw;\r
+ }catch(IllegalAccessException e){\r
+ AssertionError thw = new AssertionError();\r
+ thw.initCause(e);\r
+ throw thw;\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* クラス名からClassインスタンスを探す。\r
* @param klassName クラス名\r
return webIPC;\r
}\r
\r
- private final Object desktop;\r
-\r
- /**\r
- * 見えないコンストラクタ。\r
- * @throws HeadlessException GUI環境が未接続\r
- * @throws UnsupportedOperationException 未サポート\r
- */\r
- private WebIPC()\r
- throws HeadlessException,\r
- UnsupportedOperationException {\r
- super();\r
-\r
- try{\r
- this.desktop = METHOD_GETDESKTOP.invoke(null, (Object[]) null);\r
- }catch(InvocationTargetException e){\r
- Throwable targetException = e.getTargetException();\r
-\r
- if(targetException instanceof RuntimeException){\r
- throw (RuntimeException) targetException;\r
- }\r
- if(targetException instanceof Error){\r
- throw (Error) targetException;\r
- }\r
-\r
- AssertionError thw = new AssertionError();\r
- thw.initCause(e);\r
- throw thw;\r
- }catch(IllegalAccessException e){\r
- AssertionError thw = new AssertionError();\r
- thw.initCause(e);\r
- throw thw;\r
- }\r
-\r
- return;\r
- }\r
-\r
/**\r
* Webブラウザに任意のURIを表示させる。\r
* ※参照: java.awt.Desktopのbrowse(java.net.URI)\r
private static final String FRAMETITLE =\r
"URLへのアクセス確認 - " + Jindolf.TITLE;\r
\r
- /**\r
- * Webブラウザ起動用のモーダルダイアログを表示する。\r
- * @param owner オーナーフレーム\r
- * @param url URL文字列\r
- */\r
- public static void showDialog(Frame owner, String url){\r
- WebIPCDialog dialog = new WebIPCDialog(owner);\r
-\r
- dialog.setUrlText(url);\r
- dialog.pack();\r
- dialog.setLocationRelativeTo(owner);\r
- dialog.setVisible(true);\r
-\r
- return;\r
- }\r
-\r
- /**\r
- * 有効なURIか判定する。\r
- * @param uri URI\r
- * @return 有効ならtrue\r
- */\r
- private static boolean isValidURI(URI uri){\r
- if(uri == null) return false;\r
-\r
- if( ! uri.isAbsolute() ) return false;\r
-\r
- String scheme = uri.getScheme();\r
- if(scheme == null) return false;\r
- if( ! scheme.equalsIgnoreCase("http")\r
- && ! scheme.equalsIgnoreCase("https") ) return false;\r
-\r
- String host = uri.getHost();\r
- if(host == null) return false;\r
-\r
- return true;\r
- }\r
\r
private final String warnMessage;\r
\r
\r
private URI uri;\r
\r
+\r
/**\r
* コンストラクタ。\r
* @param owner オーナーフレーム\r
return;\r
}\r
\r
+\r
+ /**\r
+ * Webブラウザ起動用のモーダルダイアログを表示する。\r
+ * @param owner オーナーフレーム\r
+ * @param url URL文字列\r
+ */\r
+ public static void showDialog(Frame owner, String url){\r
+ WebIPCDialog dialog = new WebIPCDialog(owner);\r
+\r
+ dialog.setUrlText(url);\r
+ dialog.pack();\r
+ dialog.setLocationRelativeTo(owner);\r
+ dialog.setVisible(true);\r
+\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * 有効なURIか判定する。\r
+ * @param uri URI\r
+ * @return 有効ならtrue\r
+ */\r
+ private static boolean isValidURI(URI uri){\r
+ if(uri == null) return false;\r
+\r
+ if( ! uri.isAbsolute() ) return false;\r
+\r
+ String scheme = uri.getScheme();\r
+ if(scheme == null) return false;\r
+ if( ! scheme.equalsIgnoreCase("http")\r
+ && ! scheme.equalsIgnoreCase("https") ) return false;\r
+\r
+ String host = uri.getHost();\r
+ if(host == null) return false;\r
+\r
+ return true;\r
+ }\r
+\r
/**\r
* レイアウトを行う。\r
* @param container レイアウトコンテナ\r
*/\r
public final class WolfBBS{\r
\r
+ /** PukiWikiコメント行。 */\r
+ public static final String COMMENTLINE;\r
+\r
private static final String WIKICHAR = "#&[]()<>+-*:|~/,'%?";\r
private static final Pattern WIKINAME_PATTERN =\r
Pattern.compile("[A-Z][a-z]+([A-Z])[a-z]+");\r
private static final List<FaceIconSet> FACEICONSET_LIST =\r
new LinkedList<FaceIconSet>();\r
\r
- /** PukiWikiコメント行。 */\r
- public static final String COMMENTLINE;\r
-\r
private static final Charset CHARSET_EUC = Charset.forName("EUC-JP");\r
\r
private static final String WOLFBBS_URL = "http://wolfbbs.jp/";\r
COMMENTLINE = wikicomment.toString();\r
}\r
\r
+\r
+ /**\r
+ * 隠しコンストラクタ。\r
+ */\r
+ private WolfBBS(){\r
+ assert false;\r
+ throw new AssertionError();\r
+ }\r
+\r
+\r
/**\r
* アイコンセットのロード。\r
*/\r
return result;\r
}\r
\r
- /**\r
- * 隠しコンストラクタ。\r
- */\r
- private WolfBBS(){\r
- assert false;\r
- throw new AssertionError();\r
- }\r
-\r
}\r
\r
private static final URI EMPTY_URI = URI.create("");\r
\r
+\r
+ private final Map<URI, URI> uriMap = XmlResource.RESOLVE_MAP;\r
+\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ */\r
+ public XmlResourceResolver(){\r
+ super();\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* 絶対URIと相対URIを合成したURIを返す。\r
* 正規化も行われる。\r
return input;\r
}\r
\r
- private final Map<URI, URI> uriMap = XmlResource.RESOLVE_MAP;\r
-\r
- /**\r
- * コンストラクタ。\r
- */\r
- public XmlResourceResolver(){\r
- super();\r
- return;\r
- }\r
-\r
/**\r
* 変換後のリソースの入力ストリームを得る。\r
* @param originalURI オリジナルURI\r
private static final XmlResourceResolver RESOLVER =\r
new XmlResourceResolver();\r
\r
+\r
+ /**\r
+ * 隠しコンストラクタ。\r
+ */\r
+ private XmlUtils(){\r
+ super();\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* リゾルバ経由でリソースにアクセスし、\r
* 共通スキーマによるバリデーションを行うためのDocumentBuilderを生成する。\r
}\r
\r
/**\r
- * 隠しコンストラクタ。\r
- */\r
- private XmlUtils(){\r
- super();\r
- return;\r
- }\r
-\r
- /**\r
* スキーマ検証用の厳密なエラーハンドラ。\r
*/\r
public static class StrictHandler implements ErrorHandler{\r
extends AbstractJsValue\r
implements Iterable<JsValue> {\r
\r
+ private final List<JsValue> valueList = new ArrayList<JsValue>();\r
+ private boolean changed = false;\r
+\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ */\r
+ public JsArray(){\r
+ super();\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* JSON Arrayを文字ストリームからパースする。\r
* @param reader 文字入力\r
}\r
\r
\r
- private final List<JsValue> valueList = new ArrayList<JsValue>();\r
- private boolean changed = false;\r
-\r
-\r
- /**\r
- * コンストラクタ。\r
- */\r
- public JsArray(){\r
- super();\r
- return;\r
- }\r
-\r
/**\r
* JSON Valueを追加する。\r
* @param value JSON Value\r
/** 偽。 */\r
public static final JsBoolean FALSE = new JsBoolean();\r
\r
- /**\r
- * boolean値から真偽Valueを返す。\r
- * @param bool boolean値\r
- * @return TRUEかFALSE\r
- */\r
- public static JsBoolean valueOf(boolean bool){\r
- if(bool) return TRUE;\r
- return FALSE;\r
- }\r
\r
/**\r
* コンストラクタ。\r
return;\r
}\r
\r
+\r
+ /**\r
+ * boolean値から真偽Valueを返す。\r
+ * @param bool boolean値\r
+ * @return TRUEかFALSE\r
+ */\r
+ public static JsBoolean valueOf(boolean bool){\r
+ if(bool) return TRUE;\r
+ return FALSE;\r
+ }\r
+\r
/**\r
* boolean値を返す。\r
* @return boolean値\r
extends AbstractJsValue\r
implements Comparable<JsNumber> {\r
\r
+ private BigDecimal decimal;\r
+\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * @param val 初期数値\r
+ */\r
+ public JsNumber(long val){\r
+ this(BigDecimal.valueOf(val));\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * @param val 初期数値\r
+ */\r
+ public JsNumber(double val){\r
+ this(BigDecimal.valueOf(val));\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * @param val 初期数値\r
+ */\r
+ public JsNumber(BigInteger val){\r
+ this(new BigDecimal(val));\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * 書式はjava.math.BigDecinal#BigDecimal(String)に準ずる。\r
+ * @param val 初期数値の文字列表記\r
+ * @throws NumberFormatException 不正な数値表記\r
+ */\r
+ public JsNumber(CharSequence val) throws NumberFormatException{\r
+ this(new BigDecimal(val.toString()));\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * @param val 初期数値\r
+ * @throws NullPointerException 引数がnull\r
+ */\r
+ public JsNumber(BigDecimal val) throws NullPointerException{\r
+ super();\r
+ if(val == null) throw new NullPointerException();\r
+ this.decimal = val;\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* 文字ストリームから符号付きの数字並びを読み込む。\r
* +符号は読み飛ばされる。\r
return result;\r
}\r
\r
- private BigDecimal decimal;\r
-\r
- /**\r
- * コンストラクタ。\r
- * @param val 初期数値\r
- */\r
- public JsNumber(long val){\r
- this(BigDecimal.valueOf(val));\r
- return;\r
- }\r
-\r
- /**\r
- * コンストラクタ。\r
- * @param val 初期数値\r
- */\r
- public JsNumber(double val){\r
- this(BigDecimal.valueOf(val));\r
- return;\r
- }\r
-\r
- /**\r
- * コンストラクタ。\r
- * @param val 初期数値\r
- */\r
- public JsNumber(BigInteger val){\r
- this(new BigDecimal(val));\r
- return;\r
- }\r
-\r
- /**\r
- * コンストラクタ。\r
- * 書式はjava.math.BigDecinal#BigDecimal(String)に準ずる。\r
- * @param val 初期数値の文字列表記\r
- * @throws NumberFormatException 不正な数値表記\r
- */\r
- public JsNumber(CharSequence val) throws NumberFormatException{\r
- this(new BigDecimal(val.toString()));\r
- return;\r
- }\r
-\r
- /**\r
- * コンストラクタ。\r
- * @param val 初期数値\r
- * @throws NullPointerException 引数がnull\r
- */\r
- public JsNumber(BigDecimal val) throws NullPointerException{\r
- super();\r
- if(val == null) throw new NullPointerException();\r
- this.decimal = val;\r
- return;\r
- }\r
-\r
/**\r
* BigDecimal型の数値を返す。\r
* @return BigDecimal型数値\r
extends AbstractJsValue\r
implements Iterable<JsPair> {\r
\r
+ private final Map<String, JsValue> valueMap =\r
+ new TreeMap<String, JsValue>();\r
+ private boolean changed = false;\r
+\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ */\r
+ public JsObject(){\r
+ super();\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* JSON Objectを文字ストリームからパースする。\r
* @param reader 文字入力\r
}\r
\r
\r
- private final Map<String, JsValue> valueMap =\r
- new TreeMap<String, JsValue>();\r
- private boolean changed = false;\r
-\r
-\r
- /**\r
- * コンストラクタ。\r
- */\r
- public JsObject(){\r
- super();\r
- return;\r
- }\r
-\r
/**\r
* 名前とValueからpairを登録する。\r
* @param name 名前\r
extends AbstractJsValue\r
implements CharSequence, Comparable<JsString> {\r
\r
+ private final String text;\r
+\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * 空文字が設定される。\r
+ */\r
+ public JsString(){\r
+ this(null);\r
+ return;\r
+ }\r
+\r
+ /**\r
+ * コンストラクタ。\r
+ * 引数はJSON書式ではない。\r
+ * @param seq 文字列。nullなら空文字が設定される。\r
+ */\r
+ public JsString(CharSequence seq){\r
+ super();\r
+ if(seq == null){\r
+ this.text = "";\r
+ }else{\r
+ this.text = seq.toString();\r
+ }\r
+ return;\r
+ }\r
+\r
+\r
/**\r
* FFFF形式4桁で16進エスケープされた文字列を読み、\r
* 1文字にデコードする。\r
return;\r
}\r
\r
- private final String text;\r
-\r
- /**\r
- * コンストラクタ。\r
- * 空文字が設定される。\r
- */\r
- public JsString(){\r
- this(null);\r
- return;\r
- }\r
-\r
- /**\r
- * コンストラクタ。\r
- * 引数はJSON書式ではない。\r
- * @param seq 文字列。nullなら空文字が設定される。\r
- */\r
- public JsString(CharSequence seq){\r
- super();\r
- if(seq == null){\r
- this.text = "";\r
- }else{\r
- this.text = seq.toString();\r
- }\r
- return;\r
- }\r
-\r
/**\r
* {@inheritDoc}\r
* @param index {@inheritDoc}\r
public final class Json{\r
\r
/**\r
+ * 隠しコンストラクタ。\r
+ */\r
+ private Json(){\r
+ assert false;\r
+ throw new AssertionError();\r
+ }\r
+\r
+\r
+ /**\r
* JSON最上位構造から文字出力を開始する。\r
* @param appout 出力先\r
* @param value JSONのObjectかArray\r
throw new JsParseException();\r
}\r
\r
- /**\r
- * 隠しコンストラクタ。\r
- */\r
- private Json(){\r
- assert false;\r
- throw new AssertionError();\r
- }\r
-\r
}\r