package charactermanaj.model.io;\r
\r
import java.awt.Color;\r
+import java.awt.Point;\r
+import java.awt.Rectangle;\r
import java.io.File;\r
import java.io.IOException;\r
import java.io.OutputStream;\r
* WorkingSetのXMLへの書き込み\r
*/\r
public class WorkingSetXMLWriter {\r
- \r
+\r
/**\r
* WorkingSetのバージョン\r
*/\r
\r
/**\r
* ワーキングセットをXML表現で出力ストリームに出力します.<br>\r
- * \r
+ *\r
* @param ws\r
* ワーキングセット\r
* @param outstm\r
if (ws == null || outstm == null) {\r
throw new IllegalArgumentException();\r
}\r
- \r
+\r
Document doc = createWorkingSetXML(ws);\r
\r
// output xml\r
throw ex2;\r
}\r
}\r
- \r
+\r
/**\r
* ワーキングセットのXMLドキュメントを生成します.\r
- * \r
+ *\r
* @param ws\r
* ワーキングセット\r
* @return XMLドキュメント\r
root.setAttribute("version", VERSION_SIG_1_0);\r
\r
root.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, "xmlns:xsi",\r
- XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI); \r
+ XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI);\r
root.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, "xmlns:xml",\r
- XMLConstants.XML_NS_URI); \r
+ XMLConstants.XML_NS_URI);\r
root.setAttribute("xsi:schemaLocation", NS + " character_ws.xsd");\r
\r
// ドキュメントベース\r
URI docbase = ws.getCharacterDocBase();\r
root.setAttribute("characterDocBase", docbase == null ? "" : docbase.toString());\r
- \r
+\r
// キャラクターデータのシグネチャ\r
CharacterData cd = ws.getCharacterData();\r
Element characterDataSigElm = doc.createElementNS(NS, "characterDataSig");\r
\r
// パーツカラー情報\r
root.appendChild(writePartsColorInfoMap(doc, ws.getPartsColorInfoMap()));\r
- \r
+\r
// 現在のパーツセット\r
PartsSet currentPartsSet = ws.getPartsSet();\r
Element partsSetElm = doc.createElementNS(NS, "currentPartsSet");\r
if (currentPartsSet == null || currentPartsSet.isEmpty()) {\r
partsSetElm.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:nil", "true");\r
- \r
+\r
} else {\r
Element elm = characterDataXmlWriter.createPartsSetXML(doc, lang,\r
currentPartsSet);\r
partsSetElm.appendChild(elm);\r
}\r
root.appendChild(partsSetElm);\r
- \r
+\r
// 最後に使用した保存先ディレクトリ\r
Element lastUsedSaveDirElm = doc.createElementNS(NS, "lastUsedSaveDir");\r
File lastUsedSaveDir = ws.getLastUsedSaveDir();\r
if (lastUsedSaveDir == null) {\r
lastUsedSaveDirElm.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:nil", "true");\r
- \r
+\r
} else {\r
lastUsedSaveDirElm.setTextContent(lastUsedSaveDir.getPath());\r
}\r
root.appendChild(lastUsedSaveDirElm);\r
- \r
+\r
// 最後に使用したエクスポート先ディレクトリ\r
Element lastUsedExportDirElm = doc.createElementNS(NS, "lastUsedExportDir");\r
File lastUsedExportDir = ws.getLastUsedExportDir();\r
if (lastUsedExportDir == null) {\r
lastUsedExportDirElm.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:nil", "true");\r
- \r
+\r
} else {\r
lastUsedExportDirElm.setTextContent(lastUsedExportDir.getPath());\r
}\r
root.appendChild(lastUsedExportDirElm);\r
- \r
+\r
// 最後に使用したパーツセット情報、なければnull\r
PartsSet lastUsePresetParts = ws.getLastUsePresetParts();\r
Element lastUsePresetPartsElm = doc.createElementNS(NS, "lastUsePresetParts");\r
if (lastUsePresetParts == null || lastUsePresetParts.isEmpty()) {\r
lastUsePresetPartsElm.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:nil", "true");\r
- \r
+\r
} else {\r
Element elm = characterDataXmlWriter.createPartsSetXML(doc, lang, lastUsePresetParts);\r
lastUsePresetPartsElm.appendChild(elm);\r
}\r
root.appendChild(lastUsePresetPartsElm);\r
- \r
+\r
// 壁紙情報\r
root.appendChild(writeWallpaper(doc, ws.getWallpaperInfo()));\r
- \r
+\r
+ // ズーム情報等\r
+ root.appendChild(writeViewSettings(doc, ws.getZoomFactor(), ws.getViewPosition(), ws.getWindowRect()));\r
+\r
doc.appendChild(root);\r
return doc;\r
}\r
- \r
+\r
/**\r
* パーツごとのカラー情報のXML要素を生成して返します.\r
- * \r
+ *\r
* @param doc\r
* 要素のファクトリ\r
* @param partsColorMap\r
}\r
}\r
}\r
- \r
+\r
// すべてのカラー設定を出力する.\r
Element colorsElm = doc.createElementNS(NS, "colors");\r
for (Map.Entry<PartsColorInfo, String> colorMapEntry : colorMap.entrySet()) {\r
colorsElm.appendChild(partsColorElm);\r
}\r
partsColorInfoMapElm.appendChild(colorsElm);\r
- \r
+\r
// パーツと、そのパーツのカラー設定番号の一覧を出力する.\r
Element partsListElm = doc.createElementNS(NS, "partsList");\r
for (Map.Entry<PartsIdentifier, PartsColorInfo> partsColorEntry : partsColorMap.entrySet()) {\r
}\r
return partsColorInfoMapElm;\r
}\r
- \r
+\r
/**\r
* 壁紙情報をXML要素として生成する.\r
- * \r
+ *\r
* @param doc\r
* XML要素のファクトリ\r
* @param wallpaperInfo\r
*/\r
public Element writeWallpaper(Document doc, WallpaperInfo wallpaperInfo) {\r
Element elm = doc.createElementNS(NS, "wallpaperInfo");\r
- \r
+\r
if (wallpaperInfo == null) {\r
elm.setAttributeNS(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi:nil", "true");\r
\r
Element typElm = doc.createElementNS(NS, "type");\r
typElm.setTextContent(typ.name());\r
elm.appendChild(typElm);\r
- \r
+\r
// リソース\r
String res = wallpaperInfo.getResource();\r
Element resElm = doc.createElementNS(NS, "resource");\r
resElm.setTextContent(res);\r
}\r
elm.appendChild(resElm);\r
- \r
+\r
// ファイル\r
File file = wallpaperInfo.getFile();\r
Element fileElm = doc.createElementNS(NS, "file");\r
fileElm.setTextContent(file.getPath());\r
}\r
elm.appendChild(fileElm);\r
- \r
+\r
// アルファ\r
float alpha = wallpaperInfo.getAlpha();\r
Element alphaElm = doc.createElementNS(NS, "alpha");\r
alphaElm.setTextContent(Float.toString(alpha));\r
elm.appendChild(alphaElm);\r
- \r
+\r
// 背景色\r
Color backgroundColor = wallpaperInfo.getBackgroundColor();\r
Element bgColorElm = doc.createElementNS(NS, "backgroundColor");\r
bgColorElm.setTextContent("#" + Integer.toHexString(backgroundColor.getRGB() & 0xffffff));\r
elm.appendChild(bgColorElm);\r
}\r
- \r
+\r
+ return elm;\r
+ }\r
+\r
+ /**\r
+ * Zoom情報をXML要素として生成する.\r
+ *\r
+ * @param doc\r
+ * XML要素のファクトリ\r
+ * @param zoomFactor ズーム倍率\r
+ * @param viewPosition ビュー左上位置\r
+ * @return Zoom情報のXML要素\r
+ */\r
+ public Element writeViewSettings(Document doc, Double zoomFactor, Point viewPosition, Rectangle windowRect) {\r
+ Element elm = doc.createElementNS(NS, "view");\r
+\r
+ if (zoomFactor != null) {\r
+ elm.setAttribute("zoomFactor", Double.toString(zoomFactor));\r
+ }\r
+ if (viewPosition != null) {\r
+ elm.setAttribute("x", Integer.toString(viewPosition.x));\r
+ elm.setAttribute("y", Integer.toString(viewPosition.y));\r
+ }\r
+ if (windowRect != null) {\r
+ Element elmWin = doc.createElementNS(NS, "window");\r
+ elmWin.setAttribute("x", Integer.toString(windowRect.x));\r
+ elmWin.setAttribute("y", Integer.toString(windowRect.y));\r
+ elmWin.setAttribute("width", Integer.toString(windowRect.width));\r
+ elmWin.setAttribute("height", Integer.toString(windowRect.height));\r
+ elm.appendChild(elmWin);\r
+ }\r
+\r
return elm;\r
}\r
- \r
}\r
package charactermanaj.ui;\r
\r
-import static java.lang.Math.abs;\r
-import static java.lang.Math.ceil;\r
-import static java.lang.Math.floor;\r
-import static java.lang.Math.log;\r
-import static java.lang.Math.max;\r
-import static java.lang.Math.min;\r
-import static java.lang.Math.pow;\r
-import static java.lang.Math.round;\r
+import static java.lang.Math.*;\r
\r
import java.awt.BorderLayout;\r
import java.awt.Color;\r
\r
/**\r
* プレビューパネル\r
- * \r
+ *\r
* @author seraphy\r
*/\r
public class PreviewPanel extends JPanel {\r
\r
/**\r
* プレビューパネルの上部ツールバーの通知を受けるリスナ\r
- * \r
+ *\r
* @author seraphy\r
*/\r
public interface PreviewPanelListener {\r
\r
/**\r
* 保存\r
- * \r
+ *\r
* @param e\r
*/\r
void savePicture(PreviewPanelEvent e);\r
- \r
+\r
/**\r
* コピー\r
- * \r
+ *\r
* @param e\r
*/\r
void copyPicture(PreviewPanelEvent e);\r
\r
/**\r
* 背景色変更\r
- * \r
+ *\r
* @param e\r
*/\r
void changeBackgroundColor(PreviewPanelEvent e);\r
\r
/**\r
* 情報\r
- * \r
+ *\r
* @param e\r
*/\r
void showInformation(PreviewPanelEvent e);\r
\r
/**\r
* お気に入りに追加\r
- * \r
+ *\r
* @param e\r
*/\r
void addFavorite(PreviewPanelEvent e);\r
- \r
+\r
/**\r
* 左右反転\r
- * \r
+ *\r
* @param e\r
*/\r
void flipHorizontal(PreviewPanelEvent e);\r
* ロード中を示すインジケータ\r
*/\r
private final String indicatorText;\r
- \r
+\r
/**\r
* ロード中であるか判定するタイマー\r
*/\r
private final Timer timer;\r
- \r
+\r
/**\r
* インジケータを表示するまでのディレイ\r
*/\r
private long indicatorDelay;\r
- \r
+\r
@Override\r
public void addNotify() {\r
super.addNotify();\r
timer.start();\r
}\r
}\r
- \r
+\r
@Override\r
public void removeNotify() {\r
if (timer.isRunning()) {\r
}\r
super.removeNotify();\r
}\r
- \r
+\r
public static class PreviewPanelEvent extends EventObject {\r
- \r
+\r
private static final long serialVersionUID = 1L;\r
- \r
+\r
private int modifiers;\r
\r
public PreviewPanelEvent(Object src, ActionEvent e) {\r
super(src);\r
this.modifiers = modifiers;\r
}\r
- \r
+\r
public int getModifiers() {\r
return modifiers;\r
}\r
- \r
+\r
public boolean isShiftKeyPressed() {\r
return (modifiers & ActionEvent.SHIFT_MASK) != 0;\r
}\r
}\r
- \r
+\r
private final Object lock = new Object();\r
- \r
+\r
private long loadingTicket;\r
- \r
+\r
private long loadedTicket;\r
- \r
+\r
private long firstWaitingTimestamp;\r
- \r
+\r
private boolean indicatorShown;\r
- \r
+\r
private String title;\r
- \r
+\r
private JLabel lblTitle;\r
- \r
+\r
private JLayeredPane layeredPane;\r
- \r
+\r
private CheckInfoLayerPanel checkInfoLayerPanel;\r
- \r
+\r
private PreviewImagePanel previewImgPanel;\r
- \r
+\r
private JScrollPane previewImgScrollPane;\r
- \r
+\r
private ScrollPaneDragScrollSupport scrollSupport;\r
- \r
+\r
private PreviewControlPanel previewControlPanel;\r
- \r
+\r
private double latestToggleZoom = 2.;\r
- \r
+\r
private LinkedList<PreviewPanelListener> listeners = new LinkedList<PreviewPanelListener>();\r
\r
- \r
+\r
public PreviewPanel() {\r
setLayout(new BorderLayout());\r
\r
final AppConfig appConfig = AppConfig.getInstance();\r
final Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()\r
.getLocalizedProperties(STRINGS_RESOURCE);\r
- \r
+\r
// 画像をロード中であることを示すインジケータの確認サイクル.\r
timer = new Timer(100, new ActionListener() {\r
public void actionPerformed(ActionEvent e) {\r
onTimer();\r
}\r
});\r
- \r
+\r
indicatorText = strings.getProperty("indicatorText");\r
indicatorDelay = appConfig.getPreviewIndicatorDelay();\r
\r
flipHolizontal(new PreviewPanelEvent(PreviewPanel.this, e));\r
}\r
});\r
- \r
+\r
saveBtn.setToolTipText(strings.getProperty("tooltip.save"));\r
copyBtn.setToolTipText(strings.getProperty("tooltip.copy"));\r
colorBtn.setToolTipText(strings.getProperty("tooltip.changeBgColor"));\r
favoriteBtn.setToolTipText(strings.getProperty("tooltip.registerFavorites"));\r
flipHolizontalBtn.setToolTipText(strings.getProperty("tooltip.flipHorizontal"));\r
\r
- final JToolBar toolBar = new JToolBar(); \r
+ final JToolBar toolBar = new JToolBar();\r
toolBar.setFloatable(false);\r
toolBar.add(flipHolizontalBtn);\r
toolBar.add(copyBtn);\r
}\r
return dim;\r
};\r
- \r
+\r
public Dimension getMaximumSize() {\r
return getPreferredSize();\r
};\r
- \r
+\r
public Dimension getMinimumSize() {\r
Dimension dim = getPreferredSize();\r
- dim.width = 50; \r
+ dim.width = 50;\r
return dim;\r
};\r
};\r
\r
previewImgPanel = new PreviewImagePanel();\r
\r
- \r
+\r
previewImgScrollPane = new JScrollPane(previewImgPanel);\r
previewImgScrollPane.setAutoscrolls(false);\r
previewImgScrollPane.setWheelScrollingEnabled(false);\r
previewImgScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);\r
previewImgScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);\r
- \r
+\r
scrollSupport = new ScrollPaneDragScrollSupport(previewImgScrollPane) {\r
@Override\r
protected void setCursor(Cursor cursor) {\r
PreviewPanel.this.setCursor(cursor);\r
}\r
};\r
- \r
+\r
add(previewPaneHeader, BorderLayout.NORTH);\r
- \r
+\r
layeredPane = new JLayeredPane();\r
layeredPane.setLayout(new OverlayLayout(layeredPane));\r
\r
layeredPane.add(previewImgScrollPane, JLayeredPane.DEFAULT_LAYER);\r
- \r
+\r
checkInfoLayerPanel = new CheckInfoLayerPanel();\r
layeredPane.add(checkInfoLayerPanel, JLayeredPane.POPUP_LAYER);\r
checkInfoLayerPanel.setVisible(false);\r
- \r
+\r
add(layeredPane, BorderLayout.CENTER);\r
\r
previewControlPanel = new PreviewControlPanel();\r
Dimension prevDim = previewImgScrollPane.getPreferredSize();\r
dim.width = prevDim.width;\r
previewControlPanel.setPreferredSize(dim);\r
- \r
+\r
add(previewControlPanel, BorderLayout.SOUTH);\r
previewControlPanel.setPinned(appConfig.isEnableZoomPanel());\r
\r
}\r
}\r
});\r
- \r
+\r
previewImgScrollPane.addMouseMotionListener(new MouseMotionAdapter() {\r
@Override\r
public void mouseMoved(MouseEvent e) {\r
for (final MouseWheelListener listener : previewImgScrollPane.getMouseWheelListeners()) {\r
previewImgScrollPane.removeMouseWheelListener(listener);\r
}\r
- \r
- previewImgScrollPane.addMouseWheelListener(new MouseWheelListener() { \r
+\r
+ previewImgScrollPane.addMouseWheelListener(new MouseWheelListener() {\r
public void mouseWheelMoved(MouseWheelEvent e) {\r
if ((Main.isMacOSX() && e.isAltDown()) ||\r
( !Main.isMacOSX() && e.isControlDown())) {\r
updateCheckInfoMessage(e.getPoint());\r
}\r
});\r
- \r
+\r
previewImgScrollPane.addMouseListener(new MouseAdapter() {\r
@Override\r
public void mousePressed(MouseEvent e) {\r
scrollSupport.drag(false, e.getPoint());\r
}\r
});\r
- \r
+\r
previewImgScrollPane.addMouseMotionListener(new MouseMotionListener() {\r
- \r
+\r
public void mouseMoved(MouseEvent e) {\r
updateCheckInfoMessage(e.getPoint());\r
}\r
- \r
+\r
public void mouseDragged(MouseEvent e) {\r
scrollSupport.dragging(e.getPoint());\r
\r
}\r
});\r
}\r
- \r
+\r
/**\r
* 倍率を切り替える.\r
*/\r
\r
/**\r
* マウス位置に対して画像情報のツールチップを表示する\r
- * \r
+ *\r
* @param mousePosition\r
* マウス位置\r
*/\r
checkInfoLayerPanel.setMessage(null);\r
}\r
}\r
- \r
+\r
/**\r
* マウス座標単位で指定したオフセット分スクロールする.\r
- * \r
+ *\r
* @param diff_x\r
* 水平方向スクロール数\r
* @param diff_y\r
protected void scroll(int diff_x, int diff_y) {\r
scrollSupport.scroll(diff_x, diff_y);\r
}\r
- \r
+\r
/**\r
* マウスホイールによる水平・垂直スクロール.<br>\r
* シフトキーで水平、それ以外は垂直とする.<br>\r
- * \r
+ *\r
* @param e\r
* ホイールイベント\r
*/\r
* ホイールによる拡大縮小.<br>\r
* ホイールの量は関係なく、方向だけで判定する.<br>\r
* プラットフォームごとに修飾キーの判定が異なるので、 呼び出しもとであらかじめ切り分けて呼び出すこと.<br>\r
- * \r
+ *\r
* @param e\r
* ホイールイベント\r
*/\r
} else if (wheelRotation > 0){\r
// ホイール下で縮小\r
zoomFactor = currentZoom * 0.9;\r
- \r
+\r
} else {\r
return;\r
}\r
- \r
+\r
// 倍率変更する\r
zoomWithCenterPosition(zoomFactor, e.getPoint());\r
- \r
+\r
// イベント処理済み\r
e.consume();\r
}\r
- \r
+\r
/**\r
* ズームスライダまたはコンボのいずれかの値を更新すると、他方からも更新通知があがるため 二重処理を防ぐためのセマフォ.<br>\r
*/\r
private Semaphore zoomLock = new Semaphore(1);\r
- \r
+\r
/**\r
* プレビューに表示する画像の倍率を更新する.<br>\r
* 指定した座標が拡大縮小の中心点になるようにスクロールを試みる.<br>\r
* (スクロールバーが表示されていない、もしくは十分にスクロールできない場合は必ずしも中心とはならない.)<br>\r
* コントロールパネルの表示値も更新する.<br>\r
* コントロールパネルからの更新通知をうけて再入しないように、 同時に一つしか実行されないようにしている.<br>\r
- * \r
+ *\r
* @param zoomFactor\r
* 倍率、範囲外のものは範囲内に補正される.\r
* @param mousePos\r
\r
// 現在のビューサイズ(余白があれば余白も含む)\r
Dimension viewSize = previewImgPanel.getScaledSize(true);\r
- \r
+\r
// 倍率変更\r
previewControlPanel.setZoomFactor(zoomFactor);\r
previewImgPanel.setZoomFactor(zoomFactor);\r
- \r
+\r
// 新しいのビューサイズ(余白があれば余白も含む)\r
Dimension viewSizeAfter = previewImgPanel.getScaledSize(true);\r
Dimension visibleSize = vp.getExtentSize();\r
// また、画像は縦横同率であるが表示ウィンドウはスクロールバー有無により同率とは限らない.\r
double zoomDiffX = (double) visible_width_after / (double) visible_width;\r
double zoomDiffY = (double) visible_height_after / (double) visible_height;\r
- \r
+\r
// 拡大後の座標の補正\r
Point viewCenterAfter = new Point();\r
viewCenterAfter.x = (int) round(viewCenter.x * zoomDiffX);\r
viewCenterAfter.y = (int) round(viewCenter.y * zoomDiffY);\r
- \r
+\r
// 倍率適用前後の座標の差分\r
int diff_x = viewCenterAfter.x - viewCenter.x;\r
int diff_y = viewCenterAfter.y - viewCenter.y;\r
- \r
+\r
// スクロール\r
scroll(diff_x, diff_y);\r
}\r
zoomLock.release();\r
}\r
}\r
- \r
+\r
+ /**\r
+ * 現在のビューの左上位置を返す\r
+ * @return\r
+ */\r
+ public Point getViewPosition() {\r
+ JViewport vp = previewImgScrollPane.getViewport();\r
+ return vp.getViewPosition();\r
+ }\r
+\r
+ /**\r
+ * 指定した座標が中央となるようにスクロールする。\r
+ * まだ画像が表示されていない場合は次に画像を設定したときに行う。\r
+ * @param centerPt 中央\r
+ */\r
+ public void setViewPosition(Point viewPt) {\r
+ JViewport vp = previewImgScrollPane.getViewport();\r
+ if (previewImgPanel.getPreviewImage() != null) {\r
+ if (viewPt != null) {\r
+ vp.setViewPosition(viewPt);\r
+ }\r
+ requestViewPt = null;\r
+ } else {\r
+ requestViewPt = viewPt;\r
+ }\r
+ }\r
+\r
+ private Point requestViewPt;\r
+\r
/**\r
* プレビューに表示するタイトル.<br>\r
- * \r
+ *\r
* @param title\r
* タイトル\r
*/\r
lblTitle.setToolTipText(title);\r
}\r
}\r
- \r
+\r
public String getTitle() {\r
return this.title;\r
}\r
- \r
+\r
/**\r
* ロードに時間がかかっているか判定し、 インジケータを表示するためのタイマーイベントハンドラ.<br>\r
*/\r
lblTitle.setText(title + (indicatorShown ? indicatorText : ""));\r
}\r
}\r
- \r
+\r
/**\r
* チケットの状態が、ロード完了待ち状態であるか?<br>\r
* ロード中のチケットが、ロード完了のチケットより新しければロード中と見なす.<br>\r
- * \r
+ *\r
* @return 完了待ちであればtrue、そうでなければfalse\r
*/\r
protected boolean isWaiting() {\r
/**\r
* ロード要求が出されるたびに、そのロード要求チケットを登録する.<br>\r
* チケットは要求されるたびに増加するシーケンスとする.<br>\r
- * \r
+ *\r
* @param ticket\r
* ロード要求チケット\r
*/\r
this.loadingTicket = ticket;\r
}\r
}\r
- \r
+\r
/**\r
* ロード完了するたびに呼び出される.<br>\r
- * \r
+ *\r
* @param ticket\r
* ロード要求チケット.\r
*/\r
\r
/**\r
* 表示画像を設定する.<br>\r
- * \r
+ *\r
* @param previewImg\r
* 表示画像、もしくはnull\r
*/\r
public void setPreviewImage(BufferedImage previewImg) {\r
previewImgPanel.setPreviewImage(previewImg);\r
+ if (requestViewPt != null) {\r
+ // 画像設定前にスクロール位置の要求があれば、再適用を試みる\r
+ setViewPosition(requestViewPt);\r
+ }\r
}\r
\r
/**\r
* 表示されている画像を取得する.<br>\r
* 表示画像が設定されていなければnull.<br>\r
- * \r
+ *\r
* @return 表示画像、もしくはnull\r
*/\r
public BufferedImage getPreviewImage() {\r
return previewImgPanel.getPreviewImage();\r
}\r
- \r
+\r
/**\r
* 表示している画面イメージそのままを取得する.\r
- * \r
+ *\r
* @return 表示画像\r
*/\r
public BufferedImage getScreenImage() {\r
Graphics2D g = img.createGraphics();\r
try {\r
vp.paint(g);\r
- \r
+\r
} finally {\r
g.dispose();\r
}\r
return img;\r
}\r
- \r
+\r
/**\r
* 壁紙を設定する.<br>\r
- * \r
+ *\r
* @param wallpaperImg\r
* 壁紙、null不可\r
*/\r
public void setWallpaper(Wallpaper wallpaper) {\r
previewImgPanel.setWallpaper(wallpaper);\r
}\r
- \r
+\r
/**\r
* 壁紙を取得する.<br>\r
* 壁紙が未設定の場合は空の壁紙インスタンスが返される.<br>\r
- * \r
+ *\r
* @return 壁紙\r
*/\r
public Wallpaper getWallpaper() {\r
return previewImgPanel.getWallpaper();\r
}\r
- \r
+\r
/**\r
* 表示倍率を取得する.\r
- * \r
+ *\r
* @return 表示倍率\r
*/\r
public double getZoomFactor() {\r
return previewControlPanel.getZoomFactor();\r
}\r
- \r
+\r
/**\r
* 表示倍率を設定する\r
- * \r
+ *\r
* @param zoomFactor\r
* 表示倍率\r
*/\r
public void setZoomFactor(double zoomFactor) {\r
previewControlPanel.setZoomFactor(zoomFactor);\r
}\r
- \r
+\r
/**\r
* ズームパネルのピン留め制御\r
- * \r
+ *\r
* @param visible\r
* 表示する場合はtrue\r
*/\r
public void setVisibleZoomBox(boolean visible) {\r
previewControlPanel.setPinned(visible);\r
}\r
- \r
+\r
/**\r
* ズームパネルがピン留めされているか?\r
- * \r
+ *\r
* @return ピン留めされていればtrue\r
*/\r
public boolean isVisibleZoomBox() {\r
}\r
listeners.add(listener);\r
}\r
- \r
+\r
public void removePreviewPanelListener(PreviewPanelListener listener) {\r
listeners.remove(listener);\r
}\r
- \r
+\r
protected void savePicture(PreviewPanelEvent e) {\r
for (PreviewPanelListener listener : listeners) {\r
listener.savePicture(e);\r
}\r
}\r
- \r
+\r
protected void flipHolizontal(PreviewPanelEvent e) {\r
for (PreviewPanelListener listener : listeners) {\r
listener.flipHorizontal(e);\r
}\r
}\r
- \r
+\r
protected void copyPicture(PreviewPanelEvent e) {\r
for (PreviewPanelListener listener : listeners) {\r
listener.copyPicture(e);\r
\r
/**\r
* チェック情報の表示用レイヤーパネル.<br>\r
- * \r
+ *\r
* @author seraphy\r
*/\r
class CheckInfoLayerPanel extends JPanel {\r
private static final long serialVersionUID = 1L;\r
- \r
+\r
/**\r
* ロガー\r
*/\r
* ボックスの余白\r
*/\r
private Insets padding = new Insets(3, 3, 3, 3);\r
- \r
+\r
/**\r
* 表示位置プロパティ\r
*/\r
private Point pos = new Point();\r
- \r
+\r
/**\r
* 表示メッセージプロパティ.<br>\r
* ¥nで改行となる.<br>\r
* 空文字ならば非表示.<br>\r
*/\r
private String message = "";\r
- \r
+\r
/**\r
* 解析済みメッセージ.<br>\r
* 業に分割される.<br>\r
* 空文字は空のリストとなる.<br>\r
*/\r
private String[] messageLines;\r
- \r
+\r
/**\r
* 解析済みフォントの高さ.<br>\r
*/\r
private int fontHeight;\r
- \r
+\r
/**\r
* 描画済みエリア.<br>\r
* 次回描画前に消去する必要のある領域.<br>\r
* まだ一度も描画してなければnull.<br>\r
*/\r
private Rectangle eraseRect;\r
- \r
+\r
/**\r
* 現在、描画すべきエリア.<br>\r
* なければnull.<br>\r
*/\r
private Rectangle requestRect;\r
- \r
+\r
/**\r
* 画面に関連づけられていない状態でのテキスト表示サイズは 計算できないため、画面追加時に再計算させるための 予約フラグ.<br>\r
*/\r
private boolean requestRecalcOnAdd;\r
- \r
+\r
/**\r
* フォントのためのデスクトップヒント.(あれば)\r
*/\r
@SuppressWarnings("rawtypes")\r
private Map desktopHintsForFont;\r
- \r
+\r
/**\r
* 透明コンポーネントとして構築する.<br>\r
*/\r
@SuppressWarnings("rawtypes")\r
public CheckInfoLayerPanel() {\r
setOpaque(false);\r
- \r
+\r
Toolkit tk = Toolkit.getDefaultToolkit();\r
desktopHintsForFont = (Map) tk.getDesktopProperty("awt.font.desktophints");\r
logger.log(Level.CONFIG, "awt.font.desktophints=" + desktopHintsForFont);\r
}\r
- \r
+\r
/**\r
* 指定エリアに情報を描画する.<br>\r
*/\r
if (clip == null || (eraseRect != null && clip.contains(eraseRect))) {\r
eraseRect = null;\r
}\r
- \r
+\r
// 表示領域の判定\r
if (requestRect == null || requestRect.isEmpty()\r
|| !(clip != null && clip.intersects(requestRect))) {\r
g.fillRect(requestRect.x, requestRect.y, requestRect.width, requestRect.height);\r
g.setColor(Color.GRAY);\r
g.drawRect(requestRect.x, requestRect.y, requestRect.width - 1, requestRect.height - 1);\r
- \r
+\r
// 情報の描画\r
g.setColor(Color.BLACK);\r
int oy = fontHeight;\r
g.drawString(messageLine, requestRect.x + padding.left, requestRect.y + padding.top - 1 + oy);\r
oy += fontHeight;\r
}\r
- \r
+\r
// 描画された領域を次回消去領域として記憶する.\r
if (eraseRect == null || eraseRect.isEmpty()) {\r
// 消去済みであれば、今回分のみを次回消去領域とする.\r
calcRepaint();\r
}\r
}\r
- \r
+\r
/**\r
* 要求されたプロパティから、フォント高さによる表示領域を計算し、 その領域の再描画を要求する.(描画する内容がなれば、描画要求しない.)<br>\r
* 前回表示領域があれば、消去するために、そのエリアも再描画を要求する.<br>\r
if (eraseRect != null && !eraseRect.isEmpty()) {\r
repaint(eraseRect);\r
}\r
- \r
+\r
// 空であれば新たな描画なし.\r
if (message.length() == 0) {\r
requestRect = null;\r
\r
FontMetrics fm = g.getFontMetrics();\r
String[] messageLines = message.split("¥n");\r
- \r
+\r
Rectangle2D rct = null;\r
for (String messageLine : messageLines) {\r
Rectangle2D tmp = fm.getStringBounds(messageLine, g);\r
rct = tmp;\r
}\r
}\r
- \r
+\r
int fw = (int) rct.getWidth();\r
int fh = (int) rct.getHeight();\r
\r
int w = fw + padding.left + padding.right;\r
int h = fh * messageLines.length + padding.top + padding.bottom;\r
- \r
+\r
// 指定した位置の右上あたりにする\r
int x = pos.x + 16;\r
int y = pos.y - h;\r
- \r
+\r
// サイズ\r
int client_w = getWidth();\r
int client_h = getHeight();\r
- \r
+\r
if (x + w > client_w) {\r
// 画面右の場合はカーソルの左に移動\r
x = pos.x - w - 10;\r
if (y + h > client_h) {\r
y -= (y + h - client_h);\r
}\r
- \r
+\r
// 結果の格納\r
this.requestRect = new Rectangle(x, y, w, h);\r
this.messageLines = messageLines;\r
this.fontHeight = fh;\r
- \r
+\r
// 再描画の要求\r
Rectangle paintRect = (Rectangle) requestRect.clone();\r
repaint(paintRect);\r
- \r
+\r
} finally {\r
g.dispose();\r
}\r
}\r
- \r
+\r
public void setPotision(Point requestPt) {\r
if (requestPt == null) {\r
throw new IllegalArgumentException();\r
Point oldpos = pos;\r
pos = (Point) requestPt.clone();\r
calcRepaint();\r
- firePropertyChange("position", oldpos, pos); \r
+ firePropertyChange("position", oldpos, pos);\r
}\r
}\r
- \r
+\r
public Point getPosition() {\r
return (Point) pos.clone();\r
}\r
- \r
+\r
public void setMessage(String message) {\r
if (message == null) {\r
message = "";\r
\r
/**\r
* 画像表示パネル\r
- * \r
+ *\r
* @author seraphy\r
*/\r
class PreviewImagePanel extends JPanel {\r
* 背景モード.<br>\r
*/\r
private BackgroundColorMode bgColorMode;\r
- \r
+\r
/**\r
* 壁紙.<br>\r
*/\r
private Wallpaper wallpaper;\r
- \r
+\r
/**\r
* 壁紙変更イベントのリスナ\r
*/\r
private PropertyChangeListener wallpaperListener;\r
- \r
+\r
/**\r
* 透過オリジナル画像.<br>\r
*/\r
private BufferedImage previewImg;\r
- \r
+\r
/**\r
* 表示用画像(背景モードによる調整あり).<br>\r
* 事前に拡大縮小を適用済みの場合は、{@link #scaledZoomFactor}に 適用している倍率が設定される.<br>\r
* 表示用に改めてイメージを生成する必要がない場合は、 透過オリジナルと同じインスタンスとなりえる.<br>\r
*/\r
private BufferedImage previewImgForDraw;\r
- \r
+\r
/**\r
* 表示用画像がスケール済みである場合、そのスケールが設定される.<br>\r
* スケール済みでない場合はnullとなる.<br>\r
*/\r
private Double scaledZoomFactor;\r
- \r
- \r
+\r
+\r
/**\r
* 倍率\r
*/\r
private double zoomFactor = 1.;\r
- \r
+\r
/**\r
* 許容誤差\r
*/\r
private static final double TOLERANT = 0.001;\r
\r
- \r
+\r
/**\r
* コンストラクタ\r
*/\r
onChangeWallpaper();\r
}\r
};\r
- \r
+\r
// 壁紙\r
wallpaper = new Wallpaper();\r
wallpaper.addPropertyChangeListener(wallpaperListener);\r
}\r
- \r
+\r
/**\r
* 画像を表示する.\r
*/\r
// 倍率を適用した画像を画面の中央に配置できるように計算する.\r
// (画像が倍率適用済みであれば1倍とする)\r
Rectangle imgRct = adjustImageRectangle();\r
- \r
+\r
// 表示用画像がスケール済みでない場合はレンダリングオプションを適用する.\r
if (scaledZoomFactor == null) {\r
Object renderingOption = getRenderingOption();\r
int h = getHeight();\r
wallpaper.drawWallpaper(g, w, h);\r
}\r
- \r
+\r
// レンダリング\r
g.drawImage(previewImgForDraw,\r
imgRct.x, imgRct.y,\r
try {\r
g.setColor(new Color(appConfig.getPreviewGridColor(), true));\r
drawGrid(g, imgRct.x, imgRct.y, appConfig.getPreviewGridSize());\r
- \r
+\r
} finally {\r
g.setColor(oldc);\r
}\r
/**\r
* グリッドを描画する.<br>\r
* 開始位置の-1単位位置から画像サイズの+1単位までがグリッド範囲となる。\r
- * \r
+ *\r
* @param g\r
* @param offset_x\r
* 開始位置\r
*/\r
protected void drawGrid(Graphics2D g, int offset_x, int offset_y, int unit) {\r
Rectangle clip = g.getClipBounds();\r
- \r
+\r
int src_w = previewImg.getWidth();\r
int src_h = previewImg.getHeight();\r
int my = src_h / unit;\r
int mx = src_w / unit;\r
- \r
+\r
int st_x = offset_x + (int)(-1 * unit * zoomFactor);\r
int en_x = offset_x + (int)((mx + 1) * unit * zoomFactor);\r
int w = en_x - st_x + 1;\r
- \r
+\r
for (int y = -1; y <= my + 1; y++) {\r
int y1 = y * unit;\r
Rectangle rct = new Rectangle(\r
g.drawLine(rct.x, rct.y, rct.x + rct.width, rct.y);\r
}\r
}\r
- \r
+\r
int st_y = offset_y + (int)(-1 * unit * zoomFactor);\r
int en_y = offset_y + (int)((my + 1) * unit * zoomFactor);\r
int h = en_y - st_y + 1;\r
- \r
+\r
for (int x = -1; x <= mx + 1; x++) {\r
int x1 = x * unit;\r
Rectangle rct = new Rectangle(\r
g.drawLine(rct.x, rct.y, rct.x, rct.y + rct.height);\r
}\r
}\r
- \r
+\r
/**\r
* 現在の倍率に応じたレンダリングオプションを取得する.<br>\r
- * \r
+ *\r
* @return レンダリングオプション\r
*/\r
protected Object getRenderingOption() {\r
// 拡大する場合でバイキュービックをサポートしている場合\r
renderingHint = RenderingHints.VALUE_INTERPOLATION_BICUBIC;\r
}\r
- \r
+\r
} else {\r
// 補正を適用する最大倍率を超えている場合は補正なし.\r
renderingHint = RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR;\r
}\r
return renderingHint;\r
}\r
- \r
+\r
/**\r
* 倍率と、画面のサイズと、表示するオリジナルの画像サイズをもとに、 倍率を適用した画像サイズを、画面に収まる位置に補正して返す.<br>\r
* 返される矩形の幅と高さ(width, height)は拡大後の画像サイズに等しい.<br>\r
* 拡大後の画像が画面よりも小さければセンタリングするように矩形の開始位置(x, y)がオフセットされる.<br>\r
* そうでなければ矩形の開始位置(x, y)は0となる.<br>\r
* 画像が設定されていなければ幅と高さがゼロの矩形が返される.<br>\r
- * \r
+ *\r
* @return 画像を表示するオフセットと大きさ、もしくは空の矩形\r
*/\r
public Rectangle adjustImageRectangle() {\r
}\r
int client_w = getWidth();\r
int client_h = getHeight();\r
- \r
+\r
int src_w = previewImg.getWidth();\r
int src_h = previewImg.getHeight();\r
- \r
+\r
int w = (int) round(src_w * zoomFactor);\r
int h = (int) round(src_h * zoomFactor);\r
- \r
+\r
int offset_x = 0;\r
if (w < client_w) {\r
offset_x = (client_w - w) / 2;\r
if (h < client_h) {\r
offset_y = (client_h - h) / 2;\r
}\r
- \r
+\r
return new Rectangle(offset_x, offset_y, w, h);\r
}\r
\r
/**\r
* パネルのマウス座標から、実寸の画像のピクセル位置を返す.<br>\r
* 画像が表示されていないか、範囲外であればnullを返す.<br>\r
- * \r
+ *\r
* @param pt\r
* パネルの座標\r
* @return 画像の位置、もしくはnull\r
// 範囲外であればnull\r
return null;\r
}\r
- \r
+\r
// オフセットを除去する.\r
Point ret = (Point) pt.clone();\r
ret.x -= imgRct.x;\r
ret.y -= imgRct.y;\r
- \r
+\r
// 倍率を解除する.\r
ret.x = (int) floor(ret.x / zoomFactor);\r
ret.y = (int) floor(ret.y / zoomFactor);\r
- \r
+\r
return ret;\r
}\r
\r
/**\r
* 画像の位置から画面の位置を割り出す.<br>\r
- * \r
+ *\r
* @param pt\r
* 画像の位置\r
* @return 画面の位置\r
// プレビュー画像が設定されていなければnull\r
return null;\r
}\r
- \r
+\r
Rectangle imgRct = adjustImageRectangle();\r
\r
// 表示倍率を加える\r
Point ret = (Point) pt.clone();\r
ret.x = (int) ceil(ret.x * zoomFactor);\r
ret.y = (int) ceil(ret.y * zoomFactor);\r
- \r
+\r
// オフセットを加える\r
ret.x += imgRct.x;\r
ret.y += imgRct.y;\r
- \r
+\r
return ret;\r
}\r
- \r
+\r
/**\r
* 指定した位置のRGB値を取得する.<br>\r
* 範囲外の場合は0が返される.<br>\r
- * \r
+ *\r
* @param pt\r
* イメージの位置\r
* @return イメージのARGB値 (ビット順序は、A:24, R:16, G:8, B:0)\r
return 0; // 範囲外\r
}\r
}\r
- \r
+\r
/**\r
* 倍率を適用した画像パネルのサイズを計算し適用する.<br>\r
* モードにより余白が加えられる.<br>\r
* 元画像が設定されていなければnull.<br>\r
* needOffsetがfalseであれば表示モードに関わらず、画像の拡大・縮小後の純粋なサイズ、\r
* trueであれば余白が必要な表示モードの場合の余白が付与された場合のサイズが返される.<br>\r
- * \r
+ *\r
* @param needOffset\r
* 余白を加味したサイズが必要な場合はtrue\r
* @return 倍率適用後のサイズ、もしくはnull\r
\r
int w = (int) round(src_w * zoomFactor);\r
int h = (int) round(src_h * zoomFactor);\r
- \r
+\r
Dimension scaledSize = new Dimension(w, h);\r
\r
if (bgColorMode != BackgroundColorMode.ALPHABREND) {\r
scaledSize.width += max(0, unfilledSpace * 2);\r
scaledSize.height += max(0, unfilledSpace * 2);\r
}\r
- \r
+\r
return scaledSize;\r
}\r
\r
/**\r
* プレビュー画像を設定する.\r
- * \r
+ *\r
* @param previewImg\r
*/\r
public void setPreviewImage(BufferedImage previewImg) {\r
BufferedImage oldimg = this.previewImg;\r
this.previewImg = previewImg;\r
- \r
+\r
recalcScaledSize();\r
makeDrawImage(true);\r
repaint();\r
- \r
+\r
firePropertyChange("previewImage", oldimg, previewImg);\r
}\r
- \r
+\r
public BufferedImage getPreviewImage() {\r
return previewImg;\r
}\r
\r
/**\r
* 壁紙を設定する.\r
- * \r
+ *\r
* @param wallpaper\r
*/\r
public void setWallpaper(Wallpaper wallpaper) {\r
onChangeWallpaper();\r
}\r
}\r
- \r
+\r
public Wallpaper getWallpaper() {\r
return wallpaper;\r
}\r
- \r
+\r
protected void onChangeWallpaper() {\r
repaint();\r
}\r
- \r
+\r
/**\r
* 背景モード調整済みの表示用画像を作成する.\r
- * \r
+ *\r
* @param changeImage\r
* 画像の変更あり\r
*/\r
// すでに作成済みの画像が使用できる.\r
img = previewImgForDraw;\r
}\r
- \r
+\r
// レンダリングオプション\r
Object renderingOption = getRenderingOption();\r
\r
try {\r
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,\r
RenderingHints.VALUE_INTERPOLATION_BICUBIC);\r
- \r
+\r
g.drawImage(img,\r
0, 0, scaledSize.width, scaledSize.height,\r
0, 0, img.getWidth(), img.getHeight(),\r
null);\r
- \r
+\r
} finally {\r
g.dispose();\r
}\r
previewImgForDraw = offscreen;\r
scaledZoomFactor = Double.valueOf(zoomFactor);\r
}\r
- \r
+\r
public void setBackgroundColorMode(BackgroundColorMode bgColorMode) {\r
if (bgColorMode == null) {\r
throw new IllegalArgumentException();\r
if (this.bgColorMode != bgColorMode) {\r
BackgroundColorMode oldcm = bgColorMode;\r
this.bgColorMode = bgColorMode;\r
- \r
+\r
makeDrawImage(true);\r
recalcScaledSize();\r
repaint();\r
- \r
+\r
firePropertyChange("backgroundColorMode", oldcm, bgColorMode);\r
}\r
}\r
firePropertyChange("zoomFactor", oldzoom, zoomFactor);\r
}\r
}\r
- \r
+\r
public double getZoomFactor() {\r
return zoomFactor;\r
}\r
- \r
+\r
/**\r
* 倍率が100%であるか?\r
- * \r
+ *\r
* @return 100%であればtrue\r
*/\r
public boolean isDefaultZoom() {\r
\r
/**\r
* 倍率・背景モードを操作するための下部パネル用\r
- * \r
+ *\r
* @author seraphy\r
*/\r
class PreviewControlPanel extends JPanel {\r
private static final long serialVersionUID = 1L;\r
- \r
+\r
private static final Logger logger = Logger.getLogger(PreviewControlPanel.class.getName());\r
\r
protected static final String STRINGS_RESOURCE = "languages/previewpanel";\r
* ピン留めチェックボックス\r
*/\r
private JCheckBox chkPinning;\r
- \r
+\r
/**\r
* アルファ確認チェックボックス\r
*/\r
* 倍率用スライダ\r
*/\r
private JSlider zoomSlider;\r
- \r
+\r
/**\r
* 倍率入力用コンボボックス\r
*/\r
private JComboBox zoomCombo;\r
- \r
+\r
\r
/**\r
* スライダの最小値\r
*/\r
private static final int MIN_INDEX = -170;\r
- \r
+\r
/**\r
* スライダの最大値\r
*/\r
private static final int MAX_INDEX = 219;\r
- \r
+\r
/**\r
* 最小倍率\r
*/\r
private double minimumZoomFactor;\r
- \r
+\r
/**\r
* 最大倍率\r
*/\r
private double maximumZoomFactor;\r
- \r
- \r
+\r
+\r
/**\r
* 現在の倍率(100倍済み)\r
*/\r
private int currentZoomFactorInt;\r
- \r
+\r
/**\r
* 現在の背景色モード\r
*/\r
private BackgroundColorMode backgroundColorMode;\r
\r
- \r
+\r
/**\r
* 任意の底Aをもつ対数 logA(N)を計算して返す.\r
- * \r
+ *\r
* @param a\r
* 底\r
* @param x\r
private static double logN(double a, double x) {\r
return log(x) / log(a);\r
}\r
- \r
+\r
/**\r
* 倍率(等倍を1とする)に対するスライダのインデックス値を返す.<br>\r
* スライダは10ステップごとに前のステップの10%づつ増減する.(複利式)<br>\r
- * \r
+ *\r
* @param zoomFactor\r
* 倍率(1を等倍とする)\r
* @return インデックス\r
private static int zoomFactorToIndex(double zoomFactor) {\r
return (int) round(logN((1. + 0.1), zoomFactor) * 10);\r
}\r
- \r
+\r
/**\r
* スライダのインデックス値から倍率(等倍を1とする)を返す.<br>\r
* 10ステップごとに10%づつ増減する.(複利式)<br>\r
- * \r
+ *\r
* @param index\r
* インデックス\r
* @return 倍率(1を等倍とする)\r
private static double zoomFactorFromIndex(int index) {\r
return pow(1. + 0.1, index / 10.);\r
}\r
- \r
- \r
+\r
+\r
/**\r
* コンストラクタ\r
*/\r
public PreviewControlPanel() {\r
final Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()\r
.getLocalizedProperties(STRINGS_RESOURCE);\r
- \r
+\r
UIHelper uiHelper = UIHelper.getInstance();\r
\r
// ピンアイコン\r
Icon pinIcon = uiHelper.createTwoStateIcon(\r
"icons/pin-icon1.png", "icons/pin-icon2.png");\r
- \r
+\r
// ピンチェックボックス\r
chkPinning = new JCheckBox(pinIcon);\r
chkPinning.setToolTipText(strings.getProperty("tooltip.zoompanel.pinning"));\r
AbstractButton btn = (AbstractButton) c;\r
sw = btn.isSelected();\r
}\r
- \r
+\r
int w = getIconWidth();\r
int h = getIconHeight();\r
- \r
+\r
int s = min(w, h);\r
- \r
+\r
int ox = 0;\r
int oy = 0;\r
if (w > s) {\r
if (h > s) {\r
oy = (h - s) / 2;\r
}\r
- \r
+\r
if (sw) {\r
AppConfig appConfig = AppConfig.getInstance();\r
Color fillColor = appConfig.getSelectedItemBgColor();\r
g.setColor(Color.GRAY);\r
g.drawOval(x + ox, y + oy, s, s);\r
}\r
- }; \r
- \r
+ };\r
+\r
// アルファ確認とグレースケール確認用のチェックボックス\r
chkNoAlpha = new JCheckBox(stateIcon);\r
chkGrayscale = new JCheckBox(stateIcon);\r
\r
chkNoAlpha.setToolTipText(strings.getProperty("tooltip.zoompanel.checkalpha"));\r
chkGrayscale.setToolTipText(strings.getProperty("tooltip.zoompanel.checkgrayscale"));\r
- \r
+\r
backgroundColorMode = BackgroundColorMode.ALPHABREND;\r
- \r
+\r
final ChangeListener chkAlphaGrayChangeListener = new ChangeListener() {\r
public void stateChanged(ChangeEvent e) {\r
onChangeCheckAlphaGray();\r
\r
int minZoomRange = (int) round(minimumZoomFactor * 100.);\r
int maxZoomRange = (int) round(maximumZoomFactor * 100.);\r
- \r
+\r
List<Integer> predefinedZoomRanges = getPredefinedZoomRanges();\r
for (int zoomRange : predefinedZoomRanges) {\r
if (zoomRange < minZoomRange) {\r
zoomCombo.addItem(Integer.toString(zoomRange));\r
}\r
final int[] zoomRanges = {minZoomRange, maxZoomRange};\r
- \r
+\r
currentZoomFactorInt = 100;\r
zoomCombo.setSelectedItem(Integer.toString(currentZoomFactorInt));\r
zoomCombo.setEditable(true);\r
}\r
});\r
}\r
- \r
+\r
// スライダを変更することによりコンボボックスを変更する、\r
// もしくはコンボボックスを変更することでスライダを変更するが、\r
// 互いに通知を呼び合うことになるため他方を無視するためのセマフォ\r
zoomFactorInt = zoomRanges[1];\r
adjusted = true;\r
}\r
- \r
+\r
} catch (RuntimeException ex) {\r
zoomFactorInt = 100;\r
adjusted = true;\r
if (changeLock.tryAcquire()) {\r
try {\r
zoomSlider.setValue(zoomFactorToIndex(zoomFactorInt / 100.));\r
- \r
+\r
} finally {\r
changeLock.release();\r
}\r
fireZoomFactorChange(zoomFactorInt);\r
}\r
});\r
- \r
+\r
zoomSlider.addChangeListener(new ChangeListener() {\r
public void stateChanged(ChangeEvent e) {\r
int index = zoomSlider.getValue();\r
if (changeLock.tryAcquire()) {\r
try {\r
zoomCombo.setSelectedItem(Integer.toString(zoomFactorInt));\r
- \r
+\r
} finally {\r
changeLock.release();\r
}\r
});\r
\r
// パーツの配備\r
- \r
+\r
GridBagLayout gbl = new GridBagLayout();\r
setLayout(gbl);\r
- \r
+\r
GridBagConstraints gbc = new GridBagConstraints();\r
gbc.gridx = 0;\r
gbc.gridy = 0;\r
gbc.insets = new Insets(0, 0, 0, 5);\r
gbc.weightx = 0.;\r
gbc.weighty = 0.;\r
- \r
+\r
add(chkPinning, gbc);\r
- \r
+\r
gbc.gridx = 1;\r
gbc.weightx = 0.;\r
gbc.insets = new Insets(0, 0, 0, 0);\r
gbc.weightx = 1.;\r
gbc.fill = GridBagConstraints.HORIZONTAL;\r
add(zoomSlider, gbc);\r
- \r
+\r
gbc.gridx = 4;\r
gbc.weightx = 0.;\r
gbc.insets = new Insets(3, 0, 3, 0);\r
scrollbarWidth = Integer.parseInt(\r
strings.getProperty("uiconstraint.scrollbar.width"));\r
}\r
- \r
+\r
gbc.gridx = 5;\r
gbc.weightx = 0.;\r
gbc.anchor = GridBagConstraints.WEST;\r
gbc.insets = new Insets(0, 0, 0, scrollbarWidth);\r
add(new JLabel("%"), gbc);\r
}\r
- \r
+\r
/**\r
* アプリケーション設定より事前定義済みの倍率候補を取得する\r
- * \r
+ *\r
* @return 倍率候補のリスト(順序あり)\r
*/\r
protected List<Integer> getPredefinedZoomRanges() {\r
ranges.add(Integer.valueOf(100)); // 等倍は常に設定する.\r
return new ArrayList<Integer>(ranges);\r
}\r
- \r
+\r
/**\r
* 倍率が変更されたことを通知する.\r
*/\r
firePropertyChange("zoomFactorInt", oldValue, newZoomFactor);\r
}\r
}\r
- \r
+\r
private Semaphore changeChkLock = new Semaphore(1);\r
- \r
+\r
protected void onChangeCheckAlphaGray() {\r
changeChkLock.tryAcquire();\r
try {\r
changeChkLock.release();\r
}\r
}\r
- \r
+\r
public BackgroundColorMode getBackgroundColorMode() {\r
return this.backgroundColorMode;\r
}\r
- \r
+\r
public void setBackgroundColorMode(BackgroundColorMode backgroundColorMode) {\r
if (backgroundColorMode == null) {\r
throw new IllegalArgumentException();\r
firePropertyChange("backgroundColorMode", oldcm, backgroundColorMode);\r
}\r
}\r
- \r
+\r
public boolean isPinned() {\r
return chkPinning.isSelected();\r
}\r
- \r
+\r
public void setPinned(boolean pinned) {\r
chkPinning.setSelected(pinned);\r
if (isDisplayable()) {\r
setVisible(pinned);\r
}\r
}\r
- \r
+\r
public double getZoomFactor() {\r
return (double) currentZoomFactorInt / 100.;\r
}\r