OSDN Git Service

前回作業時のウィンドウサイズ、位置、ズーム、スクロールバーの位置の復元
authorseraphy <seraphy@users.osdn.me>
Thu, 8 Nov 2018 17:01:42 +0000 (02:01 +0900)
committerseraphy <seraphy@users.osdn.me>
Thu, 8 Nov 2018 17:01:42 +0000 (02:01 +0900)
https://osdn.net/projects/charactermanaj/ticket/38732

src/main/java/charactermanaj/model/AppConfig.java
src/main/java/charactermanaj/model/WorkingSet.java
src/main/java/charactermanaj/model/WorkingSet2.java
src/main/java/charactermanaj/model/io/WorkingSetXMLReader.java
src/main/java/charactermanaj/model/io/WorkingSetXMLWriter.java
src/main/java/charactermanaj/ui/MainFrame.java
src/main/java/charactermanaj/ui/PreviewPanel.java
src/main/java/charactermanaj/ui/util/ScrollPaneDragScrollSupport.java
src/main/resources/languages/appconfigdialog.xml
src/main/resources/languages/appconfigdialog_ja.xml
src/main/resources/languages/appconfigdialog_zh.xml

index acbb3ba..668ba36 100644 (file)
@@ -1073,4 +1073,17 @@ public final class AppConfig {
        public void setFontPriority(String fontPriority) {
                this.fontPriority = fontPriority;
        }
+
+       /**
+        * ウィンドウの位置、サイズ、スクロールバーの位置、ズームの状態を復元するか?
+        */
+       private boolean enableRestoreWindow = false;
+
+       public boolean isEnableRestoreWindow() {
+               return enableRestoreWindow;
+       }
+
+       public void setEnableRestoreWindow(boolean enableRestoreWindow) {
+               this.enableRestoreWindow = enableRestoreWindow;
+       }
 }
index f3e3c55..c088864 100644 (file)
@@ -1,5 +1,7 @@
 package charactermanaj.model;\r
 \r
+import java.awt.Point;\r
+import java.awt.Rectangle;\r
 import java.io.File;\r
 import java.io.IOException;\r
 import java.io.ObjectInputStream;\r
@@ -24,33 +26,39 @@ public class WorkingSet implements Serializable {
        private static final long serialVersionUID = -4728766140876842242L;\r
 \r
        private Map<PartsIdentifier, PartsColorInfo> partsColorInfoMap;\r
-       \r
+\r
        private String characterDataRev;\r
-       \r
+\r
        /**\r
         * 現在の選択中のパーツと色設定からのパーツセット\r
         */\r
        private PartsSet partsSet;\r
-       \r
+\r
        private URI characterDocBase;\r
-       \r
+\r
        private File lastUsedSaveDir;\r
-       \r
+\r
        private File lastUsedExportDir;\r
 \r
        // ver0.92\r
        private PartsSet lastUsePresetParts;\r
-       \r
+\r
        // ver0.94\r
        private CharacterData characterData;\r
-       \r
+\r
        // ver0.97\r
        private WallpaperInfo wallpaperInfo;\r
-       \r
+\r
+       // ver0.999\r
+       private Double zoomFactor;\r
+\r
+       private Point viewPosition;\r
+\r
+       private Rectangle windowRect;\r
 \r
        /**\r
         * デシリアライズ\r
-        * \r
+        *\r
         * @param inp\r
         *            オブジェクトの復元ストリーム\r
         * @throws IOException\r
@@ -68,11 +76,11 @@ public class WorkingSet implements Serializable {
                        logger.log(Level.FINE, "WorkingSetのデシリアライズ name=" + sig.getName()\r
                                        + "/sid=" + sig.getSerialVersionUID());\r
                }\r
-               \r
+\r
                partsColorInfoMap = (Map<PartsIdentifier, PartsColorInfo>) fields.get("partsColorInfoMap", null);\r
                characterDataRev = (String) fields.get("characterDataRev", null);\r
                partsSet = (PartsSet) fields.get("partsSet", null);\r
-               \r
+\r
                Object anyDocBase = fields.get("characterDocBase", null);\r
                if (anyDocBase != null && anyDocBase instanceof URL) {\r
                        File file = new File(((URL) anyDocBase).getPath());\r
@@ -80,73 +88,78 @@ public class WorkingSet implements Serializable {
                }\r
                // ver0.95からURI, それ以前はURL\r
                characterDocBase = (URI) anyDocBase;\r
-               \r
+\r
                lastUsedSaveDir = (File) fields.get("lastUsedSaveDir", null);\r
                lastUsedExportDir = (File) fields.get("lastUsedExportDir", null);\r
 \r
                // ver0.92\r
                lastUsePresetParts = (PartsSet) fields.get("lastUsePresetParts", null);\r
-               \r
+\r
                // ver0.94\r
                characterData = (CharacterData) fields.get("characterData", null);\r
-               \r
+\r
                // ver0.97\r
                wallpaperInfo = (WallpaperInfo) fields.get("wallpaperInfo", null);\r
+\r
+               // ver0.999\r
+               zoomFactor = (Double) fields.get("zoomFactor", null);\r
+               viewPosition = (Point) fields.get("viewCenterPoint", null);\r
+               windowRect = (Rectangle) fields.get("windowRect", null);\r
        }\r
-       \r
-       \r
+\r
+\r
        public void setCharacterDataRev(String characterDataRev) {\r
                this.characterDataRev = characterDataRev;\r
        }\r
-       \r
+\r
        /**\r
         * REV情報.<br>\r
         * キャラクターデータが設定されていない場合に使用される.<br>\r
         * (ver0.96以前旧シリアライズデータ互換用)<br>\r
-        * \r
+        *\r
         * @return\r
         */\r
        public String getCharacterDataRev() {\r
                return characterDataRev;\r
        }\r
-       \r
+\r
        public Map<PartsIdentifier, PartsColorInfo> getPartsColorInfoMap() {\r
                return partsColorInfoMap;\r
        }\r
-       \r
+\r
        public void setPartsColorInfoMap(\r
                        Map<PartsIdentifier, PartsColorInfo> partsColorInfoMap) {\r
                this.partsColorInfoMap = partsColorInfoMap;\r
        }\r
-       \r
+\r
        public void setCharacterDocBase(URI characterDocBase) {\r
                this.characterDocBase = characterDocBase;\r
        }\r
-       \r
+\r
        public void setPartsSet(PartsSet partsSet) {\r
                this.partsSet = partsSet;\r
        }\r
-       \r
+\r
        public URI getCharacterDocBase() {\r
                return characterDocBase;\r
        }\r
-       \r
+\r
        public PartsSet getPartsSet() {\r
                return partsSet;\r
        }\r
-       \r
+\r
        public void setLastUsedSaveDir(File lastUsedSaveDir) {\r
                this.lastUsedSaveDir = lastUsedSaveDir;\r
        }\r
-       \r
+\r
        public void setLastUsedExportDir(File lastUsedExportDir) {\r
                this.lastUsedExportDir = lastUsedExportDir;\r
        }\r
-       \r
+\r
        public File getLastUsedSaveDir() {\r
                return lastUsedSaveDir;\r
        }\r
-       \r
+\r
        public File getLastUsedExportDir() {\r
                return lastUsedExportDir;\r
        }\r
@@ -155,7 +168,7 @@ public class WorkingSet implements Serializable {
         * 最後に使用したお気に入りの情報.<br>\r
         * 一度もプリセットを使ってなければnull.<br>\r
         * ver0.94以前には存在しなかったため、nullになりえます。\r
-        * \r
+        *\r
         * @return\r
         */\r
        public PartsSet getLastUsePresetParts() {\r
@@ -166,21 +179,21 @@ public class WorkingSet implements Serializable {
         * /** 最後に使用したお気に入りの情報.<br>\r
         * 一度もプリセットを使ってなければnull.<br>\r
         * (ver0.94以前には存在しなかったため、nullになりえます。)\r
-        * \r
+        *\r
         * @param lastUsePresetParts\r
         */\r
        public void setLastUsePresetParts(PartsSet lastUsePresetParts) {\r
                this.lastUsePresetParts = lastUsePresetParts;\r
        }\r
-       \r
+\r
        public void setCharacterData(CharacterData characterData) {\r
                this.characterData = characterData;\r
        }\r
-       \r
+\r
        /**\r
         * 使用していたキャラクター定義を取得します.<br>\r
         * ver0.95よりも以前には存在しないため、nullとなりえます.<br>\r
-        * \r
+        *\r
         * @return キャラクターデータ\r
         */\r
        public CharacterData getCharacterData() {\r
@@ -190,17 +203,53 @@ public class WorkingSet implements Serializable {
        /**\r
         * 壁紙情報を取得します.<br>\r
         * ver0.97よりも以前には存在しないため、nullとなりえます.<br>\r
-        * \r
+        *\r
         * @return 壁紙情報\r
         */\r
        public WallpaperInfo getWallpaperInfo() {\r
                return wallpaperInfo;\r
        }\r
-       \r
+\r
        public void setWallpaperInfo(WallpaperInfo wallpaperInfo) {\r
                this.wallpaperInfo = wallpaperInfo;\r
        }\r
-       \r
+\r
+       /**\r
+        * ビューの左上位置\r
+        * @return\r
+        */\r
+       public Point getViewPosition() {\r
+               return viewPosition;\r
+       }\r
+\r
+       public void setViewPosition(Point viewPosition) {\r
+               this.viewPosition = viewPosition;\r
+       }\r
+\r
+       /**\r
+        * ズーム\r
+        * @return\r
+        */\r
+       public Double getZoomFactor() {\r
+               return zoomFactor;\r
+       }\r
+\r
+       public void setZoomFactor(Double zoomFactor) {\r
+               this.zoomFactor = zoomFactor;\r
+       }\r
+\r
+       /**\r
+        * ウィンドウサイズ\r
+        * @return\r
+        */\r
+       public Rectangle getWindowRect() {\r
+               return windowRect;\r
+       }\r
+\r
+       public void setWindowRect(Rectangle windowRect) {\r
+               this.windowRect = windowRect;\r
+       }\r
+\r
        @Override\r
        public String toString() {\r
                return "docBase:" + characterDocBase + "/rev:" + characterDataRev;\r
index 62e7790..f2b7974 100644 (file)
@@ -1,5 +1,7 @@
 package charactermanaj.model;\r
 \r
+import java.awt.Point;\r
+import java.awt.Rectangle;\r
 import java.io.File;\r
 import java.net.URI;\r
 import java.util.Collections;\r
@@ -11,7 +13,7 @@ import charactermanaj.ui.model.WallpaperInfo;
 /**\r
  * WorkingSetのXMLの読み込み時に使用する.<br>\r
  * 特定のキャラクターデータのインスタンスとの関連を持たない状態の設定値を保持している.<br>\r
- * \r
+ *\r
  * @author seraphy\r
  */\r
 public class WorkingSet2 {\r
@@ -59,6 +61,23 @@ public class WorkingSet2 {
         */\r
        private WallpaperInfo wallpaperInfo;\r
 \r
+       /**\r
+        * ズーム倍率\r
+        * (ズーム倍率の保存はv0.999から、未指定の場合はnull)\r
+        */\r
+       private Double zoomFactor;\r
+\r
+       /**\r
+        * ビューの中央位置\r
+        * (ズーム倍率の保存はv0.999から、未指定の場合はnull)\r
+        */\r
+       private Point viewPosition;\r
+\r
+       /**\r
+        * ウィンドウの位置と大きさ\r
+        */\r
+       private Rectangle windowRect;\r
+\r
        public void setCharacterDocBase(URI characterDocBase) {\r
                this.characterDocBase = characterDocBase;\r
        }\r
@@ -77,7 +96,7 @@ public class WorkingSet2 {
 \r
        /**\r
         * パーツカラーマップ\r
-        * \r
+        *\r
         * @return キーはカテゴリid, 値は、パーツ名をキーとしレイヤーごとのカラー情報のリストを値とするマップ\r
         */\r
        public Map<String, Map<String, List<IndependentPartsColorInfo>>> getPartsColorMap() {\r
@@ -116,6 +135,30 @@ public class WorkingSet2 {
                return wallpaperInfo;\r
        }\r
 \r
+       public Double getZoomFactor() {\r
+               return zoomFactor;\r
+       }\r
+\r
+       public void setZoomFactor(Double zoomFactor) {\r
+               this.zoomFactor = zoomFactor;\r
+       }\r
+\r
+       public Point getViewPosition() {\r
+               return viewPosition;\r
+       }\r
+\r
+       public void setViewPosition(Point viewPosition) {\r
+               this.viewPosition = viewPosition;\r
+       }\r
+\r
+       public Rectangle getWindowRect() {\r
+               return windowRect;\r
+       }\r
+\r
+       public void setWindowRect(Rectangle windowRect) {\r
+               this.windowRect = windowRect;\r
+       }\r
+\r
        public IndependentPartsSetInfo getCurrentPartsSet() {\r
                return currentPartsSet;\r
        }\r
@@ -135,7 +178,7 @@ public class WorkingSet2 {
        /**\r
         * キャラクターデータを指定して、指定されたキャラクターデータ上のインスタンスと関連づけられた\r
         * カテゴリおよびパーツ名などのインスタンスで構成されるパーツ識別名とカラー情報を、 引数で指定したマップに出力する.\r
-        * \r
+        *\r
         * @param characterData\r
         *            キャラクターデータ\r
         * @param partsColorInfoMap\r
index 1be0120..1194ea1 100644 (file)
@@ -1,9 +1,11 @@
 package charactermanaj.model.io;\r
 \r
-import static charactermanaj.util.XMLUtilities.getChildElements;\r
-import static charactermanaj.util.XMLUtilities.getElementText;\r
+import static charactermanaj.util.XMLUtilities.*;\r
 \r
 import java.awt.Color;\r
+import java.awt.Dimension;\r
+import java.awt.Point;\r
+import java.awt.Rectangle;\r
 import java.io.File;\r
 import java.io.IOException;\r
 import java.io.InputStream;\r
@@ -27,7 +29,7 @@ import charactermanaj.util.XMLUtilities;
 \r
 /**\r
  * ワーキングセットのXMLデータを読み込む.<br>\r
- * \r
+ *\r
  * @author seraphy\r
  */\r
 public class WorkingSetXMLReader {\r
@@ -45,7 +47,7 @@ public class WorkingSetXMLReader {
 \r
        /**\r
         * XMLコンテンツに対する入力ストリームからワーキングセットを取り出す.<br>\r
-        * \r
+        *\r
         * @param is\r
         *            入力ストリーム\r
         * @throws IOException\r
@@ -60,7 +62,7 @@ public class WorkingSetXMLReader {
                WorkingSet2 workingSet = new WorkingSet2();\r
 \r
                CharacterDataXMLReader characterDataXMLReader = new CharacterDataXMLReader();\r
-               \r
+\r
                Document doc = XMLUtilities.loadDocument(is);\r
 \r
                String lang = Locale.getDefault().getLanguage();\r
@@ -166,6 +168,42 @@ public class WorkingSetXMLReader {
                        }\r
                        workingSet.setWallpaperInfo(wallpaperInfo);\r
 \r
+                       // ズーム等情報\r
+                       for (Element viewElm : getChildElements(docElm, "view")) {\r
+                               String strZoomFactor = viewElm.getAttribute("zoomFactor");\r
+                               String strCenterX = viewElm.getAttribute("x");\r
+                               String strCenterY = viewElm.getAttribute("y");\r
+                               if (strZoomFactor != null && strZoomFactor.trim().length() > 0) {\r
+                                       double zoomFactor = Double.parseDouble(strZoomFactor.trim());\r
+                                       workingSet.setZoomFactor(zoomFactor);\r
+                               }\r
+                               if (strCenterX != null && strCenterY != null && strCenterX.trim().length() > 0\r
+                                               && strCenterY.trim().length() > 0) {\r
+                                       double centerX = Double.parseDouble(strCenterX.trim());\r
+                                       double centerY = Double.parseDouble(strCenterY.trim());\r
+                                       Point centerPt = new Point((int) centerX, (int) centerY);\r
+                                       workingSet.setViewPosition(centerPt);\r
+                               }\r
+\r
+                               for (Element windowElm : getChildElements(viewElm, "window")) {\r
+                                       String x = windowElm.getAttribute("x");\r
+                                       String y = windowElm.getAttribute("y");\r
+                                       String width = windowElm.getAttribute("width");\r
+                                       String height = windowElm.getAttribute("height");\r
+                                       if (x != null && y != null && width != null && height != null && x.trim().length() > 0\r
+                                                       && y.trim().length() > 0 && width.trim().length() > 0 && height.trim().length() > 0) {\r
+                                               Point pt = new Point(Integer.parseInt(x.trim()), Integer.parseInt(y.trim()));\r
+                                               Dimension dim = new Dimension(Integer.parseInt(width.trim()), Integer.parseInt(height.trim()));\r
+                                               Rectangle windowRect = new Rectangle(pt, dim);\r
+                                               workingSet.setWindowRect(windowRect);\r
+                                       }\r
+                                       break; // windowElmは最初の一要素しか想定しない.\r
+                               }\r
+\r
+                               break; // viewElmは最初の一要素しか想定しない.\r
+                       }\r
+\r
+\r
                        // 現在のパーツ情報\r
                        for (Element currentPartsSetsElm : getChildElements(docElm,\r
                                        "currentPartsSet")) {\r
@@ -203,7 +241,7 @@ public class WorkingSetXMLReader {
 \r
        /**\r
         * 壁紙情報を読み込む\r
-        * \r
+        *\r
         * @param elm\r
         *            壁紙要素\r
         * @return 壁紙情報、elmがnullの場合はnullを返す.\r
index d05d81e..be26990 100644 (file)
@@ -1,6 +1,8 @@
 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
@@ -38,7 +40,7 @@ import charactermanaj.ui.model.WallpaperInfo.WallpaperResourceType;
  * WorkingSetのXMLへの書き込み\r
  */\r
 public class WorkingSetXMLWriter {\r
-       \r
+\r
        /**\r
         * WorkingSetのバージョン\r
         */\r
@@ -57,7 +59,7 @@ public class WorkingSetXMLWriter {
 \r
        /**\r
         * ワーキングセットをXML表現で出力ストリームに出力します.<br>\r
-        * \r
+        *\r
         * @param ws\r
         *            ワーキングセット\r
         * @param outstm\r
@@ -69,7 +71,7 @@ public class WorkingSetXMLWriter {
                if (ws == null || outstm == null) {\r
                        throw new IllegalArgumentException();\r
                }\r
-               \r
+\r
                Document doc = createWorkingSetXML(ws);\r
 \r
                // output xml\r
@@ -97,10 +99,10 @@ public class WorkingSetXMLWriter {
                        throw ex2;\r
                }\r
        }\r
-       \r
+\r
        /**\r
         * ワーキングセットのXMLドキュメントを生成します.\r
-        * \r
+        *\r
         * @param ws\r
         *            ワーキングセット\r
         * @return XMLドキュメント\r
@@ -128,15 +130,15 @@ public class WorkingSetXMLWriter {
                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
@@ -150,64 +152,67 @@ public class WorkingSetXMLWriter {
 \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
@@ -228,7 +233,7 @@ public class WorkingSetXMLWriter {
                                        }\r
                                }\r
                        }\r
-                       \r
+\r
                        // すべてのカラー設定を出力する.\r
                        Element colorsElm = doc.createElementNS(NS, "colors");\r
                        for (Map.Entry<PartsColorInfo, String> colorMapEntry : colorMap.entrySet()) {\r
@@ -239,7 +244,7 @@ public class WorkingSetXMLWriter {
                                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
@@ -262,10 +267,10 @@ public class WorkingSetXMLWriter {
                }\r
                return partsColorInfoMapElm;\r
        }\r
-       \r
+\r
        /**\r
         * 壁紙情報をXML要素として生成する.\r
-        * \r
+        *\r
         * @param doc\r
         *            XML要素のファクトリ\r
         * @param wallpaperInfo\r
@@ -274,7 +279,7 @@ public class WorkingSetXMLWriter {
         */\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
@@ -284,7 +289,7 @@ public class WorkingSetXMLWriter {
                        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
@@ -294,7 +299,7 @@ public class WorkingSetXMLWriter {
                                resElm.setTextContent(res);\r
                        }\r
                        elm.appendChild(resElm);\r
-                       \r
+\r
                        // ファイル\r
                        File file = wallpaperInfo.getFile();\r
                        Element fileElm = doc.createElementNS(NS, "file");\r
@@ -304,21 +309,51 @@ public class WorkingSetXMLWriter {
                                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
index 2223dc9..9eecc4e 100644 (file)
@@ -403,26 +403,6 @@ public class MainFrame extends JFrame
                        CharacterDataChangeObserver.getDefault()\r
                                        .addCharacterDataChangeListener(this);\r
 \r
-                       // メインスクリーンサイズを取得する.\r
-                       GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();\r
-                       Rectangle desktopSize = genv.getMaximumWindowBounds(); // メインスクリーンのサイズ(デスクトップ領域のみ)\r
-                       logger.log(Level.CONFIG, "desktopSize=" + desktopSize);\r
-\r
-                       Dimension imageSize = characterData.getImageSize();\r
-                       // 画像サイズ300x400を基準サイズとして、それ以下にはならない.\r
-                       // アプリケーション設定の最大サイズ以上の場合はウィンドウサイズは固定してスクロールバーに任せる\r
-                       AppConfig appConfig = AppConfig.getInstance();\r
-                       int maxWidth = min(desktopSize.width, appConfig.getMainFrameMaxWidth());\r
-                       int maxHeight = min(desktopSize.height, appConfig.getMainFrameMaxHeight());\r
-                       int imageWidth = min(maxWidth, max(300, imageSize != null ? imageSize.width : 0));\r
-                       int imageHeight = min(maxHeight, max(400, imageSize != null ? imageSize.height : 0));\r
-                       // 300x400の画像の場合にメインフレームが600x550だとちょうどいい感じ.\r
-                       // それ以上大きい画像の場合は増えた分だけフレームを大きくしておく.\r
-                       setSize(imageWidth - 300 + 600, imageHeight - 400 + 550);\r
-\r
-                       // 次回表示時にプラットフォーム固有位置に表示するように予約\r
-                       setLocationByPlatform(true);\r
-\r
                } catch (RuntimeException ex) {\r
                        logger.log(Level.SEVERE, "メインフレームの構築中に予期せぬ例外が発生しました。", ex);\r
                        dispose(); // コンストラクタが呼ばれた時点でJFrameは構築済みなのでdisposeの必要がある.\r
@@ -435,6 +415,31 @@ public class MainFrame extends JFrame
        }\r
 \r
        /**\r
+        * デフォルトのウィンドウ位置とサイズの設定\r
+        */\r
+       private void setDefaultWindowLocation() {\r
+               // メインスクリーンサイズを取得する.\r
+               GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();\r
+               Rectangle desktopSize = genv.getMaximumWindowBounds(); // メインスクリーンのサイズ(デスクトップ領域のみ)\r
+               logger.log(Level.CONFIG, "desktopSize=" + desktopSize);\r
+\r
+               Dimension imageSize = characterData.getImageSize();\r
+               // 画像サイズ300x400を基準サイズとして、それ以下にはならない.\r
+               // アプリケーション設定の最大サイズ以上の場合はウィンドウサイズは固定してスクロールバーに任せる\r
+               AppConfig appConfig = AppConfig.getInstance();\r
+               int maxWidth = min(desktopSize.width, appConfig.getMainFrameMaxWidth());\r
+               int maxHeight = min(desktopSize.height, appConfig.getMainFrameMaxHeight());\r
+               int imageWidth = min(maxWidth, max(300, imageSize != null ? imageSize.width : 0));\r
+               int imageHeight = min(maxHeight, max(400, imageSize != null ? imageSize.height : 0));\r
+               // 300x400の画像の場合にメインフレームが600x550だとちょうどいい感じ.\r
+               // それ以上大きい画像の場合は増えた分だけフレームを大きくしておく.\r
+               setSize(imageWidth - 300 + 600, imageHeight - 400 + 550);\r
+\r
+               // 次回表示時にプラットフォーム固有位置に表示するように予約\r
+               setLocationByPlatform(true);\r
+       }\r
+\r
+       /**\r
         * メインフレームを表示する.<br>\r
         * デスクトップ領域からはみ出した場合は位置を補正する.<br>\r
         */\r
@@ -1532,7 +1537,7 @@ public class MainFrame extends JFrame
        }\r
 \r
        /**\r
-        * ã\83\97ã\83ªビューしている画像をファイルに保存する。 サポートしているのはPNG/JPEGのみ。\r
+        * ã\83\97ã\83¬ビューしている画像をファイルに保存する。 サポートしているのはPNG/JPEGのみ。\r
         */\r
        protected void onSavePicture() {\r
                Toolkit tk = Toolkit.getDefaultToolkit();\r
@@ -2018,6 +2023,14 @@ public class MainFrame extends JFrame
                                        .setCharacterData(characterData.duplicateBasicInfo(false)); // パーツセットは保存しない.\r
                        workingSet.setWallpaperInfo(wallpaperInfo);\r
 \r
+                       workingSet.setZoomFactor(previewPane.getZoomFactor());\r
+                       workingSet.setViewPosition(previewPane.getViewPosition());\r
+\r
+                       Dimension windowSize = getSize();\r
+                       Point windowPos = getLocation();\r
+                       Rectangle windowRect = new Rectangle(windowPos, windowSize);\r
+                       workingSet.setWindowRect(windowRect);\r
+\r
                        // XML形式でのワーキングセットの保存\r
                        WorkingSetPersist workingSetPersist = WorkingSetPersist\r
                                        .getInstance();\r
@@ -2047,6 +2060,31 @@ public class MainFrame extends JFrame
                                return false;\r
                        }\r
 \r
+                       AppConfig appConfig = AppConfig.getInstance();\r
+                       Rectangle windowRect = workingSet2.getWindowRect();\r
+                       if (appConfig.isEnableRestoreWindow() && windowRect != null) {\r
+                               // 位置の復元\r
+                               GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();\r
+                               Rectangle desktopSize = genv.getMaximumWindowBounds(); // メインスクリーンのサイズ(デスクトップ領域のみ)\r
+                               Point windowPos = windowRect.getLocation();\r
+                               if (desktopSize.contains(windowPos)) {\r
+                                       setLocation(windowPos);\r
+                               }\r
+\r
+                               // サイズの復元\r
+                               Dimension dim = windowRect.getSize();\r
+                               if (dim.width < 100) {\r
+                                       dim.width = 100;\r
+                               }\r
+                               if (dim.height < 100) {\r
+                                       dim.height = 100;\r
+                               }\r
+                               setSize(dim);\r
+                       } else {\r
+                               // デフォルトのウィンドウ位置とサイズ\r
+                               setDefaultWindowLocation();\r
+                       }\r
+\r
                        URI docBase = characterData.getDocBase();\r
                        if (docBase != null\r
                                        && !docBase.equals(workingSet2.getCharacterDocBase())) {\r
@@ -2100,6 +2138,17 @@ public class MainFrame extends JFrame
                                // (適用に失敗した場合はエラーは無視し、壁紙情報は保存しない.)\r
                                applyWallpaperInfo(wallpaperInfo, true);\r
                        }\r
+\r
+                       // ズーム状態を復元する\r
+                       Double zoomFactor = workingSet2.getZoomFactor();\r
+                       if (appConfig.isEnableRestoreWindow() && zoomFactor != null) {\r
+                               previewPane.setZoomFactor(zoomFactor);\r
+                               final Point viewPosition = workingSet2.getViewPosition();\r
+                               if (viewPosition != null) {\r
+                                       previewPane.setViewPosition(viewPosition);\r
+                               }\r
+                       }\r
+\r
                        return true;\r
 \r
                } catch (Exception ex) {\r
index 0e33839..8c48b17 100644 (file)
@@ -1,13 +1,6 @@
 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
@@ -82,7 +75,7 @@ import charactermanaj.util.UIHelper;
 \r
 /**\r
  * プレビューパネル\r
- * \r
+ *\r
  * @author seraphy\r
  */\r
 public class PreviewPanel extends JPanel {\r
@@ -94,49 +87,49 @@ public class PreviewPanel extends JPanel {
 \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
@@ -146,17 +139,17 @@ public class PreviewPanel extends JPanel {
         * ロード中を示すインジケータ\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
@@ -164,7 +157,7 @@ public class PreviewPanel extends JPanel {
                        timer.start();\r
                }\r
        }\r
-       \r
+\r
        @Override\r
        public void removeNotify() {\r
                if (timer.isRunning()) {\r
@@ -172,11 +165,11 @@ public class PreviewPanel extends JPanel {
                }\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
@@ -187,61 +180,61 @@ public class PreviewPanel extends JPanel {
                        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
@@ -283,7 +276,7 @@ public class PreviewPanel extends JPanel {
                                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
@@ -291,7 +284,7 @@ public class PreviewPanel extends JPanel {
                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
@@ -313,14 +306,14 @@ public class PreviewPanel extends JPanel {
                                }\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
@@ -334,31 +327,31 @@ public class PreviewPanel extends JPanel {
 \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
@@ -366,7 +359,7 @@ public class PreviewPanel extends JPanel {
                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
@@ -394,7 +387,7 @@ public class PreviewPanel extends JPanel {
                                }\r
                        }\r
                });\r
-               \r
+\r
                previewImgScrollPane.addMouseMotionListener(new MouseMotionAdapter() {\r
                        @Override\r
                        public void mouseMoved(MouseEvent e) {\r
@@ -414,8 +407,8 @@ public class PreviewPanel extends JPanel {
                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
@@ -429,7 +422,7 @@ public class PreviewPanel extends JPanel {
                                updateCheckInfoMessage(e.getPoint());\r
                        }\r
                });\r
-               \r
+\r
                previewImgScrollPane.addMouseListener(new MouseAdapter() {\r
                        @Override\r
                        public void mousePressed(MouseEvent e) {\r
@@ -446,13 +439,13 @@ public class PreviewPanel extends JPanel {
                                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
@@ -461,7 +454,7 @@ public class PreviewPanel extends JPanel {
                        }\r
                });\r
        }\r
-       \r
+\r
        /**\r
         * 倍率を切り替える.\r
         */\r
@@ -480,7 +473,7 @@ public class PreviewPanel extends JPanel {
 \r
        /**\r
         * マウス位置に対して画像情報のツールチップを表示する\r
-        * \r
+        *\r
         * @param mousePosition\r
         *            マウス位置\r
         */\r
@@ -514,10 +507,10 @@ public class PreviewPanel extends JPanel {
                        checkInfoLayerPanel.setMessage(null);\r
                }\r
        }\r
-       \r
+\r
        /**\r
         * マウス座標単位で指定したオフセット分スクロールする.\r
-        * \r
+        *\r
         * @param diff_x\r
         *            水平方向スクロール数\r
         * @param diff_y\r
@@ -526,11 +519,11 @@ public class PreviewPanel extends JPanel {
        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
@@ -545,7 +538,7 @@ public class PreviewPanel extends JPanel {
         * ホイールによる拡大縮小.<br>\r
         * ホイールの量は関係なく、方向だけで判定する.<br>\r
         * プラットフォームごとに修飾キーの判定が異なるので、 呼び出しもとであらかじめ切り分けて呼び出すこと.<br>\r
-        * \r
+        *\r
         * @param e\r
         *            ホイールイベント\r
         */\r
@@ -560,23 +553,23 @@ public class PreviewPanel extends JPanel {
                } 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
@@ -584,7 +577,7 @@ public class PreviewPanel extends JPanel {
         * (スクロールバーが表示されていない、もしくは十分にスクロールできない場合は必ずしも中心とはならない.)<br>\r
         * コントロールパネルの表示値も更新する.<br>\r
         * コントロールパネルからの更新通知をうけて再入しないように、 同時に一つしか実行されないようにしている.<br>\r
-        * \r
+        *\r
         * @param zoomFactor\r
         *            倍率、範囲外のものは範囲内に補正される.\r
         * @param mousePos\r
@@ -620,11 +613,11 @@ public class PreviewPanel extends JPanel {
 \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
@@ -650,16 +643,16 @@ public class PreviewPanel extends JPanel {
                                // また、画像は縦横同率であるが表示ウィンドウはスクロールバー有無により同率とは限らない.\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
@@ -675,10 +668,38 @@ public class PreviewPanel extends JPanel {
                        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
@@ -692,11 +713,11 @@ public class PreviewPanel extends JPanel {
                        lblTitle.setToolTipText(title);\r
                }\r
        }\r
-       \r
+\r
        public String getTitle() {\r
                return this.title;\r
        }\r
-       \r
+\r
        /**\r
         * ロードに時間がかかっているか判定し、 インジケータを表示するためのタイマーイベントハンドラ.<br>\r
         */\r
@@ -713,11 +734,11 @@ public class PreviewPanel extends JPanel {
                        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
@@ -729,7 +750,7 @@ public class PreviewPanel extends JPanel {
        /**\r
         * ロード要求が出されるたびに、そのロード要求チケットを登録する.<br>\r
         * チケットは要求されるたびに増加するシーケンスとする.<br>\r
-        * \r
+        *\r
         * @param ticket\r
         *            ロード要求チケット\r
         */\r
@@ -744,10 +765,10 @@ public class PreviewPanel extends JPanel {
                        this.loadingTicket = ticket;\r
                }\r
        }\r
-       \r
+\r
        /**\r
         * ロード完了するたびに呼び出される.<br>\r
-        * \r
+        *\r
         * @param ticket\r
         *            ロード要求チケット.\r
         */\r
@@ -759,27 +780,31 @@ public class PreviewPanel extends JPanel {
 \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
@@ -789,65 +814,65 @@ public class PreviewPanel extends JPanel {
                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
@@ -860,23 +885,23 @@ public class PreviewPanel extends JPanel {
                }\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
@@ -904,12 +929,12 @@ public class PreviewPanel extends JPanel {
 \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
@@ -919,67 +944,67 @@ class CheckInfoLayerPanel extends JPanel {
         * ボックスの余白\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
@@ -997,7 +1022,7 @@ class CheckInfoLayerPanel extends JPanel {
                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
@@ -1019,7 +1044,7 @@ class CheckInfoLayerPanel extends JPanel {
                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
@@ -1027,7 +1052,7 @@ class CheckInfoLayerPanel extends JPanel {
                        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
@@ -1051,7 +1076,7 @@ class CheckInfoLayerPanel extends JPanel {
                        calcRepaint();\r
                }\r
        }\r
-       \r
+\r
        /**\r
         * 要求されたプロパティから、フォント高さによる表示領域を計算し、 その領域の再描画を要求する.(描画する内容がなれば、描画要求しない.)<br>\r
         * 前回表示領域があれば、消去するために、そのエリアも再描画を要求する.<br>\r
@@ -1070,7 +1095,7 @@ class CheckInfoLayerPanel extends JPanel {
                        if (eraseRect != null && !eraseRect.isEmpty()) {\r
                                repaint(eraseRect);\r
                        }\r
-                       \r
+\r
                        // 空であれば新たな描画なし.\r
                        if (message.length() == 0) {\r
                                requestRect = null;\r
@@ -1079,7 +1104,7 @@ class CheckInfoLayerPanel extends JPanel {
 \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
@@ -1090,21 +1115,21 @@ class CheckInfoLayerPanel extends JPanel {
                                        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
@@ -1116,21 +1141,21 @@ class CheckInfoLayerPanel extends JPanel {
                        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
@@ -1139,14 +1164,14 @@ class CheckInfoLayerPanel extends JPanel {
                        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
@@ -1167,7 +1192,7 @@ class CheckInfoLayerPanel extends JPanel {
 \r
 /**\r
  * 画像表示パネル\r
- * \r
+ *\r
  * @author seraphy\r
  */\r
 class PreviewImagePanel extends JPanel {\r
@@ -1177,47 +1202,47 @@ class PreviewImagePanel extends JPanel {
         * 背景モード.<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
@@ -1233,12 +1258,12 @@ class PreviewImagePanel extends JPanel {
                                onChangeWallpaper();\r
                        }\r
                };\r
-               \r
+\r
                // 壁紙\r
                wallpaper = new Wallpaper();\r
                wallpaper.addPropertyChangeListener(wallpaperListener);\r
        }\r
-       \r
+\r
        /**\r
         * 画像を表示する.\r
         */\r
@@ -1254,7 +1279,7 @@ class PreviewImagePanel extends JPanel {
                // 倍率を適用した画像を画面の中央に配置できるように計算する.\r
                // (画像が倍率適用済みであれば1倍とする)\r
                Rectangle imgRct = adjustImageRectangle();\r
-               \r
+\r
                // 表示用画像がスケール済みでない場合はレンダリングオプションを適用する.\r
                if (scaledZoomFactor == null) {\r
                        Object renderingOption = getRenderingOption();\r
@@ -1268,7 +1293,7 @@ class PreviewImagePanel extends JPanel {
                        int h = getHeight();\r
                        wallpaper.drawWallpaper(g, w, h);\r
                }\r
-               \r
+\r
                // レンダリング\r
                g.drawImage(previewImgForDraw,\r
                                imgRct.x, imgRct.y,\r
@@ -1285,7 +1310,7 @@ class PreviewImagePanel extends JPanel {
                        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
@@ -1296,7 +1321,7 @@ class PreviewImagePanel extends JPanel {
        /**\r
         * グリッドを描画する.<br>\r
         * 開始位置の-1単位位置から画像サイズの+1単位までがグリッド範囲となる。\r
-        * \r
+        *\r
         * @param g\r
         * @param offset_x\r
         *            開始位置\r
@@ -1307,16 +1332,16 @@ class PreviewImagePanel extends JPanel {
         */\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
@@ -1326,11 +1351,11 @@ class PreviewImagePanel extends JPanel {
                                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
@@ -1339,10 +1364,10 @@ class PreviewImagePanel extends JPanel {
                        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
@@ -1363,21 +1388,21 @@ class PreviewImagePanel extends JPanel {
                                // 拡大する場合でバイキュービックをサポートしている場合\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
@@ -1386,13 +1411,13 @@ class PreviewImagePanel extends JPanel {
                }\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
@@ -1401,14 +1426,14 @@ class PreviewImagePanel extends JPanel {
                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
@@ -1425,22 +1450,22 @@ class PreviewImagePanel extends JPanel {
                        // 範囲外であれば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
@@ -1450,25 +1475,25 @@ class PreviewImagePanel extends JPanel {
                        // プレビュー画像が設定されていなければ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
@@ -1484,7 +1509,7 @@ class PreviewImagePanel extends JPanel {
                        return 0; // 範囲外\r
                }\r
        }\r
-       \r
+\r
        /**\r
         * 倍率を適用した画像パネルのサイズを計算し適用する.<br>\r
         * モードにより余白が加えられる.<br>\r
@@ -1502,7 +1527,7 @@ class PreviewImagePanel extends JPanel {
         * 元画像が設定されていなければnull.<br>\r
         * needOffsetがfalseであれば表示モードに関わらず、画像の拡大・縮小後の純粋なサイズ、\r
         * trueであれば余白が必要な表示モードの場合の余白が付与された場合のサイズが返される.<br>\r
-        * \r
+        *\r
         * @param needOffset\r
         *            余白を加味したサイズが必要な場合はtrue\r
         * @return 倍率適用後のサイズ、もしくはnull\r
@@ -1516,7 +1541,7 @@ class PreviewImagePanel extends JPanel {
 \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
@@ -1527,33 +1552,33 @@ class PreviewImagePanel extends JPanel {
                        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
@@ -1573,18 +1598,18 @@ class PreviewImagePanel extends JPanel {
                        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
@@ -1616,7 +1641,7 @@ class PreviewImagePanel extends JPanel {
                        // すでに作成済みの画像が使用できる.\r
                        img = previewImgForDraw;\r
                }\r
-               \r
+\r
                // レンダリングオプション\r
                Object renderingOption = getRenderingOption();\r
 \r
@@ -1635,19 +1660,19 @@ class PreviewImagePanel extends JPanel {
                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
@@ -1655,11 +1680,11 @@ class PreviewImagePanel extends JPanel {
                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
@@ -1681,14 +1706,14 @@ class PreviewImagePanel extends JPanel {
                        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
@@ -1698,12 +1723,12 @@ class PreviewImagePanel extends JPanel {
 \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
@@ -1712,7 +1737,7 @@ class PreviewControlPanel extends JPanel {
         * ピン留めチェックボックス\r
         */\r
        private JCheckBox chkPinning;\r
-       \r
+\r
        /**\r
         * アルファ確認チェックボックス\r
         */\r
@@ -1727,48 +1752,48 @@ class PreviewControlPanel extends JPanel {
         * 倍率用スライダ\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
@@ -1778,11 +1803,11 @@ class PreviewControlPanel extends JPanel {
        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
@@ -1790,11 +1815,11 @@ class PreviewControlPanel extends JPanel {
        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
@@ -1802,21 +1827,21 @@ class PreviewControlPanel extends JPanel {
        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
@@ -1835,12 +1860,12 @@ class PreviewControlPanel extends JPanel {
                                        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
@@ -1849,7 +1874,7 @@ class PreviewControlPanel extends JPanel {
                                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
@@ -1859,17 +1884,17 @@ class PreviewControlPanel extends JPanel {
                                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
@@ -1892,7 +1917,7 @@ class PreviewControlPanel extends JPanel {
 \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
@@ -1904,7 +1929,7 @@ class PreviewControlPanel extends JPanel {
                        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
@@ -1931,7 +1956,7 @@ class PreviewControlPanel extends JPanel {
                                }\r
                        });\r
                }\r
-               \r
+\r
                // スライダを変更することによりコンボボックスを変更する、\r
                // もしくはコンボボックスを変更することでスライダを変更するが、\r
                // 互いに通知を呼び合うことになるため他方を無視するためのセマフォ\r
@@ -1952,7 +1977,7 @@ class PreviewControlPanel extends JPanel {
                                                zoomFactorInt = zoomRanges[1];\r
                                                adjusted = true;\r
                                        }\r
-                                       \r
+\r
                                } catch (RuntimeException ex) {\r
                                        zoomFactorInt = 100;\r
                                        adjusted = true;\r
@@ -1965,7 +1990,7 @@ class PreviewControlPanel extends JPanel {
                                if (changeLock.tryAcquire()) {\r
                                        try {\r
                                                zoomSlider.setValue(zoomFactorToIndex(zoomFactorInt / 100.));\r
-                                               \r
+\r
                                        } finally {\r
                                                changeLock.release();\r
                                        }\r
@@ -1973,7 +1998,7 @@ class PreviewControlPanel extends JPanel {
                                fireZoomFactorChange(zoomFactorInt);\r
                        }\r
                });\r
-               \r
+\r
                zoomSlider.addChangeListener(new ChangeListener() {\r
                        public void stateChanged(ChangeEvent e) {\r
                                int index = zoomSlider.getValue();\r
@@ -1983,7 +2008,7 @@ class PreviewControlPanel extends JPanel {
                                if (changeLock.tryAcquire()) {\r
                                        try {\r
                                                zoomCombo.setSelectedItem(Integer.toString(zoomFactorInt));\r
-                                               \r
+\r
                                        } finally {\r
                                                changeLock.release();\r
                                        }\r
@@ -1993,10 +2018,10 @@ class PreviewControlPanel extends JPanel {
                });\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
@@ -2009,9 +2034,9 @@ class PreviewControlPanel extends JPanel {
                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
@@ -2026,7 +2051,7 @@ class PreviewControlPanel extends JPanel {
                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
@@ -2039,17 +2064,17 @@ class PreviewControlPanel extends JPanel {
                        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
@@ -2071,7 +2096,7 @@ class PreviewControlPanel extends JPanel {
                ranges.add(Integer.valueOf(100)); // 等倍は常に設定する.\r
                return new ArrayList<Integer>(ranges);\r
        }\r
-       \r
+\r
        /**\r
         * 倍率が変更されたことを通知する.\r
         */\r
@@ -2082,9 +2107,9 @@ class PreviewControlPanel extends JPanel {
                        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
@@ -2098,11 +2123,11 @@ class PreviewControlPanel extends JPanel {
                        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
@@ -2122,18 +2147,18 @@ class PreviewControlPanel extends JPanel {
                        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
index 0cc2c64..0047298 100644 (file)
@@ -43,11 +43,11 @@ public class ScrollPaneDragScrollSupport {
                        throw new IllegalArgumentException();\r
                }\r
                this.scrollPane = scrollPane;\r
-               \r
+\r
                AppConfig appConfig = AppConfig.getInstance();\r
                wheelDivider = Math.max(2, appConfig.getWheelScrollUnit());\r
        }\r
-       \r
+\r
        /**\r
         * ドラッグ開始位置を示す.<br>\r
         * スクロールが調整されるたびに新しい座標にセットし直す.<br>\r
@@ -81,7 +81,7 @@ public class ScrollPaneDragScrollSupport {
        public Point getDragPt() {\r
                return dragPt;\r
        }\r
-       \r
+\r
        /**\r
         * 現在ドラッグ中であるか?\r
         * @return ドラッグ中であればtrue\r
@@ -89,7 +89,7 @@ public class ScrollPaneDragScrollSupport {
        public boolean isDragging() {\r
                return dragPt != null;\r
        }\r
-       \r
+\r
        /**\r
         * カーソルを設定する.\r
         * @param cursor カーソル\r
@@ -97,7 +97,7 @@ public class ScrollPaneDragScrollSupport {
        protected void setCursor(Cursor cursor) {\r
                scrollPane.setCursor(cursor);\r
        }\r
-       \r
+\r
        /**\r
         * ドラッグの開始または終了を行う.<br>\r
         * すでに開始済みで開始要求するか、開始されておらず停止要求した場合は何もしない.<br>\r
@@ -116,7 +116,7 @@ public class ScrollPaneDragScrollSupport {
                                        dragPt = null;\r
                                        return;\r
                                }\r
-                               \r
+\r
                                // ドラッグ中であることを示す\r
                                dragPt = mousePt;\r
                                setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));\r
@@ -130,7 +130,7 @@ public class ScrollPaneDragScrollSupport {
                        dragPt = null;\r
                }\r
        }\r
-       \r
+\r
        /**\r
         * マウスによるドラッグによるスクロール.<br>\r
         * 前回位置(初回なら開始位置)との差分からスクロール量を判定する.<br>\r
@@ -141,13 +141,13 @@ public class ScrollPaneDragScrollSupport {
                        // 前回値がないか今回値がない場合は何もしない.\r
                        return;\r
                }\r
-               \r
+\r
                // 前回座標との差分を求める\r
                int diff_x = dragPt.x - mousePt.x;\r
                int diff_y = dragPt.y - mousePt.y;\r
-               \r
+\r
                scroll(diff_x, diff_y);\r
-               \r
+\r
                // 現在位置を記録\r
                dragPt = mousePt;\r
        }\r
@@ -165,18 +165,18 @@ public class ScrollPaneDragScrollSupport {
                JViewport vp = scrollPane.getViewport();\r
                Dimension viewSize = vp.getViewSize();\r
                Dimension visibleSize = vp.getExtentSize();\r
-               \r
+\r
                Point vpt = vp.getViewPosition();\r
-               \r
+\r
                vpt.x += diff_x;\r
                if (vpt.x < 0) {\r
                        vpt.x = 0;\r
-               \r
+\r
                } else if (vpt.x + visibleSize.width > viewSize.width) {\r
                        // はみ出た分を引く\r
                        vpt.x -= (vpt.x + visibleSize.width - viewSize.width);\r
                }\r
-               \r
+\r
                vpt.y += diff_y;\r
                if (vpt.y < 0) {\r
                        vpt.y = 0;\r
@@ -185,10 +185,10 @@ public class ScrollPaneDragScrollSupport {
                        // はみ出た分を引く\r
                        vpt.y -= (vpt.y + visibleSize.height - viewSize.height);\r
                }\r
-               \r
+\r
                vp.setViewPosition(vpt);\r
        }\r
-       \r
+\r
        /**\r
         * ホイールによるスクロール量の分割数.<br>\r
         * 表示されている領域に対してn等分割したサイズを\r
@@ -198,7 +198,7 @@ public class ScrollPaneDragScrollSupport {
        public int getWheelDivider() {\r
                return wheelDivider;\r
        }\r
-       \r
+\r
        public void setWheelFactor(int wheelDivider) {\r
                this.wheelDivider = Math.max(2, wheelDivider);\r
        }\r
@@ -217,10 +217,10 @@ public class ScrollPaneDragScrollSupport {
                Dimension visibleSize = vp.getExtentSize();\r
 \r
                int rotation = e.getWheelRotation();\r
-                               \r
+\r
                int diff_x = 0;\r
                int diff_y = 0;\r
-               \r
+\r
                if (e.isShiftDown()) {\r
                        // 水平スクロール\r
                        int unit = visibleSize.width / getWheelDivider();\r
@@ -231,31 +231,31 @@ public class ScrollPaneDragScrollSupport {
                        int unit = visibleSize.height / getWheelDivider();\r
                        diff_y = rotation * unit;\r
                }\r
-               \r
+\r
                scroll(diff_x, diff_y);\r
        }\r
-       \r
-       \r
+\r
+\r
        /**\r
         * セットアップしたリスナを保存するもの\r
         */\r
        private MouseListener mouseListener;\r
-       \r
+\r
        /**\r
         * セットアップしたリスナを保存するもの\r
         */\r
        private MouseMotionListener mouseMotionListener;\r
-       \r
+\r
        /**\r
         * セットアップしたリスナを保存するもの\r
         */\r
        private MouseWheelListener mouseWheelListener;\r
-       \r
+\r
        /**\r
         * リスナをセットアップしたコンポーネント\r
         */\r
        private JComponent installTarget;\r
-       \r
+\r
        /**\r
         * ドラッグの開始に相応しいボタンプレスであるか判定するためのインターフェイス.\r
         * @author seraphy\r
@@ -268,10 +268,10 @@ public class ScrollPaneDragScrollSupport {
                 * @return ドラッグを開始しても良い場合はtrue\r
                 */\r
                boolean isDraggable(MouseEvent e);\r
-               \r
+\r
        }\r
-       \r
-       \r
+\r
+\r
        /**\r
         * マウスによるドラッグをサポートする、一般的なマウスリスナとマウスモーションリスナをセットアップする.<br>\r
         * すでに登録済みであれば何もしない.<br>\r
@@ -319,7 +319,7 @@ public class ScrollPaneDragScrollSupport {
                        // リスナを登録する.\r
                        comp.addMouseMotionListener(mouseMotionListener);\r
                }\r
-               \r
+\r
                if (mouseWheelListener == null) {\r
                        mouseWheelListener = new MouseWheelListener() {\r
                                public void mouseWheelMoved(MouseWheelEvent e) {\r
@@ -332,10 +332,10 @@ public class ScrollPaneDragScrollSupport {
                        // リスナを登録する.\r
                        comp.addMouseWheelListener(mouseWheelListener);\r
                }\r
-               \r
+\r
                installTarget = comp;\r
        }\r
-       \r
+\r
        /**\r
         * セットアップしたリスナを解除する.<br>\r
         * 登録されていない場合は何もしない.<br>\r
index f321cd3..3ea0db7 100644 (file)
@@ -41,6 +41,7 @@ If the file already exists, the file is overwritten.]]></entry>
 <entry key="wheelScrollUnit">19;The unit of scrolling by a wheel</entry>
 <entry key="enableOffscreenWallpaper">1A;Draw Wallpaper by offscreen.</entry>
 <entry key="offscreenWallpaperSize">1B;Offscreen default size.</entry>
+<entry key="enableRestoreWindow">1C;Restore window size and location, zoom</entry>
 
 <entry key="enableAutoColorChange">20;Auto Color Refresh</entry>
 <entry key="notDisableLayerTab">21;The layer not existing is not disabled in the color dialog.</entry>
index ff01ef2..97d6501 100644 (file)
@@ -41,6 +41,7 @@
 <entry key="wheelScrollUnit">19;ホイールによるスクロールの単位</entry>
 <entry key="enableOffscreenWallpaper">1A;壁紙をオフスクリーンで描画する.</entry>
 <entry key="offscreenWallpaperSize">1B;オフスクリーンの既定サイズ</entry>
+<entry key="enableRestoreWindow">1C;ウィンドウサイズ、位置、ズームの復元</entry>
 
 <entry key="enableAutoColorChange">20;カラー変更時、自動的にプレビューに適用する.</entry>
 <entry key="notDisableLayerTab">21;カラーダイアログで存在しないレイヤーをディセーブルにしない.</entry>
index a13e3a0..421a0fa 100644 (file)
@@ -41,6 +41,7 @@
 <entry key="wheelScrollUnit">19;滚轮调整单元</entry>\r
 <entry key="enableOffscreenWallpaper">1A;背景全屏显示</entry>\r
 <entry key="offscreenWallpaperSize">1B;默认全屏大小</entry>\r
+<entry key="enableRestoreWindow">1C;恢復窗口大小/位置</entry>\r
 \r
 <entry key="enableAutoColorChange">20;自动刷新颜色</entry>\r
 <entry key="notDisableLayerTab">21;在颜色菜单显示不存在的图层</entry>\r