X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fcharactermanaj%2Fui%2FMainFrame.java;h=2b0e55f13efab5a1b84a2e2d8b401018fdba865f;hb=f4cb0712dff5286394c481aeead87bb2d585e801;hp=a6c094e37b7ea1c15993688e6854434f0fa9839a;hpb=a9b936ec2264f1e58e5a74faf3331a241233bbab;p=charactermanaj%2FCharacterManaJ.git
diff --git a/src/main/java/charactermanaj/ui/MainFrame.java b/src/main/java/charactermanaj/ui/MainFrame.java
index a6c094e..2b0e55f 100644
--- a/src/main/java/charactermanaj/ui/MainFrame.java
+++ b/src/main/java/charactermanaj/ui/MainFrame.java
@@ -1,2717 +1,2897 @@
-package charactermanaj.ui;
-
-import static java.lang.Math.*;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.Frame;
-import java.awt.GraphicsEnvironment;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.Toolkit;
-import java.awt.dnd.DropTarget;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.MouseWheelEvent;
-import java.awt.event.MouseWheelListener;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.TreeMap;
-import java.util.UUID;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JCheckBox;
-import javax.swing.JColorChooser;
-import javax.swing.JFrame;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
-import javax.swing.JScrollBar;
-import javax.swing.JScrollPane;
-import javax.swing.JSeparator;
-import javax.swing.JSplitPane;
-import javax.swing.JViewport;
-import javax.swing.SwingUtilities;
-import javax.swing.event.AncestorEvent;
-import javax.swing.event.AncestorListener;
-import javax.swing.event.MenuEvent;
-import javax.swing.event.MenuListener;
-
-import charactermanaj.Main;
-import charactermanaj.clipboardSupport.ClipboardUtil;
-import charactermanaj.graphics.AsyncImageBuilder;
-import charactermanaj.graphics.ColorConvertedImageCachedLoader;
-import charactermanaj.graphics.ImageBuildJobAbstractAdaptor;
-import charactermanaj.graphics.ImageBuilder.ImageOutput;
-import charactermanaj.graphics.io.ImageSaveHelper;
-import charactermanaj.graphics.io.OutputOption;
-import charactermanaj.graphics.io.UkagakaImageSaveHelper;
-import charactermanaj.model.AppConfig;
-import charactermanaj.model.CharacterData;
-import charactermanaj.model.CharacterDataChangeEvent;
-import charactermanaj.model.CharacterDataChangeListener;
-import charactermanaj.model.CharacterDataChangeObserver;
-import charactermanaj.model.ColorGroup;
-import charactermanaj.model.IndependentPartsSetInfo;
-import charactermanaj.model.PartsCategory;
-import charactermanaj.model.PartsColorInfo;
-import charactermanaj.model.PartsColorManager;
-import charactermanaj.model.PartsIdentifier;
-import charactermanaj.model.PartsSet;
-import charactermanaj.model.RecommendationURL;
-import charactermanaj.model.WorkingSet;
-import charactermanaj.model.WorkingSet2;
-import charactermanaj.model.io.CharacterDataPersistent;
-import charactermanaj.model.io.PartsImageDirectoryWatchAgent;
-import charactermanaj.model.io.PartsImageDirectoryWatchAgentFactory;
-import charactermanaj.model.io.PartsImageDirectoryWatchEvent;
-import charactermanaj.model.io.PartsImageDirectoryWatchListener;
-import charactermanaj.model.io.RecentDataPersistent;
-import charactermanaj.model.io.WorkingSetPersist;
-import charactermanaj.ui.ImageSelectPanel.ImageSelectPanelEvent;
-import charactermanaj.ui.ImageSelectPanel.ImageSelectPanelListener;
-import charactermanaj.ui.ManageFavoriteDialog.FavoriteManageCallback;
-import charactermanaj.ui.PreviewPanel.PreviewPanelEvent;
-import charactermanaj.ui.PreviewPanel.PreviewPanelListener;
-import charactermanaj.ui.model.ColorChangeEvent;
-import charactermanaj.ui.model.ColorChangeListener;
-import charactermanaj.ui.model.ColorGroupCoordinator;
-import charactermanaj.ui.model.FavoritesChangeEvent;
-import charactermanaj.ui.model.FavoritesChangeListener;
-import charactermanaj.ui.model.FavoritesChangeObserver;
-import charactermanaj.ui.model.PartsColorCoordinator;
-import charactermanaj.ui.model.PartsSelectionManager;
-import charactermanaj.ui.model.WallpaperFactory;
-import charactermanaj.ui.model.WallpaperFactoryErrorRecoverHandler;
-import charactermanaj.ui.model.WallpaperFactoryException;
-import charactermanaj.ui.model.WallpaperInfo;
-import charactermanaj.ui.scrollablemenu.JScrollableMenu;
-import charactermanaj.ui.util.FileDropTarget;
-import charactermanaj.ui.util.WindowAdjustLocationSupport;
-import charactermanaj.util.DesktopUtilities;
-import charactermanaj.util.ErrorMessageHelper;
-import charactermanaj.util.LocalizedResourcePropertyLoader;
-import charactermanaj.util.SystemUtil;
-import charactermanaj.util.UIHelper;
-
-
-/**
- * ã¡ã¤ã³ãã¬ã¼ã .
- * ã¢ããªã±ã¼ã·ã§ã³ãã¢ã¯ãã£ãã§ããå ´åã¯æä½ã§ã1ã¤ã®ã¡ã¤ã³ãã¬ã¼ã ã表示ããã¦ãã.
- *
- * @author seraphy
- */
-public class MainFrame extends JFrame
- implements
- FavoritesChangeListener,
- CharacterDataChangeListener {
-
- private static final long serialVersionUID = 1L;
-
- private static final Logger logger = Logger.getLogger(MainFrame.class.getName());
-
-
- protected static final String STRINGS_RESOURCE = "languages/mainframe";
-
- protected static final String MENU_STRINGS_RESOURCE = "menu/menu";
-
- /**
- * ã¡ã¤ã³ãã¬ã¼ã ã®ã¢ã¤ã³ã³.
- */
- protected BufferedImage icon;
-
-
- /**
- * ç¾å¨ã¢ã¯ãã£ããªã¡ã¤ã³ãã¬ã¼ã .
- * ãã©ã¼ã«ã¹ãåãæ¿ãããã³ã«ã¢ã¯ãã£ããã¬ã¼ã ã追跡ãã.
- * Mac OS Xã®About/Preferences/Quitã®ã·ã¹ãã ã¡ãã¥ã¼ãããã³ã ãããå ´åã«
- * ãªã¼ãã¼ããã¹ãã¡ã¤ã³ãã¬ã¼ã ãèå¥ããããã®ãã®.
- */
- private static volatile MainFrame activedMainFrame;
-
-
- /**
- * ãã®ã¡ã¤ã³ãã¬ã¼ã ã対象ã¨ãããã£ã©ã¯ã¿ã¼ãã¼ã¿.
- */
- protected CharacterData characterData;
-
-
- /**
- * ãã¬ãã¥ã¼ãã¤ã³
- */
- private PreviewPanel previewPane;
-
- /**
- * ãã¼ãé¸æããã¼ã¸ã£
- */
- protected PartsSelectionManager partsSelectionManager;
-
- /**
- * ããã«ã®æå°åã¢ã¼ã
- */
- private boolean minimizeMode;
-
-
- /**
- * ãã¼ãé¸æããã«ãªã¹ã
- */
- protected ImageSelectPanelList imageSelectPanels;
-
- /**
- * ãã¼ãé¸æããã«ãç´ããã¹ã¯ãã¼ã«ãã¤ã³
- */
- protected JScrollPane imgSelectPanelsPanelSp;
-
- /**
- * ã«ã©ã¼ã°ã«ã¼ãã®ããã¼ã¸ã£
- */
- protected ColorGroupCoordinator colorGroupCoordinator;
-
- /**
- * ãã¼ãã«ã©ã¼ã®ããã¼ã¸ã£
- */
- protected PartsColorCoordinator partsColorCoordinator;
-
-
- /**
- * ãã£ãã·ã¥ã¤ãã®ã¤ã¡ã¼ã¸ãã¼ã.
- */
- private ColorConvertedImageCachedLoader imageLoader;
-
- /**
- * ãã¼ããçµã¿ç«ã¦ã¦1ã¤ã®ãã¬ãã¥ã¼å¯è½ãªã¤ã¡ã¼ã¸ãæ§ç¯ããããã®ãã«ã
- */
- private AsyncImageBuilder imageBuilder;
-
-
- /**
- * ãã¼ãã¤ã¡ã¼ã¸ãç»åã¨ãã¦ä¿åããå ´åã®ãã«ãã¼.
- * æå¾ã«ä½¿ã£ããã£ã¬ã¯ããªãä¿æããããã®ã¡ã³ãå¤æ°ã¨ãã¦ãã.
- */
- private ImageSaveHelper imageSaveHelper = new ImageSaveHelper();
-
- /**
- * 伺ãç¨åºåãã«ã.
- * æå¾ã«ä½¿ã£ããã£ã¬ã¯ããªããã¡ã¤ã«åãã¢ã¼ããªã©ãä¿æããããã®ã¡ã³ãå¤æ°ã¨ãã¦ãã.
- */
- private UkagakaImageSaveHelper ukagakaImageSaveHelper = new UkagakaImageSaveHelper();
-
- /**
- * ãã¼ããã£ã¬ã¯ããªãå®æçã«ãã§ãã¯ãããã¼ãã¤ã¡ã¼ã¸ãå¤æ´ã»è¿½å ã»åé¤ããã¦ããå ´åã« ãã¼ããªã¹ããæ´æ°ããããã®ã¦ã©ããã£ã¼
- */
- private PartsImageDirectoryWatchAgent watchAgent;
-
- /**
- * ããã©ã«ãã®ãã¼ãã»ãã表示å
- */
- private String defaultPartsSetTitle;
-
- /**
- * æå¾ã«ä½¿ç¨ããããªã»ãã.
- * (ä¸åº¦ãããªã»ããã使ç¨ãã¦ããªããã°null).
- */
- private PartsSet lastUsePresetParts;
-
- /**
- * æå¾ã«ä½¿ç¨ããæ¤ç´¢ãã¤ã¢ãã°.
- * nullã§ããã°ä¸åº¦ã使ç¨ãã¦ããªã.
- * (nullã§ãªãã¨ãéãããã¦ããå¯è½æ§ããã.)
- */
- private SearchPartsDialog lastUseSearchPartsDialog;
-
- /**
- * æå¾ã«ä½¿ç¨ãããæ°ã«å
¥ããã¤ã¢ãã°.
- * nullã§ããã°ä¸åº¦ã使ç¨ãã¦ããªã.
- * (nullã§ãªãã¨ãéãããã¦ããå¯è½æ§ããã.)
- */
- private ManageFavoriteDialog lastUseManageFavoritesDialog;
-
- /**
- * æå¾ã«ä½¿ç¨ãããã¼ãã®ã©ã³ãã é¸æãã¤ã¢ãã°.
- * nullã§ããã°ä¸åº¦ã使ç¨ãã¦ããªã.
- * (nullã§ãªãã¨ãéãããã¦ããå¯è½æ§ããã.)
- */
- private PartsRandomChooserDialog lastUsePartsRandomChooserDialog;
-
- /**
- * æå¾ã«ä½¿ç¨ããå£ç´æ
å ±
- */
- private WallpaperInfo wallpaperInfo;
-
-
- /**
- * ã¢ã¯ãã£ããªã¡ã¤ã³ãã¬ã¼ã ãè¨å®ãã.
- *
- * @param mainFrame
- * ã¡ã¤ã³ãã¬ã¼ã
- */
- public static void setActivedMainFrame(MainFrame mainFrame) {
- if (mainFrame == null) {
- throw new IllegalArgumentException();
- }
- activedMainFrame = mainFrame;
- }
-
- /**
- * ç¾å¨ã¢ã¯ãã£ããªã¡ã¤ã³ãã¬ã¼ã ãåå¾ãã. ã¾ã ã¡ã¤ã³ãã¬ã¼ã ãéããã¦ããªãå ´åã¯null.
- * æå¾ã®ã¡ã¤ã³ãã¬ã¼ã ãç ´æ£ä¸ããããã¯ç ´æ£æ¸ã¿ã§ããã°ç ´æ£ããããã¬ã¼ã ã示ããã¨ã«æ³¨æ.
- *
- * @return ã¡ã¤ã³ãã¬ã¼ã ããããã¯null
- */
- public static MainFrame getActivedMainFrame() {
- return activedMainFrame;
- }
-
- /**
- * ãã£ã©ã¯ã¿ã¼ãã¼ã¿ãå¤æ´ãããå ´åã«éç¥ããã.
- */
- public void notifyChangeCharacterData(final CharacterDataChangeEvent e) {
- final CharacterData cd = e.getCharacterData();
- if (cd != null
- && cd.getDocBase().equals(
- MainFrame.this.characterData.getDocBase())) {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- try {
- Cursor oldCur = getCursor();
- setCursor(Cursor
- .getPredefinedCursor(Cursor.WAIT_CURSOR));
- try {
- if (e.isChangeStructure()) {
- // ç¾å¨æ
å ±ã®ä¿å
- saveWorkingSet();
-
- // ç»é¢æ§æã®åæ§ç¯
- initComponent(cd);
- }
-
- if (e.isReloadPartsAndFavorites()) {
- // ãã¼ãã¨ãæ°ã«å
¥ãã®ãªãã¼ã
- reloadPartsAndFavorites(cd, true);
- }
-
- } finally {
- setCursor(oldCur != null ? oldCur : Cursor
- .getDefaultCursor());
- }
-
- } catch (Exception ex) {
- ErrorMessageHelper.showErrorDialog(MainFrame.this, ex);
- }
- }
- });
- }
- }
-
- /**
- * ãæ°ã«å
¥ããã¼ã¿ãå¤æ´ãããå ´åã«éç¥ããã.
- *
- * @param e
- */
- public void notifyChangeFavorites(FavoritesChangeEvent e) {
- CharacterData cd = e.getCharacterData();
- if (cd != null
- && cd.getDocBase().equals(
- MainFrame.this.characterData.getDocBase())) {
- if (!MainFrame.this.equals(e.getSource())
- && !characterData.equals(cd)) {
- // ããªã»ããã¨ãæ°ã«å
¥ããææ°åãã.
- // ãã ããèªåèªèº«ããéä¿¡ããã¤ãã³ãã®å ´åã¯ææ°åã¯ä¸è¦.
- characterData.clearPartsSets(false);
- for (Map.Entry entry : cd.getPartsSets()
- .entrySet()) {
- PartsSet partsSet = entry.getValue();
- characterData.addPartsSet(partsSet);
- }
- }
-
- // ãæ°ã«å
¥ã管çãã¤ã¢ãã°ä¸ã®ãæ°ã«å
¥ãä¸è¦§ãææ°ã«æ´æ°ãã.
- if (lastUseManageFavoritesDialog != null
- && lastUseManageFavoritesDialog.isDisplayable()) {
- lastUseManageFavoritesDialog.initListModel();
- }
- }
- }
-
- /**
- * ã¡ã¤ã³ãã¬ã¼ã ãæ§ç¯ãã.
- *
- * @param characterData
- * ãã£ã©ã¯ã¿ã¼ãã¼ã¿
- */
- public MainFrame(CharacterData characterData) {
- try {
- if (characterData == null) {
- throw new IllegalArgumentException();
- }
-
- setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
- addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(WindowEvent e) {
- onCloseProfile();
- }
- @Override
- public void windowClosed(WindowEvent e) {
- stopAgents();
- }
- @Override
- public void windowActivated(WindowEvent e) {
- setActivedMainFrame(MainFrame.this);
- }
- @Override
- public void windowOpened(WindowEvent e) {
- // do nothing.
- }
- });
-
- // ã¢ã¤ã³ã³ã®è¨å®
- icon = UIHelper.getInstance().getImage("icons/icon.png");
- setIconImage(icon);
-
- // ç»é¢ã³ã³ãã¼ãã³ãä½æ
- initComponent(characterData);
- JMenuBar menuBar = createMenuBar();
- setJMenuBar(menuBar);
-
- // ãæ°ã«å
¥ãå¤æ´éç¥ãåãåã
- FavoritesChangeObserver.getDefault().addFavoritesChangeListener(
- this);
- // ãã£ã©ã¯ã¿ã¼ãã¼ã¿ã®å¤æ´éç¥ãåãåã
- CharacterDataChangeObserver.getDefault()
- .addCharacterDataChangeListener(this);
-
- } catch (RuntimeException ex) {
- logger.log(Level.SEVERE, "ã¡ã¤ã³ãã¬ã¼ã ã®æ§ç¯ä¸ã«äºæãã¬ä¾å¤ãçºçãã¾ããã", ex);
- dispose(); // ã³ã³ã¹ãã©ã¯ã¿ãå¼ã°ããæç¹ã§JFrameã¯æ§ç¯æ¸ã¿ãªã®ã§disposeã®å¿
è¦ããã.
- throw ex;
- } catch (Error ex) {
- logger.log(Level.SEVERE, "ã¡ã¤ã³ãã¬ã¼ã ã®æ§ç¯ä¸ã«è´å½çãªä¾å¤ãçºçãã¾ããã", ex);
- dispose(); // ã³ã³ã¹ãã©ã¯ã¿ãå¼ã°ããæç¹ã§JFrameã¯æ§ç¯æ¸ã¿ãªã®ã§disposeã®å¿
è¦ããã.
- throw ex;
- }
- }
-
- /**
- * ããã©ã«ãã®ã¦ã£ã³ãã¦ä½ç½®ã¨ãµã¤ãºã®è¨å®
- */
- private void setDefaultWindowLocation() {
- // ã¡ã¤ã³ã¹ã¯ãªã¼ã³ãµã¤ãºãåå¾ãã.
- GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();
- Rectangle desktopSize = genv.getMaximumWindowBounds(); // ã¡ã¤ã³ã¹ã¯ãªã¼ã³ã®ãµã¤ãº(ãã¹ã¯ãããé åã®ã¿)
- logger.log(Level.CONFIG, "desktopSize=" + desktopSize);
-
- Dimension imageSize = characterData.getImageSize();
- // ç»åãµã¤ãº300x400ãåºæºãµã¤ãºã¨ãã¦ããã以ä¸ã«ã¯ãªããªã.
- // ã¢ããªã±ã¼ã·ã§ã³è¨å®ã®æ大ãµã¤ãºä»¥ä¸ã®å ´åã¯ã¦ã£ã³ãã¦ãµã¤ãºã¯åºå®ãã¦ã¹ã¯ãã¼ã«ãã¼ã«ä»»ãã
- AppConfig appConfig = AppConfig.getInstance();
- int maxWidth = min(desktopSize.width, appConfig.getMainFrameMaxWidth());
- int maxHeight = min(desktopSize.height, appConfig.getMainFrameMaxHeight());
- int imageWidth = min(maxWidth, max(300, imageSize != null ? imageSize.width : 0));
- int imageHeight = min(maxHeight, max(400, imageSize != null ? imageSize.height : 0));
- // 300x400ã®ç»åã®å ´åã«ã¡ã¤ã³ãã¬ã¼ã ã600x550ã ã¨ã¡ããã©ããæã.
- // ãã以ä¸å¤§ããç»åã®å ´åã¯å¢ããåã ããã¬ã¼ã ã大ãããã¦ãã.
- setSize(imageWidth - 300 + 600, imageHeight - 400 + 550);
-
- // 次å表示æã«ãã©ãããã©ã¼ã åºæä½ç½®ã«è¡¨ç¤ºããããã«äºç´
- setLocationByPlatform(true);
- }
-
- /**
- * ã¡ã¤ã³ãã¬ã¼ã ã表示ãã.
- * ãã¹ã¯ãããé åããã¯ã¿åºããå ´åã¯ä½ç½®ãè£æ£ãã.
- */
- public void showMainFrame() {
- // ã¡ã¤ã³ã¹ã¯ãªã¼ã³ãµã¤ãºãåå¾ãã.
- GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();
- Rectangle desktopSize = genv.getMaximumWindowBounds(); // ã¡ã¤ã³ã¹ã¯ãªã¼ã³ã®ãµã¤ãº(ãã¹ã¯ãããé åã®ã¿)
- logger.log(Level.CONFIG, "desktopSize=" + desktopSize);
-
- // ãã©ãããã©ã¼ã åºæã®ä½ç½®ãããã§è¡¨ç¤ºãã.
- // 表示ããçµæãã¯ã¿åºãã¦ããå ´åã¯0,0ã«è£æ£ãã.
- setVisible(true);
- Point loc = getLocation();
- logger.log(Level.CONFIG, "windowLocation=" + loc);
- Dimension windowSize = getSize();
- if (loc.y + windowSize.height >= desktopSize.height) {
- loc.y = 0;
- }
- if (loc.x + windowSize.width >= desktopSize.width) {
- loc.x = 0;
- }
- if (loc.x == 0 || loc.y == 0) {
- setLocation(loc);
- }
-
- // ãã¹ã¯ãããããã大ããå ´åã¯å°ãããã.
- boolean resize = false;
- Dimension dim = getSize();
- if (dim.height > desktopSize.height) {
- dim.height = desktopSize.height;
- resize = true;
- }
- if (dim.width > desktopSize.width) {
- dim.width = desktopSize.width;
- resize = true;
- }
- if (resize) {
- setSize(dim);
- }
- }
-
- /**
- * ãã®ã¡ã¤ã³ãã¬ã¼ã ã«é¢é£ã¥ãããã¦ããã¨ã¼ã¸ã§ã³ãã¹ã¬ãããåæ¢ãã¾ã.
- * ãã§ã«åæ¢ãã¦ããå ´åã¯ä½ããã¾ããã
- */
- protected void stopAgents() {
- // ã¨ã¼ã¸ã§ã³ããåæ¢
- if (watchAgent != null) {
- try {
- watchAgent.disconnect();
-
- } catch (Throwable ex) {
- logger.log(Level.SEVERE, "ãã©ã«ãç£è¦ã¹ã¬ããã®åæ¢ã«å¤±æãã¾ããã", ex);
- }
- watchAgent = null;
- }
- // ã¤ã¡ã¼ã¸ãã«ããåæ¢
- if (imageBuilder != null) {
- try {
- imageBuilder.stop();
-
- } catch (Throwable ex) {
- logger.log(Level.SEVERE, "éåæã¤ã¡ã¼ã¸ãã«ãã¹ã¬ããã®åæ¢ã«å¤±æãã¾ããã", ex);
- }
- imageBuilder = null;
- }
- }
-
- /**
- * ã¡ã¤ã³ãã¬ã¼ã ãç ´æ£ãã¾ã.
- */
- @Override
- public void dispose() {
- FavoritesChangeObserver.getDefault()
- .removeFavoritesChangeListener(this);
- CharacterDataChangeObserver.getDefault()
- .removeCharacterDataChangeListener(this);
- imageLoader.close();
- stopAgents();
- super.dispose();
- }
-
- /**
- * ç»é¢ã³ã³ãã¼ãã³ããè¨å®ãã¾ã.
- * ãã§ã«è¨å®ããã¦ããå ´åã¯ä¸æ¦åé¤ãããã®ã¡ã«åä½æããã¾ã.
- */
- private void initComponent(CharacterData characterData) {
-
- CharacterData oldCd;
- synchronized (this) {
- oldCd = this.characterData;
- if (oldCd != null) {
- // 使ç¨ä¸ã®ãã£ã©ã¯ã¿ã¼ãã¼ã¿ã§ãããã¨ãç»é²è§£é¤ããã
- ProfileListManager.unregisterUsedCharacterData(oldCd);
- }
- this.characterData = characterData;
-
- // 使ç¨ä¸ã®ãã£ã©ã¯ã¿ã¼ãã¼ã¿ã§ãããã¨ãç»é²ãã.
- ProfileListManager.registerUsedCharacterData(characterData);
- }
-
- // è¨å®ã¾ããæºå
- AppConfig appConfig = AppConfig.getInstance();
- Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
- .getLocalizedProperties(STRINGS_RESOURCE);
-
- // ã¿ã¤ãã«è¡¨ç¤º
- String title;
- if (Main.isMacOSX()) {
- // Mac OS Xã®å ´åã¯ã¦ã£ã³ãã¦ã«ã¿ã¤ãã«ã¯ã¤ããªãã
- title = "";
- } else {
- title = strings.getProperty("title");
- }
- setTitle(title + characterData.getName());
-
- // ããã©ã«ãã®ãã¼ãã»ãã表示å
- defaultPartsSetTitle = strings.getProperty("defaultPartsSetTitle");
-
- // ã¨ã¼ã¸ã§ã³ãã®åæ¢
- stopAgents();
-
- // ã³ã³ãã¼ãã³ãé
ç½®
- Container contentPane = getContentPane();
-
- // ãã§ã«ããã³ã³ãã¼ãã³ããåé¤
- for (Component comp : contentPane.getComponents()) {
- contentPane.remove(comp);
- }
- // éãã¦ããæ¤ç´¢ãã¤ã¢ãã°ãéãã
- closeSearchDialog();
-
- // éãã¦ãããæ°ã«å
¥ã管çãã¤ã¢ãã°ãéãã
- closeManageFavoritesDialog();
-
- // éãã¦ããã©ã³ãã é¸æãã¤ã¢ãã°ãéãã.
- closePartsRandomChooserDialog();
-
- PartsColorManager partsColorManager = characterData.getPartsColorManager();
-
- // ããã©ã«ãã®èæ¯è²ã®è¨å®
- Color bgColor = appConfig.getDefaultImageBgColor();
- wallpaperInfo = new WallpaperInfo();
- wallpaperInfo.setBackgroundColor(bgColor);
-
- if (imageLoader != null) {
- imageLoader.close();
- }
- imageLoader = new ColorConvertedImageCachedLoader();
- imageBuilder = new AsyncImageBuilder(imageLoader);
- partsSelectionManager = new PartsSelectionManager(partsColorManager,
- new PartsSelectionManager.ImageBgColorProvider() {
- public Color getImageBgColor() {
- return wallpaperInfo.getBackgroundColor();
- }
- public void setImageBgColor(Color imageBgColor) {
- applyBackgroundColorOnly(imageBgColor);
- }
- });
- colorGroupCoordinator = new ColorGroupCoordinator(partsSelectionManager, partsColorManager);
- partsColorCoordinator = new PartsColorCoordinator(characterData, partsColorManager, colorGroupCoordinator);
- PartsImageDirectoryWatchAgentFactory agentFactory = PartsImageDirectoryWatchAgentFactory.getFactory();
- watchAgent = agentFactory.getAgent(characterData);
-
- previewPane = new PreviewPanel();
- previewPane.setTitle(defaultPartsSetTitle);
- previewPane.addPreviewPanelListener(new PreviewPanelListener() {
- public void addFavorite(PreviewPanelEvent e) {
- if (!e.isShiftKeyPressed()) {
- // ãæ°ã«å
¥ãç»é²
- onRegisterFavorite();
-
- } else {
- // ã·ãããã¼ã«ã¦ããæ°ã«å
¥ãã®ç®¡çãéã
- onManageFavorites();
- }
- }
- public void changeBackgroundColor(PreviewPanelEvent e) {
- if ( !e.isShiftKeyPressed()) {
- // å£ç´é¸æ
- onChangeWallpaper();
-
- } else {
- // ã·ãããã¼ã«ã¦èæ¯è²å¤æ´
- onChangeBgColor();
- }
- }
- public void copyPicture(PreviewPanelEvent e) {
- onCopy(e.isShiftKeyPressed());
- }
- public void savePicture(PreviewPanelEvent e) {
- if ( !e.isShiftKeyPressed()) {
- // ç»ååºå
- onSavePicture();
-
- } else {
- // ã·ãããã¼ã«ã¦ã伺ããç¨åºå
- onSaveAsUkagaka();
- }
- }
- public void showInformation(PreviewPanelEvent e) {
- onInformation();
- }
- public void flipHorizontal(PreviewPanelEvent e) {
- onFlipHolizontal();
- }
- });
-
- imageSelectPanels = new ImageSelectPanelList();
-
- JPanel imgSelectPanelsPanel = new JPanel();
- BoxLayout bl = new BoxLayout(imgSelectPanelsPanel, BoxLayout.PAGE_AXIS);
- imgSelectPanelsPanel.setLayout(bl);
- for (PartsCategory category : characterData.getPartsCategories()) {
- final ImageSelectPanel imageSelectPanel = new ImageSelectPanel(category, characterData);
- imgSelectPanelsPanel.add(imageSelectPanel);
- imageSelectPanels.add(imageSelectPanel);
- partsSelectionManager.register(imageSelectPanel);
- }
-
- imgSelectPanelsPanelSp = new JScrollPane(imgSelectPanelsPanel) {
- private static final long serialVersionUID = 1L;
- @Override
- public JScrollBar createVerticalScrollBar() {
- JScrollBar sb = super.createVerticalScrollBar();
- sb.setUnitIncrement(12);
- return sb;
- }
- };
- imgSelectPanelsPanelSp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
-
- JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, imgSelectPanelsPanelSp, previewPane);
- contentPane.add(splitPane, BorderLayout.CENTER);
-
-
- imgSelectPanelsPanelSp.requestFocus();
-
- ArrayList colorGroups = new ArrayList();
- colorGroups.addAll(characterData.getColorGroups());
-
- final ColorChangeListener colorChangeListener = new ColorChangeListener() {
- public void onColorGroupChange(ColorChangeEvent event) {
- // do nothing.
- }
- public void onColorChange(ColorChangeEvent event) {
- MainFrame.this.requestPreview();
- }
- };
- colorGroupCoordinator.addColorChangeListener(colorChangeListener);
-
- for (int idx = 0; idx < imageSelectPanels.size(); idx++) {
- ImageSelectPanel imageSelectPanel = imageSelectPanels.get(idx);
- final PartsCategory partsCategory = imageSelectPanel.getPartsCategory();
- final ColorDialog colorDialog = new ColorDialog(this, partsCategory, colorGroups);
- colorGroupCoordinator.registerColorDialog(colorDialog);
- partsColorCoordinator.register(imageSelectPanel, colorDialog);
- final int curidx = idx;
- imageSelectPanel.addImageSelectListener(new ImageSelectPanelListener() {
- public void onChangeColor(ImageSelectPanelEvent event) {
- WindowAdjustLocationSupport.alignRight(
- MainFrame.this, colorDialog, curidx, false);
- colorDialog.setVisible(!colorDialog.isVisible());
- }
- public void onPreferences(ImageSelectPanelEvent event) {
- // do nothing. (not supported)
- }
- public void onChange(ImageSelectPanelEvent event) {
- MainFrame.this.requestPreview();
- }
- public void onSelectChange(ImageSelectPanelEvent event) {
- // do nothing.
- }
- public void onTitleClick(ImageSelectPanelEvent event) {
- PartsCategory partsCategory = (event != null) ?
- event.getImageSelectPanel().getPartsCategory() : null;
- MainFrame.this.onClickPartsCategoryTitle(partsCategory, false);
- }
- public void onTitleDblClick(ImageSelectPanelEvent event) {
- PartsCategory partsCategory = (event != null) ?
- event.getImageSelectPanel().getPartsCategory() : null;
- MainFrame.this.onClickPartsCategoryTitle(partsCategory, true);
- }
- });
- imageSelectPanel.addAncestorListener(new AncestorListener() {
- public void ancestorAdded(AncestorEvent event) {
- }
- public void ancestorMoved(AncestorEvent event) {
- }
- public void ancestorRemoved(AncestorEvent event) {
- // ããã«ãããã¯ããã®è¦ªãåé¤ãããã¨ãã«ãã¤ã¢ãã°ãé表示ã¨ããã
- colorDialog.setVisible(false);
- }
- });
- }
-
- // å
¨ãã¼ãã®ãã¼ã
- partsSelectionManager.loadParts();
-
- // ä¿åããã¦ããã¯ã¼ãã³ã°ã»ããã復å
ãã.
- // 復å
ã§ããªãã£ãå ´åã¯ãã¼ãã»ãããåæé¸æãã.
- if ( !loadWorkingSet()) {
- // ã¯ã¼ãã³ã°ã»ããããªãå ´åã¯
- // ããã©ã«ãã®ã¦ã£ã³ãã¦ä½ç½®ã¨ãµã¤ãº
- setDefaultWindowLocation();
-
- // ããã©ã«ãã®ãã¼ãã»ããã®è¡¨ç¤º
- if (showDefaultParts(true)) {
- requestPreview();
- }
- }
-
- // é¸æããã¦ãããã¼ããè¦ããç¶æ
ã«ãã
- scrollToSelectedParts();
-
- // éåæã¤ã¡ã¼ã¸ãã¼ãã®å¦çéå§
- if (!imageBuilder.isAlive()) {
- imageBuilder.start();
- }
-
- // ããããã¿ã¼ã²ããã®è¨å®
- new DropTarget(imgSelectPanelsPanelSp, new FileDropTarget() {
- @Override
- protected void onDropFiles(final List dropFiles) {
- if (dropFiles == null || dropFiles.isEmpty()) {
- return;
- }
- // ã¤ã³ãã¼ããã¤ã¢ãã°ãéã.
- // ããããã½ã¼ã¹ã®å¦çãããããã³ã°ããªãããã«ã
- // ãããããã³ãã©ã®å¦çãçµäºãã¦ããã¤ã³ãã¼ããã¤ã¢ãã°ãéãããã«ãã.
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- onImport(dropFiles);
- }
- });
- }
- @Override
- protected void onException(Exception ex) {
- ErrorMessageHelper.showErrorDialog(MainFrame.this, ex);
- }
- });
-
- // ãã£ã¬ã¯ããªãç£è¦ãå¤æ´ããã£ãå ´åã«ãã¼ãããªãã¼ããããªã¹ã
- watchAgent.addPartsImageDirectoryWatchListener(new PartsImageDirectoryWatchListener() {
- public void detectPartsImageChange(PartsImageDirectoryWatchEvent e) {
- Runnable refreshJob = new Runnable() {
- public void run() {
- onDetectPartsImageChange();
- }
- };
- if (SwingUtilities.isEventDispatchThread()) {
- refreshJob.run();
- } else {
- SwingUtilities.invokeLater(refreshJob);
- }
- }
- });
-
- // ç£è¦ãæå¹ã§ããã°ããã£ã¬ã¯ããªã®ç£è¦ãã¹ã¿ã¼ããã
- if (appConfig.isEnableDirWatch() && characterData.isWatchDirectory()) {
- watchAgent.connect();
- }
-
- // ãã¼ãã«ãã´ãªã®èªå縮å°ãè¨å®ããã¦ããå ´å
- minimizeMode = false;
- if (appConfig.isEnableAutoShrinkPanel()) {
- onClickPartsCategoryTitle(null, true);
- }
-
- // ã³ã³ãã¼ãã³ãã®åæ§ç¯ã®å ´å
- if (oldCd != null) {
- validate();
- }
- }
-
- /**
- * ãã¼ããå¤æ´ããããã¨ãæ¤ç¥ããå ´å.
- * ãã¼ããã¼ã¿ããªãã¼ãããåã«ãã´ãªã®ãã¼ãä¸è¦§ãå表示ããããã¬ãã¥ã¼ãæ´æ°ãã.
- */
- protected void onDetectPartsImageChange() {
- try {
- reloadPartsAndFavorites(null, true);
-
- } catch (IOException ex) {
- logger.log(Level.SEVERE, "parts reload failed. " + characterData, ex);
- }
- }
-
- /**
- * ãã¹ã¦ã®ã«ãã´ãªã®ãªã¹ãã§é¸æä¸ã®ã¢ã¤ãã ãè¦ããããã«ã¹ã¯ãã¼ã«ãã.
- */
- protected void scrollToSelectedParts() {
- partsSelectionManager.scrollToSelectedParts();
- }
-
- /**
- * æå®ãããã¼ãã«ãã´ãªä»¥å¤ã®ãã¼ãé¸æããã«ãæå°åãã.
- *
- * @param partsCategory
- * ãã¼ãã«ãã´ãªãnullã®å ´åã¯å
¨ã¦æå°åãã.
- * @param dblClick
- * ããã«ã¯ãªãã¯
- */
- protected void onClickPartsCategoryTitle(PartsCategory partsCategory, boolean dblClick) {
- if (logger.isLoggable(Level.FINE)) {
- logger.log(Level.FINE, "onClickPartsCategoryTitle category="
- + partsCategory + "/clickCount=" + dblClick);
- }
- if (dblClick) {
- minimizeMode = !minimizeMode;
- if (!minimizeMode) {
- partsSelectionManager.setMinimizeModeIfOther(null, false);
- return;
- }
- }
- if (minimizeMode) {
- if (partsSelectionManager.isNotMinimizeModeJust(partsCategory)) {
- partsSelectionManager.setMinimizeModeIfOther(null, true); // å
¨é¨ç¸®å°
-
- } else {
- partsSelectionManager.setMinimizeModeIfOther(partsCategory, true);
- if (partsCategory != null) {
- // 対象ã®ããã«ãã¹ã¯ãã¼ã«ãã¤ã³å
ã«è¦ããç¨ã«ã¹ã¯ãã¼ã«ãã.
- // ã¹ã¯ãã¼ã«ãã¼ã®ä½ç½®æå®ãªã©ã®åº§æ¨ç³»ã®æä½ã¯ãè¦æ±ãã§ãããå®éã«é©ç¨ãããã¾ã§æ¬å½ã®ä½ç½®ã¯åããªãã
- // ãã£ã¦ä»¥ä¸ã®å¦çã¯éåæã«è¡ããå
ã«åº§æ¨ã確å®ããããã®ã«å¯¾ãã¦è¡ãå¿
è¦ãããã
- final ImageSelectPanel panel = imageSelectPanels.findByPartsCategory(partsCategory);
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- final Point pt = panel.getLocation();
- JViewport viewPort = imgSelectPanelsPanelSp.getViewport();
- viewPort.setViewPosition(pt);
- viewPort.revalidate();
- }
- });
- }
- }
- }
- }
-
- /**
- * ããã©ã«ããã¼ããé¸æãã.
- * ããã©ã«ããã¼ãããªããã°ãæ°ã«å
¥ãã®æåã®ãã®ãé¸æãã.
- * ããããªããã°ç©ºã¨ãã¦è¡¨ç¤ºãã.
- * ãã¼ãã®é©ç¨ã«å¤±æããå ´åã¯falseãè¿ãã¾ã.(ä¾å¤ã¯è¿ããã¾ãã.)
- *
- * @param force
- * ãã§ã«é¸æããã£ã¦ãé¸æããªããå ´åã¯trueãfalseã®å ´åã¯é¸æãããã°ä½ãããªã.
- * @return ãã¼ãé¸æãããå ´åãforce=trueã®å ´åã¯ã¨ã©ã¼ããªããã°å¸¸ã«trueã¨ãªãã¾ãã
- */
- protected boolean showDefaultParts(boolean force) {
- try {
- if (!force) {
- // ç¾å¨é¸æä¸ã®ãã¼ããåå¾ãã.(ãªããã°ç©º)
- PartsSet sel = partsSelectionManager.createPartsSet();
- if (!sel.isEmpty()) {
- // å¼·å¶é¸æã§ãªãå ´åããã§ã«é¸ææ¸ã¿ã®ãã¼ããããã°ä½ãããªã.
- return false;
- }
- }
-
- // ããã©ã«ãã®ãã¼ãã»ãããåå¾ãã
- String defaultPresetId = characterData.getDefaultPartsSetId();
- PartsSet partsSet = null;
- if (defaultPresetId != null) {
- partsSet = characterData.getPartsSets().get(defaultPresetId);
- }
-
- // ããã©ã«ãã®ãã¼ãã»ããããªããã°ããæ°ã«å
¥ãã®æåãé¸æãã.
- if (partsSet == null) {
- List partssets = getPartsSetList();
- if (!partssets.isEmpty()) {
- partsSet = partssets.get(0);
- }
- }
-
- // ãã¼ãã»ãããããã°ãããã表示è¦æ±ãã.
- // ãã¼ãã»ããããªããã°ã«ã©ã¼ãã¤ã¢ãã°ãåæåããã®ã¿
- if (partsSet == null) {
- partsColorCoordinator.initColorDialog();
-
- } else {
- selectPresetParts(partsSet);
- }
-
- } catch (Exception ex) {
- logger.log(Level.WARNING, "ãã¼ãã®ããã©ã«ãé©ç¨ã«å¤±æãã¾ããã", ex);
- return false;
- }
- return true;
- }
-
- /**
- * ããªã»ãããé©ç¨ããã£ã©ã¯ã¿ã¼ã¤ã¡ã¼ã¸ãåæ§ç¯ãã¾ã.
- * å®è¡æã¨ã©ã¼ã¯ç»é¢ã®ã¬ãã¼ãããã¾ã.
- *
- * @param presetParts
- * ãã¼ãã»ãã, nullã®å ´åã¯ä½ãããªã.
- */
- protected void selectPresetParts(PartsSet presetParts) {
- if (presetParts == null) {
- return;
- }
- try {
- // æå¾ã«ä½¿ç¨ããããªã»ããã¨ãã¦è¨æ¶ãã.
- lastUsePresetParts = presetParts;
- // ããªã»ãããã¼ãã§é¸æãå¤ãã
- partsSelectionManager.selectPartsSet(presetParts);
- // ã«ã©ã¼ããã«ãé¸æããã¦ããã¢ã¤ãã ããã¨ã«åè¨å®ãã
- partsColorCoordinator.initColorDialog();
- // å表示
- requestPreview();
-
- } catch (Exception ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- }
-
- /**
- * ããªã»ããã¨ãæ°ã«å
¥ãã表示é ã«ä¸¦ã¹ã¦è¿ã.
- *
- * @return ããªã»ããã¨ãæ°ã«å
¥ãã®ãªã¹ã(表示é )
- */
- protected List getPartsSetList() {
- ArrayList partssets = new ArrayList();
- partssets.addAll(characterData.getPartsSets().values());
- Collections.sort(partssets, PartsSet.DEFAULT_COMPARATOR);
- return partssets;
- }
-
- protected static final class TreeLeaf implements Comparable {
-
- public enum TreeLeafType {
- NODE, LEAF
- }
-
- private String name;
-
- private TreeLeafType typ;
-
- public TreeLeaf(TreeLeafType typ, String name) {
- if (name == null) {
- name = "";
- }
- this.typ = typ;
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- public TreeLeafType getTyp() {
- return typ;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (obj != null && obj instanceof TreeLeaf) {
- TreeLeaf o = (TreeLeaf) obj;
- return typ == o.typ && name.equals(o.name);
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return typ.hashCode() ^ name.hashCode();
- }
-
- public int compareTo(TreeLeaf o) {
- int ret = name.compareTo(o.name);
- if (ret == 0) {
- ret = (typ.ordinal() - o.typ.ordinal());
- }
- return ret;
- }
-
- @Override
- public String toString() {
- return name;
- }
- }
-
- protected TreeMap buildFavoritesItemTree(
- List partssets) {
- if (partssets == null) {
- partssets = Collections.emptyList();
- }
- TreeMap favTree = new TreeMap();
- for (PartsSet partsSet : partssets) {
- String flatname = partsSet.getLocalizedName();
- String[] tokens = flatname.split("\\|");
- if (tokens.length == 0) {
- continue;
- }
-
- TreeMap r = favTree;
- for (int idx = 0; idx < tokens.length - 1; idx++) {
- String name = tokens[idx];
- TreeLeaf leafName = new TreeLeaf(TreeLeaf.TreeLeafType.NODE,
- name);
- @SuppressWarnings("unchecked")
- TreeMap n = (TreeMap) r
- .get(leafName);
- if (n == null) {
- n = new TreeMap();
- r.put(leafName, n);
- }
- r = n;
- }
- String lastName = tokens[tokens.length - 1];
- TreeLeaf lastLeafName = new TreeLeaf(TreeLeaf.TreeLeafType.LEAF,
- lastName);
- @SuppressWarnings("unchecked")
- List leafValue = (List) r.get(lastLeafName);
- if (leafValue == null) {
- leafValue = new ArrayList();
- r.put(lastLeafName, leafValue);
- }
- leafValue.add(partsSet);
- }
- return favTree;
- }
-
- protected interface FavoriteMenuItemBuilder {
- JMenuItem createFavoriteMenuItem(String name, PartsSet partsSet);
- JMenu createSubMenu(String name);
- }
-
- private void buildFavoritesMenuItems(List menuItems,
- FavoriteMenuItemBuilder favMenuItemBuilder,
- TreeMap favTree) {
- for (Map.Entry entry : favTree.entrySet()) {
- TreeLeaf treeLeaf = entry.getKey();
- String name = treeLeaf.getName();
- if (treeLeaf.getTyp() == TreeLeaf.TreeLeafType.LEAF) {
- // èãã¼ãã«ã¯ãJMenuItemãè¨å®ãã.
- @SuppressWarnings("unchecked")
- List leafValue = (List) entry.getValue();
- for (final PartsSet partsSet : leafValue) {
- JMenuItem favoriteMenu = favMenuItemBuilder
- .createFavoriteMenuItem(name, partsSet);
- menuItems.add(favoriteMenu);
- }
-
- } else if (treeLeaf.getTyp() == TreeLeaf.TreeLeafType.NODE) {
- // æãã¼ãã¯ããµãã¡ãã¥ã¼ãä½æããåãã¼ããè¨å®ãã
- @SuppressWarnings("unchecked")
- TreeMap childNode = (TreeMap) entry
- .getValue();
- JMenu subMenu = favMenuItemBuilder.createSubMenu(name);
- menuItems.add(subMenu);
- ArrayList subMenuItems = new ArrayList();
- buildFavoritesMenuItems(subMenuItems, favMenuItemBuilder, childNode);
- for (JMenuItem subMenuItem : subMenuItems) {
- subMenu.add(subMenuItem);
- }
-
- } else {
- throw new RuntimeException("unknown type: " + treeLeaf);
- }
- }
- }
-
- /**
- * ãæ°ã«å
¥ãã®JMenuItemãä½æãããã¡ã³ã¯ã·ã§ã³ãªãã¸ã§ã¯ã
- */
- private FavoriteMenuItemBuilder favMenuItemBuilder = new FavoriteMenuItemBuilder() {
- private MenuBuilder menuBuilder = new MenuBuilder();
-
- /**
- * ãæ°ã«å
¥ãã¡ãã¥ã¼ã®ä½æ
- */
- public JMenuItem createFavoriteMenuItem(final String name,
- final PartsSet partsSet) {
- JMenuItem favoriteMenu = menuBuilder.createJMenuItem();
- favoriteMenu.setName(partsSet.getPartsSetId());
- favoriteMenu.setText(name);
- if (partsSet.isPresetParts()) {
- Font font = favoriteMenu.getFont();
- favoriteMenu.setFont(font.deriveFont(Font.BOLD));
- }
- favoriteMenu.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- selectPresetParts(partsSet);
- }
- });
-
- // ã¡ãã¥ã¼ã¢ã¤ãã ä¸ã§ãã¦ã¹ãã¤ã¼ã«ãåãããå ´åã¯ä¸ä¸ã«ã¹ã¯ãã¼ã«ããã.
- // (ãã ããOSXã®ã¹ã¯ãªã¼ã³ã¡ãã¥ã¼ä½¿ç¨æã¯ç¡è¦ãã.)
- addMouseWheelListener(favoriteMenu);
-
- return favoriteMenu;
- }
-
- /**
- * ãµãã¡ãã¥ã¼ã®ä½æ
- */
- public JMenu createSubMenu(String name) {
- JMenu menu = menuBuilder.createJMenu();
- menu.setText(name);
-
- // ã¡ãã¥ã¼ã¢ã¤ãã ä¸ã§ãã¦ã¹ãã¤ã¼ã«ãåãããå ´åã¯ä¸ä¸ã«ã¹ã¯ãã¼ã«ããã.
- // (ãã ããOSXã®ã¹ã¯ãªã¼ã³ã¡ãã¥ã¼ä½¿ç¨æã¯ç¡è¦ãã.)
- addMouseWheelListener(menu);
-
- return menu;
- }
-
- /**
- * ã¡ãã¥ã¼ã¢ã¤ãã ä¸ã§ãã¤ã¼ã«ãä¸ä¸ãããã¨ãã«ã¡ãã¥ã¼ãã¹ã¯ãã¼ã«ãããããã®ãã¤ã¼ã«ãã³ãã©ãè¨å®ãã.
- *
- * @param favoriteMenu
- */
- protected void addMouseWheelListener(final JMenuItem favoriteMenu) {
- if (JScrollableMenu.isScreenMenu()) {
- return;
- }
- favoriteMenu.addMouseWheelListener(new MouseWheelListener() {
- public void mouseWheelMoved(MouseWheelEvent e) {
- int rotation = e.getWheelRotation();
- JPopupMenu popupMenu = (JPopupMenu) favoriteMenu
- .getParent();
- JMenu parentMenu = (JMenu) popupMenu.getInvoker();
- if (parentMenu != null
- && parentMenu instanceof JScrollableMenu) {
- final JScrollableMenu favMenu = (JScrollableMenu) parentMenu;
- favMenu.doScroll(rotation < 0);
- }
- e.consume();
- }
- });
- }
- };
-
- /**
- * ãæ°ã«å
¥ãã¡ãã¥ã¼ãéããã¨ã
- *
- * @param menu
- */
- protected void onSelectedFavoriteMenu(JMenu menu) {
- // 表示é ã«ã½ã¼ã
- List partssets = getPartsSetList();
- TreeMap favTree = buildFavoritesItemTree(partssets);
-
- // ã¡ãã¥ã¼ã®åæ§ç¯
- ArrayList favoritesMenuItems = new ArrayList();
- buildFavoritesMenuItems(favoritesMenuItems, favMenuItemBuilder, favTree);
-
- if (menu instanceof JScrollableMenu) {
- // ã¹ã¯ãã¼ã«ã¡ãã¥ã¼ã®å ´å
- JScrollableMenu favMenu = (JScrollableMenu) menu;
-
- // ã¹ã¯ãã¼ã«ã¡ãã¥ã¼ã®åæå
- favMenu.initScroller();
-
- // ã¹ã¯ãã¼ã«ã¡ãã¥ã¼ã¢ã¤ãã ã®è¨å®
- favMenu.setScrollableItems(favoritesMenuItems);
-
- // é«ããè£æ£ãã
- // ãæ°ã«å
¥ãã¡ãã¥ã¼ãé¸æãããå ´åã
- // ãæ°ã«å
¥ãã¢ã¤ãã ä¸è¦§ã表示ãããããåã«
- // 表示å¯è½ãªã¢ã¤ãã æ°ãç¾å¨ã®ã¦ã£ã³ãã¦ã®é«ãããç®å®ãã.
- Toolkit tk = Toolkit.getDefaultToolkit();
- Dimension scrsiz = tk.getScreenSize();
- int height = scrsiz.height; // MainFrame.this.getHeight();
- favMenu.adjustMaxVisible(height);
- logger.log(Level.FINE,
- "scrollableMenu maxVisible=" + favMenu.getMaxVisible());
-
- } else {
- // é常ã¡ãã¥ã¼ã®å ´å
- // æ¢åã¡ãã¥ã¼ã®ä½ç½®ãã»ãã¬ã¼ã¿ããå¤æãã.
- int mx = menu.getMenuComponentCount();
- int separatorIdx = -1;
- for (int idx = 0; idx < mx; idx++) {
- Component item = menu.getMenuComponent(idx);
- if (item instanceof JSeparator) {
- separatorIdx = idx;
- break;
- }
- }
- // æ¢åã¡ãã¥ã¼ã®åé¤
- if (separatorIdx > 0) {
- while (menu.getMenuComponentCount() > separatorIdx + 1) {
- menu.remove(separatorIdx + 1);
- }
- }
-
- // ãæ°ã«å
¥ãã¢ã¤ãã ã®ã¡ãã¥ã¼ãç»é²ãã.
- for (JMenuItem menuItem : favoritesMenuItems) {
- menu.add(menuItem);
- }
- }
-
- }
-
- /**
- * ãã«ãã¡ãã¥ã¼ãéããã¨ãã«ãå§ãã¡ãã¥ã¼ãæ§ç¯ãã.
- *
- * @param menu
- */
- protected void onSelectedRecommendationMenu(JMenu mnuRecomendation) {
- // ç¾å¨ã®ãå§ãã¡ãã¥ã¼ãä¸æ¦åé¤
- while (mnuRecomendation.getMenuComponentCount() > 0) {
- mnuRecomendation.remove(0);
- }
-
- // ãå§ããªã³ã¯ã®å®ç¾©ããªãå ´åã¯ããã©ã«ããç¨ãã.(æ示çãªç©ºã®å ´åã¯ä½ãããªã.)
- CharacterDataPersistent persist = CharacterDataPersistent.getInstance();
- persist.compensateRecommendationList(characterData);
-
- // ãå§ããªã³ã¯ã¡ãã¥ã¼ãä½æãã.
- List recommendations = characterData.getRecommendationURLList();
- if (recommendations != null) {
- MenuBuilder menuBuilder = new MenuBuilder();
- for (RecommendationURL recommendation : recommendations) {
- String displayName = recommendation.getDisplayName();
- String url = recommendation.getUrl();
-
- JMenuItem mnuItem = menuBuilder.createJMenuItem();
- mnuItem.setText(displayName);
- mnuItem.addActionListener(
- DesktopUtilities.createBrowseAction(MainFrame.this, url, displayName)
- );
- mnuRecomendation.add(mnuItem);
- }
- }
-
- // ãå§ããªã³ã¯ã¡ãã¥ã¼ã®ãªã¹ããnullã§ãªã空ã§ããªãå ´åã¯æå¹ãããã§ãªããã°ç¡å¹ã«ãã.
- mnuRecomendation.setEnabled(recommendations != null && !recommendations.isEmpty());
- }
-
-
- /**
- * æå¾ã«é¸æããããæ°ã«å
¥ãã¨åãæ§æã§ããã°ã ãã®ãæ°ã«å
¥ãã®ååããã¬ãã¥ã¼ãã¤ã³ã®ã¿ã¤ãã«ã«è¨å®ãã.
- * ããã§ãªããã°ããã©ã«ãã®ãã¼ãã»ããå(no titleã¨ã)ã表示ãã.
- * è²æ
å ±ãç°ãªãå ´åã«æ«å°¾ã«ã*ããã¼ã¯ãã¤ãããã.
- *
- * @param requestPartsSet
- * 表示ãããã¼ãã»ãã(ååã¯è¨å®ããã¦ããªãã¦è¯ãããæ°ã«å
¥ãå´ã使ãã®ã§ã), nullã®å ´åã¯ããã©ã«ãã®ãã¼ãå
- */
- protected void showPresetName(PartsSet requestPartsSet) {
- String title = getSuggestPartsSetName(requestPartsSet, true);
- if (title == null) {
- title = defaultPartsSetTitle;
- }
- previewPane.setTitle(title);
- }
-
- /**
- * ãã¼ãã»ããåãæ¨å®ãã.
- * æå¾ã«é¸æããããæ°ã«å
¥ãã¨åãæ§æã§ããã°ã ãã®ãæ°ã«å
¥ãã®ååãè¿ã.
- * ãæ°ã«å
¥ããé¸æããã¦ããªããæ§æãç°ãªãå ´åããæ°ã«å
¥ãã«ååããªãå ´åã¯nullãè¿ã.
- *
- * @param requestPartsSet
- * 表示ãããã¼ãã»ãã(ååã¯è¨å®ããã¦ããªãã¦è¯ãããæ°ã«å
¥ãå´ã使ãã®ã§ã)
- * @param markColorChange
- * è²æ
å ±ãç°ãªãå ´åã«æ«å°¾ã«ã*ããã¼ã¯ãã¤ããå ´åã¯true
- */
- private String getSuggestPartsSetName(PartsSet requestPartsSet, boolean markColorChange) {
- String partsSetTitle = null;
- if (lastUsePresetParts != null &&
- PartsSet.isSameStructure(requestPartsSet, lastUsePresetParts)) {
- partsSetTitle = lastUsePresetParts.getLocalizedName();
- if (markColorChange && !PartsSet.isSameColor(requestPartsSet, lastUsePresetParts)) {
- if (partsSetTitle != null) {
- partsSetTitle += "*";
- }
- }
- }
- if (partsSetTitle != null && partsSetTitle.trim().length() > 0) {
- return partsSetTitle;
- }
- return null;
- }
-
- /**
- * ãã¬ãã¥ã¼ã®æ´æ°ãè¦æ±ãã. æ´æ°ã¯éåæã«è¡ããã.
- */
- protected void requestPreview() {
- if (!characterData.isValid()) {
- return;
- }
-
- // é¸æããã¦ãããã¼ãã®åã¤ã¡ã¼ã¸ãåå¾ãã¬ã¤ã¤ã¼é ã«ä¸¦ã³æ¿ãã¦åæãã.
- // åæã¯å¥ã¹ã¬ããã«ã¦éåæã«è¡ããã.
- // ãªã¯ã¨ã¹ãã¯éæåãä»ãã¦ãææ°ã®ãªã¯ã¨ã¹ãã ããå¦çããã.
- // (å¦çãã¯ãã¾ãåã«æ°ãããªã¯ã¨ã¹ãã§ä¸æ¸ããããå ´åãåã®ãªã¯ã¨ã¹ãã¯åã«æ¨ã¦ããã.)
- imageBuilder.requestJob(new ImageBuildJobAbstractAdaptor(characterData) {
-
- /**
- * æ§ç¯ãããã¼ãã»ããæ
å ±
- */
- private PartsSet requestPartsSet;
-
- /**
- * éåæã®ã¤ã¡ã¼ã¸æ§ç¯è¦æ±ã®çªå·.
- */
- private long ticket;
-
- @Override
- public void onQueueing(long ticket) {
- this.ticket = ticket;
- previewPane.setLoadingRequest(ticket);
- }
- @Override
- public void buildImage(ImageOutput output) {
- // åæçµæã®ã¤ã¡ã¼ã¸ãå¼æ°ã¨ãã¦ã¤ã¡ã¼ã¸ãã«ãããå¼ã³åºããã.
- final BufferedImage img = output.getImageOutput();
- Runnable refreshJob = new Runnable() {
- public void run() {
- previewPane.setPreviewImage(img);
- previewPane.setLoadingComplete(ticket);
- showPresetName(requestPartsSet);
- }
- };
- if (SwingUtilities.isEventDispatchThread()) {
- refreshJob.run();
- } else {
- try {
- SwingUtilities.invokeAndWait(refreshJob);
- } catch (Exception ex) {
- logger.log(Level.WARNING, "build image failed.", ex);
- }
- }
- }
- @Override
- public void handleException(final Throwable ex) {
- // åæä¸ã«ä¾å¤ãçºçããå ´åãã¤ã¡ã¼ã¸ãã«ãããå¼ã³åºããã.
- Runnable showExceptionJob = new Runnable() {
- public void run() {
- ErrorMessageHelper.showErrorDialog(MainFrame.this, ex);
- }
- };
- if (SwingUtilities.isEventDispatchThread()) {
- showExceptionJob.run();
- } else {
- SwingUtilities.invokeLater(showExceptionJob);
- }
- }
- @Override
- protected PartsSet getPartsSet() {
- // åæã§ããç¶æ
ã«ãªã£ãæç¹ã§ã¤ã¡ã¼ã¸ãã«ãããå¼ã³åºããã.
- final PartsSet[] result = new PartsSet[1];
- Runnable collectPartsSetJob = new Runnable() {
- public void run() {
- PartsSet partsSet = partsSelectionManager.createPartsSet();
- result[0] = partsSet;
- }
- };
- if (SwingUtilities.isEventDispatchThread()) {
- collectPartsSetJob.run();
- } else {
- try {
- // ã¹ã¬ããã«ããSwingã®ã¤ãã³ããã£ã¹ãããã¹ã¬ãã以å¤ããã®å¼ã³åºãã®å ´åã
- // Swingãã£ã¹ãããã¹ã¬ããã§ãã¼ãã®é¸æç¶æ
ãåå¾ãã.
- SwingUtilities.invokeAndWait(collectPartsSetJob);
-
- } catch (InvocationTargetException e) {
- throw new RuntimeException(e.getMessage(), e);
- } catch (InterruptedException e) {
- throw new RuntimeException("interrupted:" + e, e);
- }
- }
- if (logger.isLoggable(Level.FINE)) {
- logger.log(Level.FINE, "preview: " + result[0]);
- }
- requestPartsSet = result[0];
- return requestPartsSet;
- }
- });
- }
-
- /**
- * ãããã¡ã¤ã«ãéã
- */
- protected void onOpenProfile() {
- try {
- MainFrame main2 = ProfileListManager.openProfile(this);
- if (main2 != null) {
- main2.showMainFrame();
- }
-
- } catch (Exception ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- }
-
- /**
- * èæ¯è²ãå¤æ´ãã.
- */
- protected void onChangeBgColor() {
- getJMenuBar().setEnabled(false);
- try {
- Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
- .getLocalizedProperties(STRINGS_RESOURCE);
-
- Color color = wallpaperInfo.getBackgroundColor();
- color = JColorChooser.showDialog(this, strings.getProperty("chooseBgColor"), color);
- if (color != null) {
- applyBackgroundColorOnly(color);
- }
- } finally {
- getJMenuBar().setEnabled(true);
- }
- }
-
- /**
- * å£ç´ãå¤æ´ãã.
- */
- protected void onChangeWallpaper() {
- try {
- WallpaperDialog wallpaperDialog = new WallpaperDialog(this);
-
- // æå¾ã«ä½¿ç¨ããå£ç´æ
å ±ã§ãã¤ã¢ãã°ãè¨å®ãã.
- wallpaperDialog.setWallpaperInfo(this.wallpaperInfo);
-
- // å£ç´æ
å ±ãè¨å®ããã¢ã¼ãã«ãã¤ã¢ãã°ãéã
- WallpaperInfo wallpaperInfo = wallpaperDialog.showDialog();
- if (wallpaperInfo == null) {
- return;
- }
-
- // å£ç´æ
å ±ãä¿åãããã®æ
å ±ããã¨ã«èæ¯ãåæç»ãã.
- applyWallpaperInfo(wallpaperInfo, false);
-
- } catch (WallpaperFactoryException ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
-
- } catch (RuntimeException ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- }
-
- /**
- * èæ¯è²ã®ã¿å¤æ´ããèæ¯ãåæç»ãã.
- * å£ç´æ
å ±å
¨ä½ã®æ´æ°ãããå¹çåããããã®ã¡ã½ããã§ãã.
- *
- * @param bgColor
- * èæ¯è²
- */
- protected void applyBackgroundColorOnly(Color bgColor) {
- wallpaperInfo.setBackgroundColor(bgColor);
- previewPane.getWallpaper()
- .setBackgroundColor(wallpaperInfo.getBackgroundColor());
- }
-
- /**
- * å£ç´æ
å ±ãä¿åãããã®æ
å ±ããã¨ã«èæ¯ãåæç»ãã.
- * ignoreErrorãtrueã§ããå ´åãé©ç¨ã«å¤±æããå ´åã¯ãã°ã«è¨é²ããã®ã¿ã§ã å£ç´æ
å ±ã¯ä¿åããããå£ç´ãæ´æ°ãããªã.
- *
- * @param wallpaperInfo
- * å£ç´æ
å ±ãnullä¸å¯
- * @param ignoreError
- * 失æãç¡è¦ããå ´å
- * @throws IOException
- * 失æ
- */
- protected void applyWallpaperInfo(WallpaperInfo wallpaperInfo, boolean ignoreError) throws WallpaperFactoryException {
- if (wallpaperInfo == null) {
- throw new IllegalArgumentException();
- }
- // å£ç´æ
å ±ããå£ç´ã¤ã³ã¹ã¿ã³ã¹ãçæãã.
- WallpaperFactory wallpaperFactory = WallpaperFactory.getInstance();
- Wallpaper wallpaper = null;
-
- try {
- // å£ç´æ
å ±ã®æ§ç¯æã«åé¡ãçºçããå ´åã
- // å復å¦çããã¦ç¶ç¶ãããã¨ã©ã¼ã¨ããã?
- WallpaperFactoryErrorRecoverHandler handler = null;
- if (ignoreError) {
- handler = new WallpaperFactoryErrorRecoverHandler();
- }
-
- // å£ç´æ
å ±
- wallpaper = wallpaperFactory.createWallpaper(wallpaperInfo, handler);
-
- } catch (WallpaperFactoryException ex) {
- logger.log(Level.WARNING, "å£ç´æ
å ±ã®é©ç¨ã«å¤±æãã¾ããã", ex);
- if ( !ignoreError) {
- throw ex;
- }
-
- } catch (RuntimeException ex) {
- logger.log(Level.WARNING, "å£ç´æ
å ±ã®é©ç¨ã«å¤±æãã¾ããã", ex);
- if ( !ignoreError) {
- throw ex;
- }
- }
-
- if (wallpaper == null) {
- return;
- }
-
- // å£ç´ãæ´æ°ãã.
- previewPane.setWallpaper(wallpaper);
-
- // å£ç´æ
å ±ã¨ãã¦è¨æ¶ãã.
- this.wallpaperInfo = wallpaperInfo;
- }
-
- /**
- * ãã¬ãã¥ã¼ãã¦ããç»åããã¡ã¤ã«ã«ä¿åããã ãµãã¼ããã¦ããã®ã¯PNG/JPEGã®ã¿ã
- */
- protected void onSavePicture() {
- Toolkit tk = Toolkit.getDefaultToolkit();
- BufferedImage img = previewPane.getPreviewImage();
- Color imgBgColor = wallpaperInfo.getBackgroundColor();
- if (img == null) {
- tk.beep();
- return;
- }
-
- try {
- // åºåãªãã·ã§ã³ã®èª¿æ´
- OutputOption outputOption = imageSaveHelper.getOutputOption();
- outputOption.setZoomFactor(previewPane.getZoomFactor());
- outputOption.changeRecommend();
- imageSaveHelper.setOutputOption(outputOption);
-
- // ãã¡ã¤ã«ãã¤ã¢ãã°è¡¨ç¤º
- File outFile = imageSaveHelper.showSaveFileDialog(this);
- if (outFile == null) {
- return;
- }
- logger.log(Level.FINE, "savePicture: " + outFile);
- logger.log(Level.FINE, "outputOption: " + outputOption);
-
- // ç»åã®ãã¡ã¤ã«ã¸ã®åºå
- StringBuilder warnings = new StringBuilder();
-
- setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
- try {
- imageSaveHelper.savePicture(img, imgBgColor, outFile, warnings);
-
- } finally {
- setCursor(Cursor.getDefaultCursor());
- }
- if (warnings.length() > 0) {
- JOptionPane.showMessageDialog(this, warnings.toString(), "WARNINGS", JOptionPane.WARNING_MESSAGE);
- }
-
- } catch (Exception ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- }
-
- /**
- * 伺ãç¨PNG/PNAã®åºå.
- */
- protected void onSaveAsUkagaka() {
- BufferedImage img = previewPane.getPreviewImage();
- Color bgColor = wallpaperInfo.getBackgroundColor();
- if (img == null) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
-
- try {
- ukagakaImageSaveHelper.save(this, img, bgColor);
-
- } catch (IOException ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- }
-
- /**
- * 伺ãç¨PNG/PNAã®å¤æ
- */
- protected void onConvertUkagaka() {
- try {
- Color colorKey = wallpaperInfo.getBackgroundColor();
- ukagakaImageSaveHelper.convertChooseFiles(this, colorKey);
-
- } catch (IOException ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- }
-
- /**
- * ãããã¡ã¤ã«ã®å ´æãéã
- */
- protected void onBrowseProfileDir() {
- if (!characterData.isValid()) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
- try {
- DesktopUtilities.browseBaseDir(characterData.getDocBase());
-
- } catch (Exception ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- }
-
- /**
- * ãã®ãããã¡ã¤ã«ãç·¨éãã.
- */
- protected void onEditProfile() {
- if (!characterData.isValid()) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
- try {
- CharacterData cd = this.characterData;
- CharacterData newCd = ProfileListManager.editProfile(this, cd);
- if (newCd != null) {
- CharacterDataChangeObserver.getDefault()
- .notifyCharacterDataChange(this, newCd, true, true);
- }
-
- } catch (Exception ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- }
-
- /**
- * ãã¼ãã®ç®¡çãã¤ã¢ãã°ãéã.
- */
- protected void onManageParts() {
- if (!characterData.isValid()) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
-
- PartsManageDialog mrgDlg = new PartsManageDialog(this, characterData);
- mrgDlg.setVisible(true);
-
- if (mrgDlg.isUpdated()) {
- // ãã¼ã管çæ
å ±ãæ´æ°ãããå ´åã
- // ãã¼ããã¼ã¿ããªãã¼ããã.
- if (characterData.reloadPartsData()) {
- partsSelectionManager.loadParts();
- requestPreview();
- }
- }
- }
-
- /**
- * ããã¼ãæ¤ç´¢ããã¤ã¢ãã°ãéã.
- * ãã§ã«éãã¦ãããã¤ã¢ãã°ãããã°ãããã«ãã©ã¼ã«ã¹ãå½ã¦ã.
- */
- protected void openSearchDialog() {
- if (!characterData.isValid()) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
-
- if (lastUseSearchPartsDialog != null) {
- // éãã¦ãããã¤ã¢ãã°ãããã°ãããã«ãã©ã¼ã«ã¹ãå½ã¦ã.
- if (lastUseSearchPartsDialog.isDisplayable() && lastUseSearchPartsDialog.isVisible()) {
- lastUseSearchPartsDialog.requestFocus();
- return;
- }
- }
-
- SearchPartsDialog searchPartsDlg = new SearchPartsDialog(this, characterData, partsSelectionManager);
- WindowAdjustLocationSupport.alignRight(this, searchPartsDlg, 0, true);
- searchPartsDlg.setVisible(true);
- lastUseSearchPartsDialog = searchPartsDlg;
- }
-
- /**
- * ããã¼ãæ¤ç´¢ããã¤ã¢ãã°ãéãã.
- */
- protected void closeSearchDialog() {
- lastUseSearchPartsDialog = null;
- for (SearchPartsDialog dlg : SearchPartsDialog.getDialogs()) {
- if (dlg != null && dlg.isDisplayable() && dlg.getParent() == this) {
- dlg.dispose();
- }
- }
- }
-
- /**
- * ããæ°ã«å
¥ãã®ç®¡çããã¤ã¢ãã°ãéãã
- */
- protected void closeManageFavoritesDialog() {
- if (lastUseManageFavoritesDialog != null) {
- if (lastUseManageFavoritesDialog.isDisplayable()) {
- lastUseManageFavoritesDialog.dispose();
- }
- lastUseManageFavoritesDialog = null;
- }
- }
-
- /**
- * ããã¼ãã®ã©ã³ãã é¸æãã¤ã¢ãã°ããéãã
- */
- protected void closePartsRandomChooserDialog() {
- if (lastUsePartsRandomChooserDialog != null) {
- if (lastUsePartsRandomChooserDialog.isDisplayable()) {
- lastUsePartsRandomChooserDialog.dispose();
- }
- lastUsePartsRandomChooserDialog = null;
- }
- }
-
- /**
- * ã¯ãªãããã¼ãã«ã³ãã¼
- *
- * @param screenImage
- * ã¹ã¯ãªã¼ã³ã¤ã¡ã¼ã¸
- */
- protected void onCopy(boolean screenImage) {
- try {
- BufferedImage img = previewPane.getPreviewImage();
- if (img == null) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
-
- if (screenImage) {
- // 表示ãã¦ããå
容ããã®ã¾ã¾ã³ãã¼ãã.
- img = previewPane.getScreenImage();
- }
-
- Color imgBgColor = wallpaperInfo.getBackgroundColor();
- ClipboardUtil.setImage(img, imgBgColor);
-
- } catch (Exception ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- }
-
- /**
- * ã¢ããªã±ã¼ã·ã§ã³ã®è¨å®ãã¤ã¢ãã°ãéã
- */
- public void onPreferences() {
- AppConfigDialog appConfigDlg = new AppConfigDialog(this);
- appConfigDlg.setVisible(true);
- }
-
- /**
- * æ°è¦ã¢ã¼ãã§ã¤ã³ãã¼ãã¦ã£ã¶ã¼ããå®è¡ãã.
- */
- protected void onImportNew() {
- if (!characterData.isValid()) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
-
- try {
- // ã¤ã³ãã¼ãã¦ã£ã¶ã¼ãã®å®è¡(æ°è¦ã¢ã¼ã)
- ImportWizardDialog importWizDialog = new ImportWizardDialog(this, null, null);
- importWizDialog.setVisible(true);
- int exitCode = importWizDialog.getExitCode();
- if (exitCode == ImportWizardDialog.EXIT_PROFILE_CREATED) {
- CharacterData cd = importWizDialog.getImportedCharacterData();
- if (cd != null && cd.isValid()) {
- // ã¤ã³ãã¼ããããã£ã©ã¯ã¿ã¼ãã¼ã¿ã®ãããã¡ã¤ã«ãéã.
- setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
- try {
- MainFrame mainFrame = ProfileListManager.openProfile(cd);
- mainFrame.setVisible(true);
-
- } finally {
- setCursor(Cursor.getDefaultCursor());
- }
- }
- }
-
- } catch (Exception ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- }
-
- /**
- * ç¾å¨ã®ãããã¡ã¤ã«ã«å¯¾ããã¤ã³ãã¼ãã¦ã£ã¶ã¼ããå®è¡ãã.
- * ã¤ã³ãã¼ããå®è¡ãããå ´åã¯ããã¼ãããªãã¼ããã.
- * ã¤ã³ãã¼ãã¦ã£ã¶ã¼ã表示ä¸ã¯ç£è¦ã¹ã¬ããã¯åæ¢ããã.
- *
- * @param initFile
- * ã¢ã¼ã«ã¤ããã¡ã£ã«ã¾ãã¯ãã£ã¬ã¯ããªãæå®ããªããã°null
- */
- protected void onImport(List initFiles) {
- if (!characterData.isValid()) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
-
- try {
- watchAgent.suspend();
- try {
- // ã¤ã³ãã¼ãã¦ã£ã¶ã¼ãã®å®è¡
- ImportWizardDialog importWizDialog = new ImportWizardDialog(this, characterData, initFiles);
- importWizDialog.setVisible(true);
-
- if (importWizDialog.getExitCode() == ImportWizardDialog.EXIT_PROFILE_UPDATED) {
- CharacterData importedCd = importWizDialog.getImportedCharacterData();
- CharacterDataChangeObserver.getDefault()
- .notifyCharacterDataChange(this, importedCd,
- false, true);
- }
-
- } finally {
- watchAgent.resume();
- }
-
- } catch (Exception ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- }
-
- /**
- * ãã¼ãã¨ãæ°ã«å
¥ãããªãã¼ããã.
- * ã¾ã ãã¼ãããã¦ããªãå ´åã¯ãããã«ãã¼ããã.
- * å¼æ°newCdãæå®ããã¦ããå ´åã¯ãç¾å¨ã®ãã£ã©ã¯ã¿ã¼å®ç¾©ã®èª¬ææãæ´æ°ãã.
- * (説ææã®æ´æ°ä»¥å¤ã«ã¯ä½¿ç¨ãããªã.)
- *
- * @param newCd
- * 説æææ´æ°ã®ããã®æ´æ°ããããã£ã©ã¯ã¿ã¼ãã¼ã¿ãæå®ãããnullå¯
- * @param forceRepaint
- * å¿
ãåæç»ããå ´å
- * @throws IOException
- * 失æ
- */
- protected synchronized void reloadPartsAndFavorites(CharacterData newCd,
- boolean forceRepaint) throws IOException {
- if (newCd != null) {
- // (ã¤ã³ãã¼ãç»é¢ã§ã¯èª¬ææã®ã¿æ´æ°ããã®ã§ãããã ãåå¾)
- characterData.setDescription(newCd.getDescription());
- }
-
- if ( !characterData.isPartsLoaded()) {
- // ãã£ã©ã¯ã¿ã¼ãã¼ã¿ããã¾ã èªã¿è¾¼ã¾ãã¦ããªããã°èªã¿è¾¼ã.
- ProfileListManager.loadCharacterData(characterData);
- ProfileListManager.loadFavorites(characterData);
- partsSelectionManager.loadParts();
-
- } else {
- // ãã¼ããã¼ã¿ããªãã¼ããã.
- if (characterData.reloadPartsData()) {
- partsSelectionManager.loadParts();
- }
-
- // ãæ°ã«å
¥ãããªãã¼ããã.
- CharacterDataPersistent persiste = CharacterDataPersistent.getInstance();
- persiste.loadFavorites(characterData);
-
- // ãæ°ã«å
¥ããæ´æ°ããããã¨ãéç¥ãã.
- FavoritesChangeObserver.getDefault().notifyFavoritesChange(
- MainFrame.this, characterData);
- }
-
- // ç¾å¨é¸æããã¦ãããã¼ãã»ããããªãå ´åã¯ããã©ã«ãã®ãã¼ãã»ãããé¸æãã.
- if (showDefaultParts(false) || forceRepaint) {
- requestPreview();
- }
- }
-
- protected void onExport() {
- if (!characterData.isValid()) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
- ExportWizardDialog exportWizDlg = new ExportWizardDialog(this, characterData, previewPane.getPreviewImage());
- exportWizDlg.setVisible(true);
- }
-
- protected void onResetColor() {
- if (!characterData.isValid()) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
-
- Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
- .getLocalizedProperties(STRINGS_RESOURCE);
-
- if (JOptionPane.showConfirmDialog(this, strings.get("confirm.resetcolors"), strings.getProperty("confirm"),
- JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) != JOptionPane.YES_OPTION) {
- return;
- }
- characterData.getPartsColorManager().resetPartsColorInfo();
- partsColorCoordinator.initColorDialog();
- requestPreview();
- }
-
- /**
- * ãããã¡ã¤ã«ãéãã.
- */
- protected void onCloseProfile() {
- saveWorkingSet();
- ProfileListManager.unregisterUsedCharacterData(characterData);
-
- if (characterData.isValid()) {
-
- // æå¾ã«ä½¿ç¨ãããã£ã©ã¯ã¿ã¼ãã¼ã¿ã¨ãã¦è¨æ¶ãã.
- try {
- RecentDataPersistent recentPersist = RecentDataPersistent.getInstance();
- recentPersist.saveRecent(characterData);
-
- } catch (Exception ex) {
- logger.log(Level.WARNING, "recent data saving failed.", ex);
- // recentæ
å ±ã®è¨é²ã«å¤±æãã¦ãè´å½çã§ã¯ãªãã®ã§ãããã¯ç¡è¦ãã.
- }
- }
-
- // ã¤ã¡ã¼ã¸ãã«ãã¹ã¬ããã»ãã£ã¬ã¯ããªç£è¦ã¹ã¬ãããåæ¢ãã.
- stopAgents();
-
- // ãã¬ã¼ã ã¦ã£ã³ãã¦ãç ´æ£ãã.
- dispose();
-
- // ç ´æ£ããããã¨ããã®ã³ã°ãã.
- logger.log(Level.FINE, "dispose mainframe.");
- }
-
- /**
- * éãã¦ããããã¹ã¦ã®ãããã¡ã¤ã«ãéãã.
- * (Mac OS Xã®cmd+Qã§éããå ´åãªã©ã§ä½¿ç¨ããã.)
- */
- public static void closeAllProfiles() {
- // ã¦ã£ã³ãã¦ãéãããããã¨ã§ã¢ã¯ãã£ããªãã¬ã¼ã ãåãæ¿ããå ´åãæ³å®ãã
- // ç¾å¨ã®ã¢ã¯ãã£ããªã¦ã£ã³ãã¦ããããããè¨æ¶ãã¦ãã
- MainFrame mainFrame = activedMainFrame;
-
- // gcãããã¦ãã¡ã¤ãã©ã¤ãºãä¿é²ããã
- SystemUtil.gc();
-
- // ãã¡ã¤ãã©ã¤ãºããã¦ããªãFrameã®ãã¡ããã¤ãã£ããªã½ã¼ã¹ã¨é¢é£ã¥ãããã¦ãã
- // ãã¬ã¼ã ã«ã¤ãã¦ããããMainFrameã®ã¤ã³ã¹ã¿ã³ã¹ã§ããã°éãã.
- // ãã ããç¾å¨ã¢ã¯ãã£ããªãã®ã¯é¤ã
- for (Frame frame : JFrame.getFrames()) {
- try {
- if (frame.isDisplayable()) {
- // ãã¤ãã£ããªã½ã¼ã¹ã¨é¢é£ã¥ãããã¦ãããã¬ã¼ã
- if (frame instanceof MainFrame && frame != mainFrame) {
- // MainFrameã®ã¤ã³ã¹ã¿ã³ã¹ã§ããã®ã§éããå¦çãå¯è½.
- // (ç¾å¨ã¢ã¯ãã£ããªã¡ã¤ã³ãã¬ã¼ã ã¯æå¾ã«éãããããããã§ã¯éããªã.)
- ((MainFrame) frame).onCloseProfile();
- }
- }
-
- } catch (Throwable ex) {
- logger.log(Level.SEVERE, "mainframe closing failed.", ex);
- // ãã¬ã¼ã ãéããã¨ãã«å¤±æããå ´åãé常ãè´å½çåé¡ã ã
- // ã¯ãã¼ãºå¦çã¯ç¶ç¶ããªããã°ãªããªã.
- }
- }
-
- // ç¾å¨ã¢ã¯ãã£ããªãã¬ã¼ã ãéãã.
- // æå¾ã«éãããã¨ã§ãæå¾ã«ä½¿ã£ããããã¡ã¤ã«ãã¨ãã¦è¨æ¶ããã.
- if (activedMainFrame != null && activedMainFrame.isDisplayable()) {
- try {
- activedMainFrame.onCloseProfile();
-
- } catch (Throwable ex) {
- logger.log(Level.SEVERE, "mainframe closing failed.", ex);
- // ãã¬ã¼ã ãéããã¨ãã«å¤±æããå ´åãé常ãè´å½çåé¡ã ã
- // ã¯ãã¼ãºå¦çã¯ç¶ç¶ããªããã°ãªããªã.
- }
- }
- }
-
- /**
- * ç»é¢ã®ä½æ¥ç¶æ
ãä¿åãã.
- */
- protected void saveWorkingSet() {
- if (!characterData.isValid()) {
- return;
- }
- try {
- // ã¯ã¼ãã³ã°ã»ããã®ä½æ
- WorkingSet workingSet = new WorkingSet();
- workingSet.setCharacterDocBase(characterData.getDocBase());
- workingSet.setCharacterDataRev(characterData.getRev());
- PartsSet partsSet = partsSelectionManager.createPartsSet();
- workingSet.setPartsSet(partsSet);
- workingSet.setPartsColorInfoMap(characterData
- .getPartsColorManager().getPartsColorInfoMap());
- workingSet.setLastUsedSaveDir(imageSaveHelper.getLastUsedSaveDir());
- workingSet.setLastUsedExportDir(ExportWizardDialog.getLastUsedDir());
- workingSet.setLastUsePresetParts(lastUsePresetParts);
- workingSet
- .setCharacterData(characterData.duplicateBasicInfo(false)); // ãã¼ãã»ããã¯ä¿åããªã.
- workingSet.setWallpaperInfo(wallpaperInfo);
-
- workingSet.setZoomFactor(previewPane.getZoomFactor());
- workingSet.setViewPosition(previewPane.getViewPosition());
-
- Dimension windowSize = getSize();
- Point windowPos = getLocation();
- Rectangle windowRect = new Rectangle(windowPos, windowSize);
- workingSet.setWindowRect(windowRect);
-
- // XMLå½¢å¼ã§ã®ã¯ã¼ãã³ã°ã»ããã®ä¿å
- WorkingSetPersist workingSetPersist = WorkingSetPersist
- .getInstance();
- workingSetPersist.saveWorkingSet(workingSet);
-
- } catch (Exception ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- }
-
- /**
- * ç»é¢ã®ä½æ¥ç¶æ
ã復å
ãã.
- *
- * @return ã¯ã¼ãã³ã°ã»ãããèªã¿è¾¼ãã å ´åã¯trueãããã§ãªããã°false
- */
- protected boolean loadWorkingSet() {
- if (!characterData.isValid()) {
- return false;
- }
- try {
- WorkingSetPersist workingSetPersist = WorkingSetPersist
- .getInstance();
- WorkingSet2 workingSet2 = workingSetPersist
- .loadWorkingSet(characterData);
- if (workingSet2 == null) {
- // ã¯ã¼ãã³ã°ã»ããããªãå ´å.
- return false;
- }
-
- AppConfig appConfig = AppConfig.getInstance();
- Rectangle windowRect = workingSet2.getWindowRect();
- if (appConfig.isEnableRestoreWindow() && windowRect != null) {
- // ä½ç½®ã®å¾©å
- GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();
- Rectangle desktopSize = genv.getMaximumWindowBounds(); // ã¡ã¤ã³ã¹ã¯ãªã¼ã³ã®ãµã¤ãº(ãã¹ã¯ãããé åã®ã¿)
- Point windowPos = windowRect.getLocation();
- if (desktopSize.contains(windowPos)) {
- setLocation(windowPos);
- }
-
- // ãµã¤ãºã®å¾©å
- Dimension dim = windowRect.getSize();
- if (dim.width < 100) {
- dim.width = 100;
- }
- if (dim.height < 100) {
- dim.height = 100;
- }
- setSize(dim);
- } else {
- // ããã©ã«ãã®ã¦ã£ã³ãã¦ä½ç½®ã¨ãµã¤ãº
- setDefaultWindowLocation();
- }
-
- URI docBase = characterData.getDocBase();
- if (docBase != null
- && !docBase.equals(workingSet2.getCharacterDocBase())) {
- // docBaseãä¸è´ãã
- return false;
- }
- String sig = characterData.toSignatureString();
- if (!sig.equals(workingSet2.getCharacterDataSig())) {
- // æ§é ãä¸è´ãã.
- return false;
- }
-
- // ãã¼ãã®è²æ
å ±ã復å
ãã.
- Map partsColorInfoMap = characterData
- .getPartsColorManager().getPartsColorInfoMap();
- workingSet2.createCompatible(characterData, partsColorInfoMap);
-
- // é¸æããã¦ãããã¼ãã®å¾©å
- IndependentPartsSetInfo partsSetInfo = workingSet2
- .getCurrentPartsSet();
- if (partsSetInfo != null) {
- PartsSet partsSet = IndependentPartsSetInfo.convertPartsSet(
- partsSetInfo, characterData, false);
- selectPresetParts(partsSet);
-
- // æå¾ã«é¸æãããæ°ã«å
¥ãæ
å ±ã®å¾©å
- IndependentPartsSetInfo lastUsePresetPartsInfo = workingSet2
- .getLastUsePresetParts();
- if (lastUsePresetPartsInfo != null
- && lastUsePresetPartsInfo.getId() != null
- && lastUsePresetPartsInfo.getId().trim().length() > 0) {
- PartsSet lastUsePresetParts = IndependentPartsSetInfo
- .convertPartsSet(lastUsePresetPartsInfo,
- characterData, false);
- if (lastUsePresetParts.isSameStructure(partsSet)) {
- this.lastUsePresetParts = lastUsePresetParts;
- showPresetName(lastUsePresetParts);
- }
- }
- }
-
- // æå¾ã«ä¿åãããã£ã¬ã¯ããªã復å
ãã.
- imageSaveHelper.setLastUseSaveDir(workingSet2.getLastUsedSaveDir());
- ExportWizardDialog.setLastUsedDir(workingSet2
- .getLastUsedExportDir());
-
- // å£ç´æ
å ±ãåå¾ãã.
- WallpaperInfo wallpaperInfo = workingSet2.getWallpaperInfo();
- if (wallpaperInfo != null) {
- // å£ç´æ
å ±ãä¿åãããã®æ
å ±ããã¨ã«èæ¯ãåæç»ãã.
- // (é©ç¨ã«å¤±æããå ´åã¯ã¨ã©ã¼ã¯ç¡è¦ããå£ç´æ
å ±ã¯ä¿åããªã.)
- applyWallpaperInfo(wallpaperInfo, true);
- }
-
- // ãºã¼ã ç¶æ
ã復å
ãã
- Double zoomFactor = workingSet2.getZoomFactor();
- if (appConfig.isEnableRestoreWindow() && zoomFactor != null) {
- previewPane.setZoomFactor(zoomFactor);
- final Point viewPosition = workingSet2.getViewPosition();
- if (viewPosition != null) {
- previewPane.setViewPosition(viewPosition);
- }
- }
-
- return true;
-
- } catch (Exception ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- return false;
- }
-
-
- public void onAbout() {
- try {
- AboutBox aboutBox = new AboutBox(this);
- aboutBox.showAboutBox();
-
- } catch (Exception ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- }
-
- protected void onHelp() {
- Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
- .getLocalizedProperties(STRINGS_RESOURCE);
- String helpURL = strings.getProperty("help.url");
- String helpDescription = strings.getProperty("help.show");
- DesktopUtilities.browse(this, helpURL, helpDescription);
- }
-
- protected void onFlipHolizontal() {
- if (!characterData.isValid()) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
-
- double[] affineTransformParameter = partsSelectionManager.getAffineTransformParameter();
- if (affineTransformParameter == null) {
- // å·¦å³ããªããããã¢ãã£ã³å¤æãã©ã¡ã¼ã¿ãæ§ç¯ãã.
- Dimension siz = characterData.getImageSize();
- if (siz != null) {
- affineTransformParameter = new double[] {-1., 0, 0, 1., siz.width, 0};
- }
- } else {
- // ã¢ãã£ã³å¤æãã©ã¡ã¼ã¿ãã¯ãªã¢ãã.
- affineTransformParameter = null;
- }
- partsSelectionManager.setAffineTransformParameter(affineTransformParameter);
- requestPreview();
- }
-
- protected void onSetDefaultPicture() {
- if (!characterData.isValid()) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
- try {
- BufferedImage samplePicture = previewPane.getPreviewImage();
- if (samplePicture != null) {
- CharacterDataPersistent persist = CharacterDataPersistent.getInstance();
- persist.saveSamplePicture(characterData, samplePicture);
- }
-
- } catch (Exception ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- }
-
- protected void onInformation() {
- if (!characterData.isValid()) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
-
- PartsSet partsSet = partsSelectionManager.createPartsSet();
- InformationDialog infoDlg = new InformationDialog(this, characterData, partsSet);
- infoDlg.setVisible(true);
- }
-
- protected void onManageFavorites() {
- if (!characterData.isValid()) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
-
- if (lastUseManageFavoritesDialog != null) {
- // éãã¦ãããã¤ã¢ãã°ãããã°ãããã«ãã©ã¼ã«ã¹ãå½ã¦ã.
- if (lastUseManageFavoritesDialog.isDisplayable()
- && lastUseManageFavoritesDialog.isVisible()) {
- lastUseManageFavoritesDialog.requestFocus();
- return;
- }
- }
-
- // ãæ°ã«å
¥ãç·¨éãã¤ã¢ãã°ãéã
- ManageFavoriteDialog dlg = new ManageFavoriteDialog(this, characterData);
- dlg.setFavoriteManageCallback(new FavoriteManageCallback() {
-
- public void selectFavorites(PartsSet partsSet) {
- // ãæ°ã«å
¥ãç·¨éãã¤ã¢ãã°ã§é¸æããããã¼ããé¸æ表示ãã.
- selectPresetParts(partsSet);
- }
-
- public void updateFavorites(CharacterData characterData,
- boolean savePreset) {
- // ãæ°ã«å
¥ããç»é²ãã.
- try {
- setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
- try {
- CharacterDataPersistent persiste = CharacterDataPersistent
- .getInstance();
- if (savePreset) {
- persiste.updateProfile(characterData);
- }
-
- persiste.saveFavorites(characterData);
-
- // ãæ°ã«å
¥ããæ´æ°ããããã¨ãéç¥ãã.
- FavoritesChangeObserver.getDefault()
- .notifyFavoritesChange(MainFrame.this,
- characterData);
-
- } finally {
- setCursor(Cursor.getDefaultCursor());
- }
-
- } catch (Exception ex) {
- ErrorMessageHelper.showErrorDialog(MainFrame.this, ex);
- }
- }
- });
- WindowAdjustLocationSupport.alignRight(this, dlg, 0, true);
- dlg.setVisible(true);
- lastUseManageFavoritesDialog = dlg;
- }
-
- protected void onRegisterFavorite() {
- if (!characterData.isValid()) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
- try {
- // ãã¼ãã»ãããçæ
- PartsSet partsSet = partsSelectionManager.createPartsSet();
- if (partsSet.isEmpty()) {
- // 空ã®ãã¼ãã»ããã¯ç»é²ããªã.
- return;
- }
-
- Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
- .getLocalizedProperties(STRINGS_RESOURCE);
-
- // ãæ°ã«å
¥ãã«ç»é²ãããã¼ãã»ãããæå¾ã«ä½¿ç¨ãããæ°ã«å
¥ãã¨åãæ§æã§ããã°ã
- // ãã®ãæ°ã«å
¥ãåã使ç¨ãã.
- String initName = getSuggestPartsSetName(partsSet, false);
-
- // ã«ã©ã¼æ
å ±ã®æç¡ã®ãã§ãã¯ããã¯ã¹.
- JCheckBox chkColorInfo = new JCheckBox(strings.getProperty("input.favoritesColorInfo"));
- chkColorInfo.setSelected(true);
- String partsSetId = null;
- if (initName != null && lastUsePresetParts != null) {
- partsSetId = lastUsePresetParts.getPartsSetId();
- }
-
- // ä¸æ¸ãä¿åã®å¯å¦ã®ãã§ãã¯ããã¯ã¹
- JCheckBox chkOverwrite = new JCheckBox(strings.getProperty("input.favoritesOverwrite"));
- chkOverwrite.setSelected(partsSetId != null && partsSetId.length() > 0);
- chkOverwrite.setEnabled(partsSetId != null && partsSetId.length() > 0);
-
- // ãã§ãã¯ããã¯ã¹ããã«
- Box checkboxsPanel = new Box(BoxLayout.PAGE_AXIS);
- checkboxsPanel.add(chkColorInfo);
- checkboxsPanel.add(chkOverwrite);
-
- // å
¥åãã¤ã¢ãã°ãéã
- String name = (String) JOptionPane.showInputDialog(this,
- checkboxsPanel,
- strings.getProperty("input.favorites"),
- JOptionPane.QUESTION_MESSAGE,
- null,
- null,
- initName == null ? "" : initName);
- if (name == null || name.trim().length() == 0) {
- return;
- }
-
- boolean includeColorInfo = chkColorInfo.isSelected();
- if (!includeColorInfo) {
- // ã«ã©ã¼æ
å ±ãé¤å»ãã.
- partsSet.removeColorInfo();
- }
-
- // æ°è¦ã®å ´åããããã¯ä¸æ¸ãããªãå ´åã¯IDãè¨å®ãã.
- if (partsSetId == null || !chkOverwrite.isSelected()) {
- partsSetId = "ps" + UUID.randomUUID().toString();
- }
- partsSet.setPartsSetId(partsSetId);
-
- // ååãè¨å®ãã.
- partsSet.setLocalizedName(name);
-
- // ãã¡ã¤ã«ã«ä¿å
- setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
- try {
- CharacterDataPersistent persiste = CharacterDataPersistent.getInstance();
- // ç¾å¨ã®ææ°æ
å ±ãåãåºã.
- characterData.clearPartsSets(true);
- persiste.loadFavorites(characterData);
-
- // ãæ°ã«å
¥ãã³ã¬ã¯ã·ã§ã³ã«ç»é²
- characterData.addPartsSet(partsSet);
-
- persiste.saveFavorites(characterData);
-
- // ãæ°ã«å
¥ããæ´æ°ããããã¨ãéç¥ãã.
- FavoritesChangeObserver.getDefault().notifyFavoritesChange(
- MainFrame.this, characterData);
-
- } finally {
- setCursor(Cursor.getDefaultCursor());
- }
-
- // æå¾ã«é¸æãããæ°ã«å
¥ãã«ãã
- lastUsePresetParts = partsSet;
- showPresetName(partsSet);
-
- } catch (Exception ex) {
- ErrorMessageHelper.showErrorDialog(this, ex);
- }
- }
-
- /**
- * ã©ã³ãã é¸æãã¤ã¢ãã°ãéã.
- */
- protected void onToolRandom() {
- if (!characterData.isValid()) {
- Toolkit tk = Toolkit.getDefaultToolkit();
- tk.beep();
- return;
- }
-
- if (lastUsePartsRandomChooserDialog != null) {
- // éãã¦ãããã¤ã¢ãã°ãããã°ãããã«ãã©ã¼ã«ã¹ãå½ã¦ã.
- if (lastUsePartsRandomChooserDialog.isDisplayable()
- && lastUsePartsRandomChooserDialog.isVisible()) {
- lastUsePartsRandomChooserDialog.requestFocus();
- return;
- }
- }
-
- // ãæ°ã«å
¥ãç·¨éãã¤ã¢ãã°ãéã
- PartsRandomChooserDialog dlg = new PartsRandomChooserDialog(this,
- characterData,
- new PartsRandomChooserDialog.PartsSetSynchronizer() {
- public PartsSet getCurrentPartsSet() {
- // ç¾å¨ã®ãã¼ãã»ãããçæ
- return partsSelectionManager.createPartsSet();
- }
-
- public void setPartsSet(PartsSet partsSet) {
- selectPresetParts(partsSet);
- }
-
- public boolean
- isExcludePartsIdentifier(PartsIdentifier partsIdentifier) {
- Boolean exclude = randomExcludePartsIdentifierMap
- .get(partsIdentifier);
- return exclude != null && exclude.booleanValue();
- }
-
- public void
- setExcludePartsIdentifier(PartsIdentifier partsIdentifier,
- boolean exclude) {
- randomExcludePartsIdentifierMap.put(partsIdentifier,
- exclude);
- }
- });
-
- WindowAdjustLocationSupport.alignRight(this, dlg, 0, true);
- dlg.setVisible(true);
- lastUsePartsRandomChooserDialog = dlg;
- }
-
- /**
- * ã©ã³ãã é¸æãã¼ãã§é¸æåè£ããé¤å¤ãããã¼ãã®ããã.
- */
- private HashMap randomExcludePartsIdentifierMap =
- new HashMap();
-
- /**
- * ãã¹ã¦ã®è§£é¤å¯è½ãªãã¼ãã®é¸æã解é¤ããã
- */
- protected void onDeselectAll() {
- partsSelectionManager.deselectAll();
- }
-
- /**
- * åä¸é¸æã«ãã´ãªã®ãã¼ãã®è§£é¤ã許å¯ããã
- */
- protected void onDeselectableAllCategory() {
- partsSelectionManager
- .setDeselectableSingleCategory( !partsSelectionManager
- .isDeselectableSingleCategory());
- }
-
- /**
- * ãã¬ãã¥ã¼ã®ãºã¼ã ããã¯ã¹ã®è¡¨ç¤ºå¶å¾¡
- */
- protected void onEnableZoom() {
- previewPane.setVisibleZoomBox( !previewPane.isVisibleZoomBox());
- }
-
- /**
- * ã¡ãã¥ã¼ãã¼ãæ§ç¯ãã¾ã.
- *
- * @return ã¡ãã¥ã¼ãã¼
- */
- protected JMenuBar createMenuBar() {
- final Properties strings = LocalizedResourcePropertyLoader
- .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE);
-
- MenuDataFactory[] menus = new MenuDataFactory[] {
- new MenuDataFactory("menu.file", new MenuDataFactory[] {
- new MenuDataFactory("file.openProfile", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onOpenProfile();
- }
- }),
- new MenuDataFactory("file.savePicture", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onSavePicture();
- }
- }),
- new MenuDataFactory("file.ukagaka", new MenuDataFactory[] {
- new MenuDataFactory("file.saveAsUkagaka", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onSaveAsUkagaka();
- };
- }),
- new MenuDataFactory("file.convertUkagaka", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onConvertUkagaka();
- };
- }),
- }),
- null,
- new MenuDataFactory("file.editprofile", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onEditProfile();
- }
- }),
- new MenuDataFactory("file.opendir", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onBrowseProfileDir();
- }
- }),
- new MenuDataFactory("file.import", new MenuDataFactory[] {
- new MenuDataFactory("file.importMe", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onImport(null);
- };
- }),
- new MenuDataFactory("file.importNew", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onImportNew();
- };
- }),
- }),
- new MenuDataFactory("file.export", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onExport();
- };
- }),
- new MenuDataFactory("file.manageParts", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onManageParts();
- }
- }),
- new MenuDataFactory("file.preferences", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onPreferences();
- };
- }),
- null,
- new MenuDataFactory("file.closeProfile", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onCloseProfile();
- }
- }),
- }),
- new MenuDataFactory("menu.edit", new MenuDataFactory[] {
- new MenuDataFactory("edit.search", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- openSearchDialog();
- }
- }),
- new MenuDataFactory("edit.copy", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onCopy((e.getModifiers() & ActionEvent.SHIFT_MASK) != 0);
- }
- }),
- new MenuDataFactory("edit.flipHorizontal", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onFlipHolizontal();
- }
- }),
- new MenuDataFactory("edit.resetcolor", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onResetColor();
- }
- }),
- null,
- new MenuDataFactory("edit.setDefaultPicture", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onSetDefaultPicture();
- }
- }),
- new MenuDataFactory("edit.information", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onInformation();
- }
- }),
- null,
- new MenuDataFactory("edit.deselectall", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onDeselectAll();
- }
- }),
- new MenuDataFactory("edit.deselectparts", true, new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onDeselectableAllCategory();
- }
- }),
- new MenuDataFactory("edit.enableAutoShrink", true, new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onClickPartsCategoryTitle(null, true);
- }
- }),
- null,
- new MenuDataFactory("edit.enableZoomBox", true, new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onEnableZoom();
- }
- }),
- null,
- new MenuDataFactory("edit.changeBgColor", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onChangeBgColor();
- }
- }),
- new MenuDataFactory("edit.changeWallpaper", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onChangeWallpaper();
- }
- }),
- }),
- new MenuDataFactory("menu.favorite", new MenuDataFactory[] {
- new MenuDataFactory("favorite.register", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onRegisterFavorite();
- }
- }),
- new MenuDataFactory("favorite.manage", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onManageFavorites();
- }
- }),
- null,
- }),
- new MenuDataFactory("menu.tool",
- new MenuDataFactory[]{new MenuDataFactory(
- "tool.random", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onToolRandom();
- }
- }),}),
- new MenuDataFactory("menu.help", new MenuDataFactory[] {
- new MenuDataFactory("help.recommendations", (ActionListener) null),
- null,
- new MenuDataFactory("help.help", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onHelp();
- }
- }),
- new MenuDataFactory("help.forum",
- DesktopUtilities.createBrowseAction(
- MainFrame.this,
- strings.getProperty("help.forum.url"),
- strings.getProperty("help.forum.description"))
- ),
- new MenuDataFactory("help.bugreport",
- DesktopUtilities.createBrowseAction(
- MainFrame.this,
- strings.getProperty("help.reportbugs.url"),
- strings.getProperty("help.reportbugs.description"))
- ),
- new MenuDataFactory("help.about", new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- onAbout();
- }
- }),
- }), };
-
- final MenuBuilder menuBuilder = new MenuBuilder();
-
- JMenuBar menuBar = menuBuilder.createMenuBar(menus);
-
- menuBuilder.getJMenu("menu.edit").addMenuListener(new MenuListener() {
- public void menuCanceled(MenuEvent e) {
- // do nothing.
- }
- public void menuDeselected(MenuEvent e) {
- // do nothing.
- }
- public void menuSelected(MenuEvent e) {
- menuBuilder.getJMenuItem("edit.copy").setEnabled(previewPane.getPreviewImage() != null);
- menuBuilder.getJMenuItem("edit.deselectparts").setSelected(
- partsSelectionManager.isDeselectableSingleCategory());
- menuBuilder.getJMenuItem("edit.enableAutoShrink").setSelected(minimizeMode);
- menuBuilder.getJMenuItem("edit.enableZoomBox").setSelected(previewPane.isVisibleZoomBox());
- }
- });
- final JMenu mnuFavorites = menuBuilder.getJMenu("menu.favorite");
- mnuFavorites.addMenuListener(new MenuListener() {
- public void menuCanceled(MenuEvent e) {
- // do nothing.
- }
- public void menuDeselected(MenuEvent e) {
- // do nothing.
- }
- public void menuSelected(MenuEvent e) {
- onSelectedFavoriteMenu(mnuFavorites);
- }
- });
-
- // J2SE5ã®å ´åã¯ããã¼ããã£ã¬ã¯ããªãéããã³ãã³ãã¯ä½¿ç¨ä¸å¯ã¨ãã.
- if (System.getProperty("java.version").startsWith("1.5")) {
- menuBuilder.getJMenuItem("file.opendir").setEnabled(false);
- }
-
- // ãå§ããµã¤ãã¡ãã¥ã¼æ§ç¯
- final JMenu mnuRecomendation = menuBuilder.getJMenu("help.recommendations");
- JMenu mnuHelp = menuBuilder.getJMenu("menu.help");
- mnuHelp.addMenuListener(new MenuListener() {
- public void menuCanceled(MenuEvent e) {
- // do nothing.
- }
- public void menuDeselected(MenuEvent e) {
- // do nothing.
- }
- public void menuSelected(MenuEvent e) {
- onSelectedRecommendationMenu(mnuRecomendation);
- }
- });
-
- return menuBar;
- }
-
-}
+package charactermanaj.ui;
+
+import static java.lang.Math.*;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Cursor;
+import java.awt.Dialog.ModalityType;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.GraphicsEnvironment;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
+import java.awt.dnd.DropTarget;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseWheelEvent;
+import java.awt.event.MouseWheelListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.TreeMap;
+import java.util.UUID;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JCheckBox;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JColorChooser;
+import javax.swing.JFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollBar;
+import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
+import javax.swing.JSplitPane;
+import javax.swing.JViewport;
+import javax.swing.SwingUtilities;
+import javax.swing.event.AncestorEvent;
+import javax.swing.event.AncestorListener;
+import javax.swing.event.MenuEvent;
+import javax.swing.event.MenuListener;
+
+import charactermanaj.Main;
+import charactermanaj.clipboardSupport.ClipboardUtil;
+import charactermanaj.graphics.AsyncImageBuilder;
+import charactermanaj.graphics.ColorConvertedImageCachedLoader;
+import charactermanaj.graphics.ImageBuildJobAbstractAdaptor;
+import charactermanaj.graphics.ImageBuilder.ImageOutput;
+import charactermanaj.graphics.io.ImageSaveHelper;
+import charactermanaj.graphics.io.OutputOption;
+import charactermanaj.graphics.io.UkagakaImageSaveHelper;
+import charactermanaj.model.AppConfig;
+import charactermanaj.model.CharacterData;
+import charactermanaj.model.CharacterDataChangeEvent;
+import charactermanaj.model.CharacterDataChangeListener;
+import charactermanaj.model.CharacterDataChangeObserver;
+import charactermanaj.model.ColorGroup;
+import charactermanaj.model.CustomLayerOrder;
+import charactermanaj.model.IndependentPartsSetInfo;
+import charactermanaj.model.PartsCategory;
+import charactermanaj.model.PartsColorInfo;
+import charactermanaj.model.PartsColorManager;
+import charactermanaj.model.PartsIdentifier;
+import charactermanaj.model.PartsSet;
+import charactermanaj.model.RecommendationURL;
+import charactermanaj.model.WorkingSet;
+import charactermanaj.model.WorkingSet2;
+import charactermanaj.model.io.CharacterDataPersistent;
+import charactermanaj.model.io.CustomLayerOrderPersist;
+import charactermanaj.model.io.CustomLayerOrderPersist.CustomLayerOrderPersistListener;
+import charactermanaj.model.io.PartsImageCollectionParser.LayerOrderMapper;
+import charactermanaj.model.io.PartsImageDirectoryWatchAgent;
+import charactermanaj.model.io.PartsImageDirectoryWatchAgentFactory;
+import charactermanaj.model.io.PartsImageDirectoryWatchEvent;
+import charactermanaj.model.io.PartsImageDirectoryWatchListener;
+import charactermanaj.model.io.RecentDataPersistent;
+import charactermanaj.model.io.WorkingSetPersist;
+import charactermanaj.ui.ImageSelectPanel.ImageSelectPanelEvent;
+import charactermanaj.ui.ImageSelectPanel.ImageSelectPanelListener;
+import charactermanaj.ui.LayerOrderCustomizeDialog.LayerOrderCustomizeListener;
+import charactermanaj.ui.ManageFavoriteDialog.FavoriteManageCallback;
+import charactermanaj.ui.PreviewPanel.PreviewPanelEvent;
+import charactermanaj.ui.PreviewPanel.PreviewPanelListener;
+import charactermanaj.ui.model.ColorChangeEvent;
+import charactermanaj.ui.model.ColorChangeListener;
+import charactermanaj.ui.model.ColorGroupCoordinator;
+import charactermanaj.ui.model.CustomLayerPatternMgr;
+import charactermanaj.ui.model.FavoritesChangeEvent;
+import charactermanaj.ui.model.FavoritesChangeListener;
+import charactermanaj.ui.model.FavoritesChangeObserver;
+import charactermanaj.ui.model.PartsColorCoordinator;
+import charactermanaj.ui.model.PartsSelectionManager;
+import charactermanaj.ui.model.WallpaperFactory;
+import charactermanaj.ui.model.WallpaperFactoryErrorRecoverHandler;
+import charactermanaj.ui.model.WallpaperFactoryException;
+import charactermanaj.ui.model.WallpaperInfo;
+import charactermanaj.ui.scrollablemenu.JScrollableMenu;
+import charactermanaj.ui.util.FileDropTarget;
+import charactermanaj.ui.util.WindowAdjustLocationSupport;
+import charactermanaj.util.DesktopUtilities;
+import charactermanaj.util.ErrorMessageHelper;
+import charactermanaj.util.LocalizedResourcePropertyLoader;
+import charactermanaj.util.SystemUtil;
+import charactermanaj.util.UIHelper;
+
+
+/**
+ * ã¡ã¤ã³ãã¬ã¼ã .
+ * ã¢ããªã±ã¼ã·ã§ã³ãã¢ã¯ãã£ãã§ããå ´åã¯æä½ã§ã1ã¤ã®ã¡ã¤ã³ãã¬ã¼ã ã表示ããã¦ãã.
+ *
+ * @author seraphy
+ */
+public class MainFrame extends JFrame
+ implements
+ FavoritesChangeListener,
+ CharacterDataChangeListener,
+ CustomLayerOrderPersistListener {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Logger logger = Logger.getLogger(MainFrame.class.getName());
+
+
+ protected static final String STRINGS_RESOURCE = "languages/mainframe";
+
+ protected static final String MENU_STRINGS_RESOURCE = "menu/menu";
+
+ /**
+ * ã¡ã¤ã³ãã¬ã¼ã ã®ã¢ã¤ã³ã³.
+ */
+ protected BufferedImage icon;
+
+
+ /**
+ * ç¾å¨ã¢ã¯ãã£ããªã¡ã¤ã³ãã¬ã¼ã .
+ * ãã©ã¼ã«ã¹ãåãæ¿ãããã³ã«ã¢ã¯ãã£ããã¬ã¼ã ã追跡ãã.
+ * Mac OS Xã®About/Preferences/Quitã®ã·ã¹ãã ã¡ãã¥ã¼ãããã³ã ãããå ´åã«
+ * ãªã¼ãã¼ããã¹ãã¡ã¤ã³ãã¬ã¼ã ãèå¥ããããã®ãã®.
+ */
+ private static volatile MainFrame activedMainFrame;
+
+
+ /**
+ * ãã®ã¡ã¤ã³ãã¬ã¼ã ã対象ã¨ãããã£ã©ã¯ã¿ã¼ãã¼ã¿.
+ */
+ protected CharacterData characterData;
+
+
+ /**
+ * ãã¬ãã¥ã¼ãã¤ã³
+ */
+ private PreviewPanel previewPane;
+
+ /**
+ * ãã¼ãé¸æããã¼ã¸ã£
+ */
+ protected PartsSelectionManager partsSelectionManager;
+
+ /**
+ * ããã«ã®æå°åã¢ã¼ã
+ */
+ private boolean minimizeMode;
+
+
+ /**
+ * ãã¼ãé¸æããã«ãªã¹ã
+ */
+ protected ImageSelectPanelList imageSelectPanels;
+
+ /**
+ * ãã¼ãé¸æããã«ãç´ããã¹ã¯ãã¼ã«ãã¤ã³
+ */
+ protected JScrollPane imgSelectPanelsPanelSp;
+
+ /**
+ * ã«ã©ã¼ã°ã«ã¼ãã®ããã¼ã¸ã£
+ */
+ protected ColorGroupCoordinator colorGroupCoordinator;
+
+ /**
+ * ãã¼ãã«ã©ã¼ã®ããã¼ã¸ã£
+ */
+ protected PartsColorCoordinator partsColorCoordinator;
+
+
+ /**
+ * ãã£ãã·ã¥ã¤ãã®ã¤ã¡ã¼ã¸ãã¼ã.
+ */
+ private ColorConvertedImageCachedLoader imageLoader;
+
+ /**
+ * ãã¼ããçµã¿ç«ã¦ã¦1ã¤ã®ãã¬ãã¥ã¼å¯è½ãªã¤ã¡ã¼ã¸ãæ§ç¯ããããã®ãã«ã
+ */
+ private AsyncImageBuilder imageBuilder;
+
+
+ /**
+ * ãã¼ãã¤ã¡ã¼ã¸ãç»åã¨ãã¦ä¿åããå ´åã®ãã«ãã¼.
+ * æå¾ã«ä½¿ã£ããã£ã¬ã¯ããªãä¿æããããã®ã¡ã³ãå¤æ°ã¨ãã¦ãã.
+ */
+ private ImageSaveHelper imageSaveHelper = new ImageSaveHelper();
+
+ /**
+ * 伺ãç¨åºåãã«ã.
+ * æå¾ã«ä½¿ã£ããã£ã¬ã¯ããªããã¡ã¤ã«åãã¢ã¼ããªã©ãä¿æããããã®ã¡ã³ãå¤æ°ã¨ãã¦ãã.
+ */
+ private UkagakaImageSaveHelper ukagakaImageSaveHelper = new UkagakaImageSaveHelper();
+
+ /**
+ * ãã¼ããã£ã¬ã¯ããªãå®æçã«ãã§ãã¯ãããã¼ãã¤ã¡ã¼ã¸ãå¤æ´ã»è¿½å ã»åé¤ããã¦ããå ´åã« ãã¼ããªã¹ããæ´æ°ããããã®ã¦ã©ããã£ã¼
+ */
+ private PartsImageDirectoryWatchAgent watchAgent;
+
+ /**
+ * ããã©ã«ãã®ãã¼ãã»ãã表示å
+ */
+ private String defaultPartsSetTitle;
+
+ /**
+ * æå¾ã«ä½¿ç¨ããããªã»ãã.
+ * (ä¸åº¦ãããªã»ããã使ç¨ãã¦ããªããã°null).
+ */
+ private PartsSet lastUsePresetParts;
+
+ /**
+ * æå¾ã«ä½¿ç¨ããæ¤ç´¢ãã¤ã¢ãã°.
+ * nullã§ããã°ä¸åº¦ã使ç¨ãã¦ããªã.
+ * (nullã§ãªãã¨ãéãããã¦ããå¯è½æ§ããã.)
+ */
+ private SearchPartsDialog lastUseSearchPartsDialog;
+
+ /**
+ * æå¾ã«ä½¿ç¨ãããæ°ã«å
¥ããã¤ã¢ãã°.
+ * nullã§ããã°ä¸åº¦ã使ç¨ãã¦ããªã.
+ * (nullã§ãªãã¨ãéãããã¦ããå¯è½æ§ããã.)
+ */
+ private ManageFavoriteDialog lastUseManageFavoritesDialog;
+
+ /**
+ * æå¾ã«ä½¿ç¨ãããã¼ãã®ã©ã³ãã é¸æãã¤ã¢ãã°.
+ * nullã§ããã°ä¸åº¦ã使ç¨ãã¦ããªã.
+ * (nullã§ãªãã¨ãéãããã¦ããå¯è½æ§ããã.)
+ */
+ private PartsRandomChooserDialog lastUsePartsRandomChooserDialog;
+
+ /**
+ * æå¾ã«ä½¿ç¨ããå£ç´æ
å ±
+ */
+ private WallpaperInfo wallpaperInfo;
+
+ /**
+ * ã«ã¹ã¿ã ã¬ã¤ã¤ã¼ãã¿ã¼ã³ã®ãªã¹ãã管çãã
+ */
+ private final CustomLayerPatternMgr customLayerPatternMgr = new CustomLayerPatternMgr();
+
+ /**
+ * ã¢ã¯ãã£ããªã¡ã¤ã³ãã¬ã¼ã ãè¨å®ãã.
+ *
+ * @param mainFrame
+ * ã¡ã¤ã³ãã¬ã¼ã
+ */
+ public static void setActivedMainFrame(MainFrame mainFrame) {
+ if (mainFrame == null) {
+ throw new IllegalArgumentException();
+ }
+ activedMainFrame = mainFrame;
+ }
+
+ /**
+ * ç¾å¨ã¢ã¯ãã£ããªã¡ã¤ã³ãã¬ã¼ã ãåå¾ãã. ã¾ã ã¡ã¤ã³ãã¬ã¼ã ãéããã¦ããªãå ´åã¯null.
+ * æå¾ã®ã¡ã¤ã³ãã¬ã¼ã ãç ´æ£ä¸ããããã¯ç ´æ£æ¸ã¿ã§ããã°ç ´æ£ããããã¬ã¼ã ã示ããã¨ã«æ³¨æ.
+ *
+ * @return ã¡ã¤ã³ãã¬ã¼ã ããããã¯null
+ */
+ public static MainFrame getActivedMainFrame() {
+ return activedMainFrame;
+ }
+
+ /**
+ * ãã£ã©ã¯ã¿ã¼ãã¼ã¿ãå¤æ´ãããå ´åã«éç¥ããã.
+ */
+ public void notifyChangeCharacterData(final CharacterDataChangeEvent e) {
+ final CharacterData cd = e.getCharacterData();
+ if (cd != null
+ && cd.getDocBase().equals(
+ MainFrame.this.characterData.getDocBase())) {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ try {
+ Cursor oldCur = getCursor();
+ setCursor(Cursor
+ .getPredefinedCursor(Cursor.WAIT_CURSOR));
+ try {
+ if (e.isChangeStructure()) {
+ // ç¾å¨æ
å ±ã®ä¿å
+ saveWorkingSet();
+
+ // ç»é¢æ§æã®åæ§ç¯
+ initComponent(cd);
+ }
+
+ if (e.isReloadPartsAndFavorites()) {
+ // ãã¼ãã¨ãæ°ã«å
¥ãã®ãªãã¼ã
+ reloadPartsAndFavorites(cd, true);
+ }
+
+ } finally {
+ setCursor(oldCur != null ? oldCur : Cursor
+ .getDefaultCursor());
+ }
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(MainFrame.this, ex);
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * ãæ°ã«å
¥ããã¼ã¿ãå¤æ´ãããå ´åã«éç¥ããã.
+ *
+ * @param e
+ */
+ @Override
+ public void notifyChangeFavorites(FavoritesChangeEvent e) {
+ CharacterData cd = e.getCharacterData();
+ if (cd != null
+ && cd.getDocBase().equals(
+ MainFrame.this.characterData.getDocBase())) {
+ if (!MainFrame.this.equals(e.getSource())
+ && !characterData.equals(cd)) {
+ // ããªã»ããã¨ãæ°ã«å
¥ããææ°åãã.
+ // ãã ããèªåèªèº«ããéä¿¡ããã¤ãã³ãã®å ´åã¯ææ°åã¯ä¸è¦.
+ characterData.clearPartsSets(false);
+ for (Map.Entry entry : cd.getPartsSets()
+ .entrySet()) {
+ PartsSet partsSet = entry.getValue();
+ characterData.addPartsSet(partsSet);
+ }
+ }
+
+ // ãæ°ã«å
¥ã管çãã¤ã¢ãã°ä¸ã®ãæ°ã«å
¥ãä¸è¦§ãææ°ã«æ´æ°ãã.
+ if (lastUseManageFavoritesDialog != null
+ && lastUseManageFavoritesDialog.isDisplayable()) {
+ lastUseManageFavoritesDialog.initListModel();
+ }
+ }
+ }
+
+ /**
+ * å¤é¨ã§ã«ã¹ã¿ã ã¬ã¤ã¤ã¼ã®å®ç¾©ãå¤æ´ãããå ´åã«å¼ã³åºããã
+ * @param e
+ */
+ @Override
+ public void notifyChangeCustomLayerOrder(CustomLayerOrderPersistListener.Change e) {
+ if (!e.getSource().equals(characterData)) { // èªåãéä¿¡å
ã®å ´åã¯ä½ãããªã
+ Map> map = e.getCustomLayerOrderMap();
+ if (map != null) {
+ customLayerPatternMgr.setMap(map);
+ requestPreview();
+ }
+ }
+ }
+
+ /**
+ * ã¡ã¤ã³ãã¬ã¼ã ãæ§ç¯ãã.
+ *
+ * @param characterData
+ * ãã£ã©ã¯ã¿ã¼ãã¼ã¿
+ */
+ public MainFrame(CharacterData characterData) {
+ try {
+ if (characterData == null) {
+ throw new IllegalArgumentException();
+ }
+
+ setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
+ addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(WindowEvent e) {
+ onCloseProfile();
+ }
+ @Override
+ public void windowClosed(WindowEvent e) {
+ stopAgents();
+ }
+ @Override
+ public void windowActivated(WindowEvent e) {
+ setActivedMainFrame(MainFrame.this);
+ }
+ @Override
+ public void windowOpened(WindowEvent e) {
+ // do nothing.
+ }
+ });
+
+ // ã¢ã¤ã³ã³ã®è¨å®
+ icon = UIHelper.getInstance().getImage("icons/icon.png");
+ setIconImage(icon);
+
+ // ç»é¢ã³ã³ãã¼ãã³ãä½æ
+ initComponent(characterData);
+ JMenuBar menuBar = createMenuBar();
+ setJMenuBar(menuBar);
+
+ // ãæ°ã«å
¥ãå¤æ´éç¥ãåãåã
+ FavoritesChangeObserver.getDefault().addFavoritesChangeListener(
+ this);
+ // ãã£ã©ã¯ã¿ã¼ãã¼ã¿ã®å¤æ´éç¥ãåãåã
+ CharacterDataChangeObserver.getDefault()
+ .addCharacterDataChangeListener(this);
+
+ // ã¬ã¤ã¤ã¼ãã¿ã¼ã³ã®å¤æ´éç¥ãåãåã
+ CustomLayerOrderPersist.newInstance(characterData)
+ .addCustomLayerOrderPersistListener(this);
+
+ } catch (RuntimeException ex) {
+ logger.log(Level.SEVERE, "ã¡ã¤ã³ãã¬ã¼ã ã®æ§ç¯ä¸ã«äºæãã¬ä¾å¤ãçºçãã¾ããã", ex);
+ dispose(); // ã³ã³ã¹ãã©ã¯ã¿ãå¼ã°ããæç¹ã§JFrameã¯æ§ç¯æ¸ã¿ãªã®ã§disposeã®å¿
è¦ããã.
+ throw ex;
+ } catch (Error ex) {
+ logger.log(Level.SEVERE, "ã¡ã¤ã³ãã¬ã¼ã ã®æ§ç¯ä¸ã«è´å½çãªä¾å¤ãçºçãã¾ããã", ex);
+ dispose(); // ã³ã³ã¹ãã©ã¯ã¿ãå¼ã°ããæç¹ã§JFrameã¯æ§ç¯æ¸ã¿ãªã®ã§disposeã®å¿
è¦ããã.
+ throw ex;
+ }
+ }
+
+ /**
+ * ããã©ã«ãã®ã¦ã£ã³ãã¦ä½ç½®ã¨ãµã¤ãºã®è¨å®
+ */
+ private void setDefaultWindowLocation() {
+ // ã¡ã¤ã³ã¹ã¯ãªã¼ã³ãµã¤ãºãåå¾ãã.
+ GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();
+ Rectangle desktopSize = genv.getMaximumWindowBounds(); // ã¡ã¤ã³ã¹ã¯ãªã¼ã³ã®ãµã¤ãº(ãã¹ã¯ãããé åã®ã¿)
+ logger.log(Level.CONFIG, "desktopSize=" + desktopSize);
+
+ Dimension imageSize = characterData.getImageSize();
+ // ç»åãµã¤ãº300x400ãåºæºãµã¤ãºã¨ãã¦ããã以ä¸ã«ã¯ãªããªã.
+ // ã¢ããªã±ã¼ã·ã§ã³è¨å®ã®æ大ãµã¤ãºä»¥ä¸ã®å ´åã¯ã¦ã£ã³ãã¦ãµã¤ãºã¯åºå®ãã¦ã¹ã¯ãã¼ã«ãã¼ã«ä»»ãã
+ AppConfig appConfig = AppConfig.getInstance();
+ int maxWidth = min(desktopSize.width, appConfig.getMainFrameMaxWidth());
+ int maxHeight = min(desktopSize.height, appConfig.getMainFrameMaxHeight());
+ int imageWidth = min(maxWidth, max(300, imageSize != null ? imageSize.width : 0));
+ int imageHeight = min(maxHeight, max(400, imageSize != null ? imageSize.height : 0));
+ // 300x400ã®ç»åã®å ´åã«ã¡ã¤ã³ãã¬ã¼ã ã600x550ã ã¨ã¡ããã©ããæã.
+ // ãã以ä¸å¤§ããç»åã®å ´åã¯å¢ããåã ããã¬ã¼ã ã大ãããã¦ãã.
+ setSize(imageWidth - 300 + 600, imageHeight - 400 + 550);
+
+ // 次å表示æã«ãã©ãããã©ã¼ã åºæä½ç½®ã«è¡¨ç¤ºããããã«äºç´
+ setLocationByPlatform(true);
+ }
+
+ /**
+ * ã¡ã¤ã³ãã¬ã¼ã ã表示ãã.
+ * ãã¹ã¯ãããé åããã¯ã¿åºããå ´åã¯ä½ç½®ãè£æ£ãã.
+ */
+ public void showMainFrame() {
+ // ã¡ã¤ã³ã¹ã¯ãªã¼ã³ãµã¤ãºãåå¾ãã.
+ GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();
+ Rectangle desktopSize = genv.getMaximumWindowBounds(); // ã¡ã¤ã³ã¹ã¯ãªã¼ã³ã®ãµã¤ãº(ãã¹ã¯ãããé åã®ã¿)
+ logger.log(Level.CONFIG, "desktopSize=" + desktopSize);
+
+ // ãã©ãããã©ã¼ã åºæã®ä½ç½®ãããã§è¡¨ç¤ºãã.
+ // 表示ããçµæãã¯ã¿åºãã¦ããå ´åã¯0,0ã«è£æ£ãã.
+ setVisible(true);
+ Point loc = getLocation();
+ logger.log(Level.CONFIG, "windowLocation=" + loc);
+ Dimension windowSize = getSize();
+ if (loc.y + windowSize.height >= desktopSize.height) {
+ loc.y = 0;
+ }
+ if (loc.x + windowSize.width >= desktopSize.width) {
+ loc.x = 0;
+ }
+ if (loc.x == 0 || loc.y == 0) {
+ setLocation(loc);
+ }
+
+ // ãã¹ã¯ãããããã大ããå ´åã¯å°ãããã.
+ boolean resize = false;
+ Dimension dim = getSize();
+ if (dim.height > desktopSize.height) {
+ dim.height = desktopSize.height;
+ resize = true;
+ }
+ if (dim.width > desktopSize.width) {
+ dim.width = desktopSize.width;
+ resize = true;
+ }
+ if (resize) {
+ setSize(dim);
+ }
+ }
+
+ /**
+ * ãã®ã¡ã¤ã³ãã¬ã¼ã ã«é¢é£ã¥ãããã¦ããã¨ã¼ã¸ã§ã³ãã¹ã¬ãããåæ¢ãã¾ã.
+ * ãã§ã«åæ¢ãã¦ããå ´åã¯ä½ããã¾ããã
+ */
+ protected void stopAgents() {
+ // ã¨ã¼ã¸ã§ã³ããåæ¢
+ if (watchAgent != null) {
+ try {
+ watchAgent.disconnect();
+
+ } catch (Throwable ex) {
+ logger.log(Level.SEVERE, "ãã©ã«ãç£è¦ã¹ã¬ããã®åæ¢ã«å¤±æãã¾ããã", ex);
+ }
+ watchAgent = null;
+ }
+ // ã¤ã¡ã¼ã¸ãã«ããåæ¢
+ if (imageBuilder != null) {
+ try {
+ imageBuilder.stop();
+
+ } catch (Throwable ex) {
+ logger.log(Level.SEVERE, "éåæã¤ã¡ã¼ã¸ãã«ãã¹ã¬ããã®åæ¢ã«å¤±æãã¾ããã", ex);
+ }
+ imageBuilder = null;
+ }
+ }
+
+ /**
+ * ã¡ã¤ã³ãã¬ã¼ã ãç ´æ£ãã¾ã.
+ */
+ @Override
+ public void dispose() {
+ FavoritesChangeObserver.getDefault()
+ .removeFavoritesChangeListener(this);
+ CharacterDataChangeObserver.getDefault()
+ .removeCharacterDataChangeListener(this);
+ CustomLayerOrderPersist.newInstance(characterData)
+ .removeCustomLayerOrderPersistListener(this);
+
+ imageLoader.close();
+ stopAgents();
+ super.dispose();
+ }
+
+ /**
+ * ç»é¢ã³ã³ãã¼ãã³ããè¨å®ãã¾ã.
+ * ãã§ã«è¨å®ããã¦ããå ´åã¯ä¸æ¦åé¤ãããã®ã¡ã«åä½æããã¾ã.
+ */
+ private void initComponent(CharacterData characterData) {
+
+ CharacterData oldCd;
+ synchronized (this) {
+ oldCd = this.characterData;
+ if (oldCd != null) {
+ // 使ç¨ä¸ã®ãã£ã©ã¯ã¿ã¼ãã¼ã¿ã§ãããã¨ãç»é²è§£é¤ããã
+ ProfileListManager.unregisterUsedCharacterData(oldCd);
+ }
+ this.characterData = characterData;
+
+ // 使ç¨ä¸ã®ãã£ã©ã¯ã¿ã¼ãã¼ã¿ã§ãããã¨ãç»é²ãã.
+ ProfileListManager.registerUsedCharacterData(characterData);
+ }
+
+ // è¨å®ã¾ããæºå
+ AppConfig appConfig = AppConfig.getInstance();
+ Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
+ .getLocalizedProperties(STRINGS_RESOURCE);
+
+ // ã¿ã¤ãã«è¡¨ç¤º
+ String title;
+ if (Main.isMacOSX()) {
+ // Mac OS Xã®å ´åã¯ã¦ã£ã³ãã¦ã«ã¿ã¤ãã«ã¯ã¤ããªãã
+ title = "";
+ } else {
+ title = strings.getProperty("title");
+ }
+ setTitle(title + characterData.getName());
+
+ // ããã©ã«ãã®ãã¼ãã»ãã表示å
+ defaultPartsSetTitle = strings.getProperty("defaultPartsSetTitle");
+
+ // ã¨ã¼ã¸ã§ã³ãã®åæ¢
+ stopAgents();
+
+ // ã³ã³ãã¼ãã³ãé
ç½®
+ Container contentPane = getContentPane();
+
+ // ãã§ã«ããã³ã³ãã¼ãã³ããåé¤
+ for (Component comp : contentPane.getComponents()) {
+ contentPane.remove(comp);
+ }
+ // éãã¦ããæ¤ç´¢ãã¤ã¢ãã°ãéãã
+ closeSearchDialog();
+
+ // éãã¦ãããæ°ã«å
¥ã管çãã¤ã¢ãã°ãéãã
+ closeManageFavoritesDialog();
+
+ // éãã¦ããã©ã³ãã é¸æãã¤ã¢ãã°ãéãã.
+ closePartsRandomChooserDialog();
+
+ PartsColorManager partsColorManager = characterData.getPartsColorManager();
+
+ // ããã©ã«ãã®èæ¯è²ã®è¨å®
+ Color bgColor = appConfig.getDefaultImageBgColor();
+ wallpaperInfo = new WallpaperInfo();
+ wallpaperInfo.setBackgroundColor(bgColor);
+
+ if (imageLoader != null) {
+ imageLoader.close();
+ }
+ imageLoader = new ColorConvertedImageCachedLoader();
+ imageBuilder = new AsyncImageBuilder(imageLoader);
+ partsSelectionManager = new PartsSelectionManager(partsColorManager,
+ new PartsSelectionManager.ImageBgColorProvider() {
+ public Color getImageBgColor() {
+ return wallpaperInfo.getBackgroundColor();
+ }
+ public void setImageBgColor(Color imageBgColor) {
+ applyBackgroundColorOnly(imageBgColor);
+ }
+ });
+ colorGroupCoordinator = new ColorGroupCoordinator(partsSelectionManager, partsColorManager);
+ partsColorCoordinator = new PartsColorCoordinator(characterData, partsColorManager, colorGroupCoordinator);
+ PartsImageDirectoryWatchAgentFactory agentFactory = PartsImageDirectoryWatchAgentFactory.getFactory();
+ watchAgent = agentFactory.getAgent(characterData);
+
+ previewPane = new PreviewPanel();
+ previewPane.setTitle(defaultPartsSetTitle);
+ previewPane.addPreviewPanelListener(new PreviewPanelListener() {
+ public void addFavorite(PreviewPanelEvent e) {
+ if (!e.isShiftKeyPressed()) {
+ // ãæ°ã«å
¥ãç»é²
+ onRegisterFavorite();
+
+ } else {
+ // ã·ãããã¼ã«ã¦ããæ°ã«å
¥ãã®ç®¡çãéã
+ onManageFavorites();
+ }
+ }
+ public void changeBackgroundColor(PreviewPanelEvent e) {
+ if ( !e.isShiftKeyPressed()) {
+ // å£ç´é¸æ
+ onChangeWallpaper();
+
+ } else {
+ // ã·ãããã¼ã«ã¦èæ¯è²å¤æ´
+ onChangeBgColor();
+ }
+ }
+ public void copyPicture(PreviewPanelEvent e) {
+ onCopy(e.isShiftKeyPressed());
+ }
+ public void savePicture(PreviewPanelEvent e) {
+ if ( !e.isShiftKeyPressed()) {
+ // ç»ååºå
+ onSavePicture();
+
+ } else {
+ // ã·ãããã¼ã«ã¦ã伺ããç¨åºå
+ onSaveAsUkagaka();
+ }
+ }
+ public void showInformation(PreviewPanelEvent e) {
+ onInformation();
+ }
+ public void flipHorizontal(PreviewPanelEvent e) {
+ onFlipHolizontal();
+ }
+ });
+
+ imageSelectPanels = new ImageSelectPanelList();
+
+ JPanel imgSelectPanelsPanel = new JPanel();
+ BoxLayout bl = new BoxLayout(imgSelectPanelsPanel, BoxLayout.PAGE_AXIS);
+ imgSelectPanelsPanel.setLayout(bl);
+ for (PartsCategory category : characterData.getPartsCategories()) {
+ final ImageSelectPanel imageSelectPanel = new ImageSelectPanel(category, characterData);
+ imgSelectPanelsPanel.add(imageSelectPanel);
+ imageSelectPanels.add(imageSelectPanel);
+ partsSelectionManager.register(imageSelectPanel);
+ }
+
+ imgSelectPanelsPanelSp = new JScrollPane(imgSelectPanelsPanel) {
+ private static final long serialVersionUID = 1L;
+ @Override
+ public JScrollBar createVerticalScrollBar() {
+ JScrollBar sb = super.createVerticalScrollBar();
+ sb.setUnitIncrement(12);
+ return sb;
+ }
+ };
+ imgSelectPanelsPanelSp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
+
+ JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, imgSelectPanelsPanelSp, previewPane);
+ contentPane.add(splitPane, BorderLayout.CENTER);
+
+
+ imgSelectPanelsPanelSp.requestFocus();
+
+ ArrayList colorGroups = new ArrayList();
+ colorGroups.addAll(characterData.getColorGroups());
+
+ final ColorChangeListener colorChangeListener = new ColorChangeListener() {
+ public void onColorGroupChange(ColorChangeEvent event) {
+ // do nothing.
+ }
+ public void onColorChange(ColorChangeEvent event) {
+ MainFrame.this.requestPreview();
+ }
+ };
+ colorGroupCoordinator.addColorChangeListener(colorChangeListener);
+
+ for (int idx = 0; idx < imageSelectPanels.size(); idx++) {
+ ImageSelectPanel imageSelectPanel = imageSelectPanels.get(idx);
+ final PartsCategory partsCategory = imageSelectPanel.getPartsCategory();
+ final ColorDialog colorDialog = new ColorDialog(this, partsCategory, colorGroups);
+ colorGroupCoordinator.registerColorDialog(colorDialog);
+ partsColorCoordinator.register(imageSelectPanel, colorDialog);
+ final int curidx = idx;
+ imageSelectPanel.addImageSelectListener(new ImageSelectPanelListener() {
+ public void onChangeColor(ImageSelectPanelEvent event) {
+ WindowAdjustLocationSupport.alignRight(
+ MainFrame.this, colorDialog, curidx, false);
+ colorDialog.setVisible(!colorDialog.isVisible());
+ }
+ public void onPreferences(ImageSelectPanelEvent event) {
+ // do nothing. (not supported)
+ }
+ public void onChange(ImageSelectPanelEvent event) {
+ MainFrame.this.requestPreview();
+ }
+ public void onSelectChange(ImageSelectPanelEvent event) {
+ // do nothing.
+ }
+ public void onTitleClick(ImageSelectPanelEvent event) {
+ PartsCategory partsCategory = (event != null) ?
+ event.getImageSelectPanel().getPartsCategory() : null;
+ MainFrame.this.onClickPartsCategoryTitle(partsCategory, false);
+ }
+ public void onTitleDblClick(ImageSelectPanelEvent event) {
+ PartsCategory partsCategory = (event != null) ?
+ event.getImageSelectPanel().getPartsCategory() : null;
+ MainFrame.this.onClickPartsCategoryTitle(partsCategory, true);
+ }
+ });
+ imageSelectPanel.addAncestorListener(new AncestorListener() {
+ public void ancestorAdded(AncestorEvent event) {
+ }
+ public void ancestorMoved(AncestorEvent event) {
+ }
+ public void ancestorRemoved(AncestorEvent event) {
+ // ããã«ãããã¯ããã®è¦ªãåé¤ãããã¨ãã«ãã¤ã¢ãã°ãé表示ã¨ããã
+ colorDialog.setVisible(false);
+ }
+ });
+ }
+
+ // å
¨ãã¼ãã®ãã¼ã
+ partsSelectionManager.loadParts();
+
+ // ç»é²ããã¦ããã«ã¹ã¿ã ã¬ã¤ã¤ã¼ãã¿ã¼ã³ã®ãã¼ã
+ loadCustomLayerOrder();
+
+ // ä¿åããã¦ããã¯ã¼ãã³ã°ã»ããã復å
ãã.
+ // 復å
ã§ããªãã£ãå ´åã¯ãã¼ãã»ãããåæé¸æãã.
+ if ( !loadWorkingSet()) {
+ // ã¯ã¼ãã³ã°ã»ããããªãå ´åã¯
+ // ããã©ã«ãã®ã¦ã£ã³ãã¦ä½ç½®ã¨ãµã¤ãº
+ setDefaultWindowLocation();
+
+ // ããã©ã«ãã®ãã¼ãã»ããã®è¡¨ç¤º
+ if (showDefaultParts(true)) {
+ requestPreview();
+ }
+ }
+
+ // é¸æããã¦ãããã¼ããè¦ããç¶æ
ã«ãã
+ scrollToSelectedParts();
+
+ // éåæã¤ã¡ã¼ã¸ãã¼ãã®å¦çéå§
+ if (!imageBuilder.isAlive()) {
+ imageBuilder.start();
+ }
+
+ // ããããã¿ã¼ã²ããã®è¨å®
+ new DropTarget(imgSelectPanelsPanelSp, new FileDropTarget() {
+ @Override
+ protected void onDropFiles(final List dropFiles) {
+ if (dropFiles == null || dropFiles.isEmpty()) {
+ return;
+ }
+ // ã¤ã³ãã¼ããã¤ã¢ãã°ãéã.
+ // ããããã½ã¼ã¹ã®å¦çãããããã³ã°ããªãããã«ã
+ // ãããããã³ãã©ã®å¦çãçµäºãã¦ããã¤ã³ãã¼ããã¤ã¢ãã°ãéãããã«ãã.
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ onImport(dropFiles);
+ }
+ });
+ }
+ @Override
+ protected void onException(Exception ex) {
+ ErrorMessageHelper.showErrorDialog(MainFrame.this, ex);
+ }
+ });
+
+ // ãã£ã¬ã¯ããªãç£è¦ãå¤æ´ããã£ãå ´åã«ãã¼ãããªãã¼ããããªã¹ã
+ watchAgent.addPartsImageDirectoryWatchListener(new PartsImageDirectoryWatchListener() {
+ public void detectPartsImageChange(PartsImageDirectoryWatchEvent e) {
+ Runnable refreshJob = new Runnable() {
+ public void run() {
+ onDetectPartsImageChange();
+ }
+ };
+ if (SwingUtilities.isEventDispatchThread()) {
+ refreshJob.run();
+ } else {
+ SwingUtilities.invokeLater(refreshJob);
+ }
+ }
+ });
+
+ // ç£è¦ãæå¹ã§ããã°ããã£ã¬ã¯ããªã®ç£è¦ãã¹ã¿ã¼ããã
+ if (appConfig.isEnableDirWatch() && characterData.isWatchDirectory()) {
+ watchAgent.connect();
+ }
+
+ // ãã¼ãã«ãã´ãªã®èªå縮å°ãè¨å®ããã¦ããå ´å
+ minimizeMode = false;
+ if (appConfig.isEnableAutoShrinkPanel()) {
+ onClickPartsCategoryTitle(null, true);
+ }
+
+ // ã³ã³ãã¼ãã³ãã®åæ§ç¯ã®å ´å
+ if (oldCd != null) {
+ validate();
+ }
+ }
+
+ /**
+ * ãã¼ããå¤æ´ããããã¨ãæ¤ç¥ããå ´å.
+ * ãã¼ããã¼ã¿ããªãã¼ãããåã«ãã´ãªã®ãã¼ãä¸è¦§ãå表示ããããã¬ãã¥ã¼ãæ´æ°ãã.
+ */
+ protected void onDetectPartsImageChange() {
+ try {
+ reloadPartsAndFavorites(null, true);
+
+ } catch (IOException ex) {
+ logger.log(Level.SEVERE, "parts reload failed. " + characterData, ex);
+ }
+ }
+
+ /**
+ * ãã¹ã¦ã®ã«ãã´ãªã®ãªã¹ãã§é¸æä¸ã®ã¢ã¤ãã ãè¦ããããã«ã¹ã¯ãã¼ã«ãã.
+ */
+ protected void scrollToSelectedParts() {
+ partsSelectionManager.scrollToSelectedParts();
+ }
+
+ /**
+ * æå®ãããã¼ãã«ãã´ãªä»¥å¤ã®ãã¼ãé¸æããã«ãæå°åãã.
+ *
+ * @param partsCategory
+ * ãã¼ãã«ãã´ãªãnullã®å ´åã¯å
¨ã¦æå°åãã.
+ * @param dblClick
+ * ããã«ã¯ãªãã¯
+ */
+ protected void onClickPartsCategoryTitle(PartsCategory partsCategory, boolean dblClick) {
+ if (logger.isLoggable(Level.FINE)) {
+ logger.log(Level.FINE, "onClickPartsCategoryTitle category="
+ + partsCategory + "/clickCount=" + dblClick);
+ }
+ if (dblClick) {
+ minimizeMode = !minimizeMode;
+ if (!minimizeMode) {
+ partsSelectionManager.setMinimizeModeIfOther(null, false);
+ return;
+ }
+ }
+ if (minimizeMode) {
+ if (partsSelectionManager.isNotMinimizeModeJust(partsCategory)) {
+ partsSelectionManager.setMinimizeModeIfOther(null, true); // å
¨é¨ç¸®å°
+
+ } else {
+ partsSelectionManager.setMinimizeModeIfOther(partsCategory, true);
+ if (partsCategory != null) {
+ // 対象ã®ããã«ãã¹ã¯ãã¼ã«ãã¤ã³å
ã«è¦ããç¨ã«ã¹ã¯ãã¼ã«ãã.
+ // ã¹ã¯ãã¼ã«ãã¼ã®ä½ç½®æå®ãªã©ã®åº§æ¨ç³»ã®æä½ã¯ãè¦æ±ãã§ãããå®éã«é©ç¨ãããã¾ã§æ¬å½ã®ä½ç½®ã¯åããªãã
+ // ãã£ã¦ä»¥ä¸ã®å¦çã¯éåæã«è¡ããå
ã«åº§æ¨ã確å®ããããã®ã«å¯¾ãã¦è¡ãå¿
è¦ãããã
+ final ImageSelectPanel panel = imageSelectPanels.findByPartsCategory(partsCategory);
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ final Point pt = panel.getLocation();
+ JViewport viewPort = imgSelectPanelsPanelSp.getViewport();
+ viewPort.setViewPosition(pt);
+ viewPort.revalidate();
+ }
+ });
+ }
+ }
+ }
+ }
+
+ /**
+ * ããã©ã«ããã¼ããé¸æãã.
+ * ããã©ã«ããã¼ãããªããã°ãæ°ã«å
¥ãã®æåã®ãã®ãé¸æãã.
+ * ããããªããã°ç©ºã¨ãã¦è¡¨ç¤ºãã.
+ * ãã¼ãã®é©ç¨ã«å¤±æããå ´åã¯falseãè¿ãã¾ã.(ä¾å¤ã¯è¿ããã¾ãã.)
+ *
+ * @param force
+ * ãã§ã«é¸æããã£ã¦ãé¸æããªããå ´åã¯trueãfalseã®å ´åã¯é¸æãããã°ä½ãããªã.
+ * @return ãã¼ãé¸æãããå ´åãforce=trueã®å ´åã¯ã¨ã©ã¼ããªããã°å¸¸ã«trueã¨ãªãã¾ãã
+ */
+ protected boolean showDefaultParts(boolean force) {
+ try {
+ if (!force) {
+ // ç¾å¨é¸æä¸ã®ãã¼ããåå¾ãã.(ãªããã°ç©º)
+ PartsSet sel = partsSelectionManager.createPartsSet();
+ if (!sel.isEmpty()) {
+ // å¼·å¶é¸æã§ãªãå ´åããã§ã«é¸ææ¸ã¿ã®ãã¼ããããã°ä½ãããªã.
+ return false;
+ }
+ }
+
+ // ããã©ã«ãã®ãã¼ãã»ãããåå¾ãã
+ String defaultPresetId = characterData.getDefaultPartsSetId();
+ PartsSet partsSet = null;
+ if (defaultPresetId != null) {
+ partsSet = characterData.getPartsSets().get(defaultPresetId);
+ }
+
+ // ããã©ã«ãã®ãã¼ãã»ããããªããã°ããæ°ã«å
¥ãã®æåãé¸æãã.
+ if (partsSet == null) {
+ List partssets = getPartsSetList();
+ if (!partssets.isEmpty()) {
+ partsSet = partssets.get(0);
+ }
+ }
+
+ // ãã¼ãã»ãããããã°ãããã表示è¦æ±ãã.
+ // ãã¼ãã»ããããªããã°ã«ã©ã¼ãã¤ã¢ãã°ãåæåããã®ã¿
+ if (partsSet == null) {
+ partsColorCoordinator.initColorDialog();
+
+ } else {
+ selectPresetParts(partsSet);
+ }
+
+ } catch (Exception ex) {
+ logger.log(Level.WARNING, "ãã¼ãã®ããã©ã«ãé©ç¨ã«å¤±æãã¾ããã", ex);
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * ããªã»ãããé©ç¨ããã£ã©ã¯ã¿ã¼ã¤ã¡ã¼ã¸ãåæ§ç¯ãã¾ã.
+ * å®è¡æã¨ã©ã¼ã¯ç»é¢ã®ã¬ãã¼ãããã¾ã.
+ *
+ * @param presetParts
+ * ãã¼ãã»ãã, nullã®å ´åã¯ä½ãããªã.
+ */
+ protected void selectPresetParts(PartsSet presetParts) {
+ if (presetParts == null) {
+ return;
+ }
+ try {
+ // æå¾ã«ä½¿ç¨ããããªã»ããã¨ãã¦è¨æ¶ãã.
+ lastUsePresetParts = presetParts;
+ // ããªã»ãããã¼ãã§é¸æãå¤ãã
+ partsSelectionManager.selectPartsSet(presetParts);
+ // ã«ã©ã¼ããã«ãé¸æããã¦ããã¢ã¤ãã ããã¨ã«åè¨å®ãã
+ partsColorCoordinator.initColorDialog();
+ // å表示
+ requestPreview();
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ /**
+ * ããªã»ããã¨ãæ°ã«å
¥ãã表示é ã«ä¸¦ã¹ã¦è¿ã.
+ *
+ * @return ããªã»ããã¨ãæ°ã«å
¥ãã®ãªã¹ã(表示é )
+ */
+ protected List getPartsSetList() {
+ ArrayList partssets = new ArrayList();
+ partssets.addAll(characterData.getPartsSets().values());
+ Collections.sort(partssets, PartsSet.DEFAULT_COMPARATOR);
+ return partssets;
+ }
+
+ protected static final class TreeLeaf implements Comparable {
+
+ public enum TreeLeafType {
+ NODE, LEAF
+ }
+
+ private String name;
+
+ private TreeLeafType typ;
+
+ public TreeLeaf(TreeLeafType typ, String name) {
+ if (name == null) {
+ name = "";
+ }
+ this.typ = typ;
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public TreeLeafType getTyp() {
+ return typ;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj != null && obj instanceof TreeLeaf) {
+ TreeLeaf o = (TreeLeaf) obj;
+ return typ == o.typ && name.equals(o.name);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return typ.hashCode() ^ name.hashCode();
+ }
+
+ public int compareTo(TreeLeaf o) {
+ int ret = name.compareTo(o.name);
+ if (ret == 0) {
+ ret = (typ.ordinal() - o.typ.ordinal());
+ }
+ return ret;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+ }
+
+ protected TreeMap buildFavoritesItemTree(
+ List partssets) {
+ if (partssets == null) {
+ partssets = Collections.emptyList();
+ }
+ TreeMap favTree = new TreeMap();
+ for (PartsSet partsSet : partssets) {
+ String flatname = partsSet.getLocalizedName();
+ String[] tokens = flatname.split("\\|");
+ if (tokens.length == 0) {
+ continue;
+ }
+
+ TreeMap r = favTree;
+ for (int idx = 0; idx < tokens.length - 1; idx++) {
+ String name = tokens[idx];
+ TreeLeaf leafName = new TreeLeaf(TreeLeaf.TreeLeafType.NODE,
+ name);
+ @SuppressWarnings("unchecked")
+ TreeMap n = (TreeMap) r
+ .get(leafName);
+ if (n == null) {
+ n = new TreeMap();
+ r.put(leafName, n);
+ }
+ r = n;
+ }
+ String lastName = tokens[tokens.length - 1];
+ TreeLeaf lastLeafName = new TreeLeaf(TreeLeaf.TreeLeafType.LEAF,
+ lastName);
+ @SuppressWarnings("unchecked")
+ List leafValue = (List) r.get(lastLeafName);
+ if (leafValue == null) {
+ leafValue = new ArrayList();
+ r.put(lastLeafName, leafValue);
+ }
+ leafValue.add(partsSet);
+ }
+ return favTree;
+ }
+
+ protected interface FavoriteMenuItemBuilder {
+ JMenuItem createFavoriteMenuItem(String name, PartsSet partsSet);
+ JMenu createSubMenu(String name);
+ }
+
+ private void buildFavoritesMenuItems(List menuItems,
+ FavoriteMenuItemBuilder favMenuItemBuilder,
+ TreeMap favTree) {
+ for (Map.Entry entry : favTree.entrySet()) {
+ TreeLeaf treeLeaf = entry.getKey();
+ String name = treeLeaf.getName();
+ if (treeLeaf.getTyp() == TreeLeaf.TreeLeafType.LEAF) {
+ // èãã¼ãã«ã¯ãJMenuItemãè¨å®ãã.
+ @SuppressWarnings("unchecked")
+ List leafValue = (List) entry.getValue();
+ for (final PartsSet partsSet : leafValue) {
+ JMenuItem favoriteMenu = favMenuItemBuilder
+ .createFavoriteMenuItem(name, partsSet);
+ menuItems.add(favoriteMenu);
+ }
+
+ } else if (treeLeaf.getTyp() == TreeLeaf.TreeLeafType.NODE) {
+ // æãã¼ãã¯ããµãã¡ãã¥ã¼ãä½æããåãã¼ããè¨å®ãã
+ @SuppressWarnings("unchecked")
+ TreeMap childNode = (TreeMap) entry
+ .getValue();
+ JMenu subMenu = favMenuItemBuilder.createSubMenu(name);
+ menuItems.add(subMenu);
+ ArrayList subMenuItems = new ArrayList();
+ buildFavoritesMenuItems(subMenuItems, favMenuItemBuilder, childNode);
+ for (JMenuItem subMenuItem : subMenuItems) {
+ subMenu.add(subMenuItem);
+ }
+
+ } else {
+ throw new RuntimeException("unknown type: " + treeLeaf);
+ }
+ }
+ }
+
+ /**
+ * ãæ°ã«å
¥ãã®JMenuItemãä½æãããã¡ã³ã¯ã·ã§ã³ãªãã¸ã§ã¯ã
+ */
+ private FavoriteMenuItemBuilder favMenuItemBuilder = new FavoriteMenuItemBuilder() {
+ private MenuBuilder menuBuilder = new MenuBuilder();
+
+ /**
+ * ãæ°ã«å
¥ãã¡ãã¥ã¼ã®ä½æ
+ */
+ public JMenuItem createFavoriteMenuItem(final String name,
+ final PartsSet partsSet) {
+ JMenuItem favoriteMenu = menuBuilder.createJMenuItem();
+ favoriteMenu.setName(partsSet.getPartsSetId());
+ favoriteMenu.setText(name);
+ if (partsSet.isPresetParts()) {
+ Font font = favoriteMenu.getFont();
+ favoriteMenu.setFont(font.deriveFont(Font.BOLD));
+ }
+ favoriteMenu.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ selectPresetParts(partsSet);
+ }
+ });
+
+ // ã¡ãã¥ã¼ã¢ã¤ãã ä¸ã§ãã¦ã¹ãã¤ã¼ã«ãåãããå ´åã¯ä¸ä¸ã«ã¹ã¯ãã¼ã«ããã.
+ // (ãã ããOSXã®ã¹ã¯ãªã¼ã³ã¡ãã¥ã¼ä½¿ç¨æã¯ç¡è¦ãã.)
+ addMouseWheelListener(favoriteMenu);
+
+ return favoriteMenu;
+ }
+
+ /**
+ * ãµãã¡ãã¥ã¼ã®ä½æ
+ */
+ public JMenu createSubMenu(String name) {
+ JMenu menu = menuBuilder.createJMenu();
+ menu.setText(name);
+
+ // ã¡ãã¥ã¼ã¢ã¤ãã ä¸ã§ãã¦ã¹ãã¤ã¼ã«ãåãããå ´åã¯ä¸ä¸ã«ã¹ã¯ãã¼ã«ããã.
+ // (ãã ããOSXã®ã¹ã¯ãªã¼ã³ã¡ãã¥ã¼ä½¿ç¨æã¯ç¡è¦ãã.)
+ addMouseWheelListener(menu);
+
+ return menu;
+ }
+
+ /**
+ * ã¡ãã¥ã¼ã¢ã¤ãã ä¸ã§ãã¤ã¼ã«ãä¸ä¸ãããã¨ãã«ã¡ãã¥ã¼ãã¹ã¯ãã¼ã«ãããããã®ãã¤ã¼ã«ãã³ãã©ãè¨å®ãã.
+ *
+ * @param favoriteMenu
+ */
+ protected void addMouseWheelListener(final JMenuItem favoriteMenu) {
+ if (JScrollableMenu.isScreenMenu()) {
+ return;
+ }
+ favoriteMenu.addMouseWheelListener(new MouseWheelListener() {
+ public void mouseWheelMoved(MouseWheelEvent e) {
+ int rotation = e.getWheelRotation();
+ JPopupMenu popupMenu = (JPopupMenu) favoriteMenu
+ .getParent();
+ JMenu parentMenu = (JMenu) popupMenu.getInvoker();
+ if (parentMenu != null
+ && parentMenu instanceof JScrollableMenu) {
+ final JScrollableMenu favMenu = (JScrollableMenu) parentMenu;
+ favMenu.doScroll(rotation < 0);
+ }
+ e.consume();
+ }
+ });
+ }
+ };
+
+ /**
+ * ãæ°ã«å
¥ãã¡ãã¥ã¼ãéããã¨ã
+ *
+ * @param menu
+ */
+ protected void onSelectedFavoriteMenu(JMenu menu) {
+ // 表示é ã«ã½ã¼ã
+ List partssets = getPartsSetList();
+ TreeMap favTree = buildFavoritesItemTree(partssets);
+
+ // ã¡ãã¥ã¼ã®åæ§ç¯
+ ArrayList favoritesMenuItems = new ArrayList();
+ buildFavoritesMenuItems(favoritesMenuItems, favMenuItemBuilder, favTree);
+
+ replaceMenuItems(menu, favoritesMenuItems);
+ }
+
+ /**
+ * ã¹ã¯ãã¼ã«å¯è½JMenu/é常JMenuã®ã¡ãã¥ã¼ã¢ã¤ãã ã®å·®ãæ¿ã
+ * @param menu
+ * @param items
+ */
+ private void replaceMenuItems(JMenu menu, List items) {
+ if (menu instanceof JScrollableMenu) {
+ // ã¹ã¯ãã¼ã«ã¡ãã¥ã¼ã®å ´å
+ JScrollableMenu favMenu = (JScrollableMenu) menu;
+
+ // ã¹ã¯ãã¼ã«ã¡ãã¥ã¼ã®åæå
+ favMenu.initScroller();
+
+ // ã¹ã¯ãã¼ã«ã¡ãã¥ã¼ã¢ã¤ãã ã®è¨å®
+ favMenu.setScrollableItems(items);
+
+ // é«ããè£æ£ãã
+ // ãæ°ã«å
¥ãã¡ãã¥ã¼ãé¸æãããå ´åã
+ // ãæ°ã«å
¥ãã¢ã¤ãã ä¸è¦§ã表示ãããããåã«
+ // 表示å¯è½ãªã¢ã¤ãã æ°ãç¾å¨ã®ã¦ã£ã³ãã¦ã®é«ãããç®å®ãã.
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ Dimension scrsiz = tk.getScreenSize();
+ int height = scrsiz.height; // MainFrame.this.getHeight();
+ favMenu.adjustMaxVisible(height);
+ logger.log(Level.FINE,
+ "scrollableMenu maxVisible=" + favMenu.getMaxVisible());
+
+ } else {
+ // é常ã¡ãã¥ã¼ã®å ´å
+ // æ¢åã¡ãã¥ã¼ã®ä½ç½®ãã»ãã¬ã¼ã¿ããå¤æãã.
+ int mx = menu.getMenuComponentCount();
+ int separatorIdx = -1;
+ for (int idx = 0; idx < mx; idx++) {
+ Component item = menu.getMenuComponent(idx);
+ if (item instanceof JSeparator) {
+ separatorIdx = idx;
+ break;
+ }
+ }
+ // æ¢åã¡ãã¥ã¼ã®åé¤
+ if (separatorIdx > 0) {
+ while (menu.getMenuComponentCount() > separatorIdx + 1) {
+ menu.remove(separatorIdx + 1);
+ }
+ }
+
+ // ã¡ãã¥ã¼ãç»é²ãã.
+ for (JMenuItem menuItem : items) {
+ menu.add(menuItem);
+ }
+ }
+ }
+
+ /**
+ * ã«ã¹ã¿ã ã¬ã¤ã¤ã¼ã¡ãã¥ã¼ãéããã¨ã
+ * @param menu
+ */
+ protected void onSelectedCustomLayerMenu(JMenu menu) {
+ // ã¡ãã¥ã¼ã®åæ§ç¯
+ ArrayList menuItems = new ArrayList();
+ for (Map.Entry> entry : customLayerPatternMgr.getMap().entrySet()) {
+ final String name = entry.getKey();
+ final JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(name);
+ menuItem.setSelected(customLayerPatternMgr.isSelected(name));
+ menuItem.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ customLayerPatternMgr.setSelected(name, menuItem.isSelected());
+ requestPreview();
+ }
+ });
+ menuItems.add(menuItem);
+ }
+ replaceMenuItems(menu, menuItems);
+ }
+
+ /**
+ * ãã«ãã¡ãã¥ã¼ãéããã¨ãã«ãå§ãã¡ãã¥ã¼ãæ§ç¯ãã.
+ *
+ * @param menu
+ */
+ protected void onSelectedRecommendationMenu(JMenu mnuRecomendation) {
+ // ç¾å¨ã®ãå§ãã¡ãã¥ã¼ãä¸æ¦åé¤
+ while (mnuRecomendation.getMenuComponentCount() > 0) {
+ mnuRecomendation.remove(0);
+ }
+
+ // ãå§ããªã³ã¯ã®å®ç¾©ããªãå ´åã¯ããã©ã«ããç¨ãã.(æ示çãªç©ºã®å ´åã¯ä½ãããªã.)
+ CharacterDataPersistent persist = CharacterDataPersistent.getInstance();
+ persist.compensateRecommendationList(characterData);
+
+ // ãå§ããªã³ã¯ã¡ãã¥ã¼ãä½æãã.
+ List recommendations = characterData.getRecommendationURLList();
+ if (recommendations != null) {
+ MenuBuilder menuBuilder = new MenuBuilder();
+ for (RecommendationURL recommendation : recommendations) {
+ String displayName = recommendation.getDisplayName();
+ String url = recommendation.getUrl();
+
+ JMenuItem mnuItem = menuBuilder.createJMenuItem();
+ mnuItem.setText(displayName);
+ mnuItem.addActionListener(
+ DesktopUtilities.createBrowseAction(MainFrame.this, url, displayName)
+ );
+ mnuRecomendation.add(mnuItem);
+ }
+ }
+
+ // ãå§ããªã³ã¯ã¡ãã¥ã¼ã®ãªã¹ããnullã§ãªã空ã§ããªãå ´åã¯æå¹ãããã§ãªããã°ç¡å¹ã«ãã.
+ mnuRecomendation.setEnabled(recommendations != null && !recommendations.isEmpty());
+ }
+
+
+ /**
+ * æå¾ã«é¸æããããæ°ã«å
¥ãã¨åãæ§æã§ããã°ã ãã®ãæ°ã«å
¥ãã®ååããã¬ãã¥ã¼ãã¤ã³ã®ã¿ã¤ãã«ã«è¨å®ãã.
+ * ããã§ãªããã°ããã©ã«ãã®ãã¼ãã»ããå(no titleã¨ã)ã表示ãã.
+ * è²æ
å ±ãç°ãªãå ´åã«æ«å°¾ã«ã*ããã¼ã¯ãã¤ãããã.
+ *
+ * @param requestPartsSet
+ * 表示ãããã¼ãã»ãã(ååã¯è¨å®ããã¦ããªãã¦è¯ãããæ°ã«å
¥ãå´ã使ãã®ã§ã), nullã®å ´åã¯ããã©ã«ãã®ãã¼ãå
+ */
+ protected void showPresetName(PartsSet requestPartsSet) {
+ String title = getSuggestPartsSetName(requestPartsSet, true);
+ if (title == null) {
+ title = defaultPartsSetTitle;
+ }
+ previewPane.setTitle(title);
+ }
+
+ /**
+ * ãã¼ãã»ããåãæ¨å®ãã.
+ * æå¾ã«é¸æããããæ°ã«å
¥ãã¨åãæ§æã§ããã°ã ãã®ãæ°ã«å
¥ãã®ååãè¿ã.
+ * ãæ°ã«å
¥ããé¸æããã¦ããªããæ§æãç°ãªãå ´åããæ°ã«å
¥ãã«ååããªãå ´åã¯nullãè¿ã.
+ *
+ * @param requestPartsSet
+ * 表示ãããã¼ãã»ãã(ååã¯è¨å®ããã¦ããªãã¦è¯ãããæ°ã«å
¥ãå´ã使ãã®ã§ã)
+ * @param markColorChange
+ * è²æ
å ±ãç°ãªãå ´åã«æ«å°¾ã«ã*ããã¼ã¯ãã¤ããå ´åã¯true
+ */
+ private String getSuggestPartsSetName(PartsSet requestPartsSet, boolean markColorChange) {
+ String partsSetTitle = null;
+ if (lastUsePresetParts != null &&
+ PartsSet.isSameStructure(requestPartsSet, lastUsePresetParts)) {
+ partsSetTitle = lastUsePresetParts.getLocalizedName();
+ if (markColorChange && !PartsSet.isSameColor(requestPartsSet, lastUsePresetParts)) {
+ if (partsSetTitle != null) {
+ partsSetTitle += "*";
+ }
+ }
+ }
+ if (partsSetTitle != null && partsSetTitle.trim().length() > 0) {
+ return partsSetTitle;
+ }
+ return null;
+ }
+
+ /**
+ * ãã¬ãã¥ã¼ã®æ´æ°ãè¦æ±ãã. æ´æ°ã¯éåæã«è¡ããã.
+ */
+ protected void requestPreview() {
+ if (!characterData.isValid()) {
+ return;
+ }
+
+ // é¸æããã¦ãããã¼ãã®åã¤ã¡ã¼ã¸ãåå¾ãã¬ã¤ã¤ã¼é ã«ä¸¦ã³æ¿ãã¦åæãã.
+ // åæã¯å¥ã¹ã¬ããã«ã¦éåæã«è¡ããã.
+ // ãªã¯ã¨ã¹ãã¯éæåãä»ãã¦ãææ°ã®ãªã¯ã¨ã¹ãã ããå¦çããã.
+ // (å¦çãã¯ãã¾ãåã«æ°ãããªã¯ã¨ã¹ãã§ä¸æ¸ããããå ´åãåã®ãªã¯ã¨ã¹ãã¯åã«æ¨ã¦ããã.)
+ imageBuilder.requestJob(new ImageBuildJobAbstractAdaptor(characterData) {
+
+ /**
+ * æ§ç¯ãããã¼ãã»ããæ
å ±
+ */
+ private PartsSet requestPartsSet;
+
+ /**
+ * éåæã®ã¤ã¡ã¼ã¸æ§ç¯è¦æ±ã®çªå·.
+ */
+ private long ticket;
+
+ @Override
+ public void onQueueing(long ticket) {
+ this.ticket = ticket;
+ previewPane.setLoadingRequest(ticket);
+ }
+ @Override
+ public void buildImage(ImageOutput output) {
+ // åæçµæã®ã¤ã¡ã¼ã¸ãå¼æ°ã¨ãã¦ã¤ã¡ã¼ã¸ãã«ãããå¼ã³åºããã.
+ final BufferedImage img = output.getImageOutput();
+ Runnable refreshJob = new Runnable() {
+ public void run() {
+ previewPane.setPreviewImage(img);
+ previewPane.setLoadingComplete(ticket);
+ showPresetName(requestPartsSet);
+ }
+ };
+ if (SwingUtilities.isEventDispatchThread()) {
+ refreshJob.run();
+ } else {
+ try {
+ SwingUtilities.invokeAndWait(refreshJob);
+ } catch (Exception ex) {
+ logger.log(Level.WARNING, "build image failed.", ex);
+ }
+ }
+ }
+ @Override
+ public void handleException(final Throwable ex) {
+ // åæä¸ã«ä¾å¤ãçºçããå ´åãã¤ã¡ã¼ã¸ãã«ãããå¼ã³åºããã.
+ Runnable showExceptionJob = new Runnable() {
+ public void run() {
+ ErrorMessageHelper.showErrorDialog(MainFrame.this, ex);
+ }
+ };
+ if (SwingUtilities.isEventDispatchThread()) {
+ showExceptionJob.run();
+ } else {
+ SwingUtilities.invokeLater(showExceptionJob);
+ }
+ }
+ @Override
+ protected PartsSet getPartsSet() {
+ // åæã§ããç¶æ
ã«ãªã£ãæç¹ã§ã¤ã¡ã¼ã¸ãã«ãããå¼ã³åºããã.
+ final PartsSet[] result = new PartsSet[1];
+ Runnable collectPartsSetJob = new Runnable() {
+ public void run() {
+ PartsSet partsSet = partsSelectionManager.createPartsSet();
+ result[0] = partsSet;
+ }
+ };
+ if (SwingUtilities.isEventDispatchThread()) {
+ collectPartsSetJob.run();
+ } else {
+ try {
+ // ã¹ã¬ããã«ããSwingã®ã¤ãã³ããã£ã¹ãããã¹ã¬ãã以å¤ããã®å¼ã³åºãã®å ´åã
+ // Swingãã£ã¹ãããã¹ã¬ããã§ãã¼ãã®é¸æç¶æ
ãåå¾ãã.
+ SwingUtilities.invokeAndWait(collectPartsSetJob);
+
+ } catch (InvocationTargetException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ } catch (InterruptedException e) {
+ throw new RuntimeException("interrupted:" + e, e);
+ }
+ }
+ if (logger.isLoggable(Level.FINE)) {
+ logger.log(Level.FINE, "preview: " + result[0]);
+ }
+ requestPartsSet = result[0];
+ return requestPartsSet;
+ }
+ @Override
+ protected LayerOrderMapper getLayerOrderMapper() {
+ return customLayerPatternMgr;
+ }
+ });
+ }
+
+ /**
+ * ãããã¡ã¤ã«ãéã
+ */
+ protected void onOpenProfile() {
+ try {
+ MainFrame main2 = ProfileListManager.openProfile(this);
+ if (main2 != null) {
+ main2.showMainFrame();
+ }
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ /**
+ * èæ¯è²ãå¤æ´ãã.
+ */
+ protected void onChangeBgColor() {
+ getJMenuBar().setEnabled(false);
+ try {
+ Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
+ .getLocalizedProperties(STRINGS_RESOURCE);
+
+ Color color = wallpaperInfo.getBackgroundColor();
+ color = JColorChooser.showDialog(this, strings.getProperty("chooseBgColor"), color);
+ if (color != null) {
+ applyBackgroundColorOnly(color);
+ }
+ } finally {
+ getJMenuBar().setEnabled(true);
+ }
+ }
+
+ /**
+ * å£ç´ãå¤æ´ãã.
+ */
+ protected void onChangeWallpaper() {
+ try {
+ WallpaperDialog wallpaperDialog = new WallpaperDialog(this);
+
+ // æå¾ã«ä½¿ç¨ããå£ç´æ
å ±ã§ãã¤ã¢ãã°ãè¨å®ãã.
+ wallpaperDialog.setWallpaperInfo(this.wallpaperInfo);
+
+ // å£ç´æ
å ±ãè¨å®ããã¢ã¼ãã«ãã¤ã¢ãã°ãéã
+ WallpaperInfo wallpaperInfo = wallpaperDialog.showDialog();
+ if (wallpaperInfo == null) {
+ return;
+ }
+
+ // å£ç´æ
å ±ãä¿åãããã®æ
å ±ããã¨ã«èæ¯ãåæç»ãã.
+ applyWallpaperInfo(wallpaperInfo, false);
+
+ } catch (WallpaperFactoryException ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+
+ } catch (RuntimeException ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ /**
+ * èæ¯è²ã®ã¿å¤æ´ããèæ¯ãåæç»ãã.
+ * å£ç´æ
å ±å
¨ä½ã®æ´æ°ãããå¹çåããããã®ã¡ã½ããã§ãã.
+ *
+ * @param bgColor
+ * èæ¯è²
+ */
+ protected void applyBackgroundColorOnly(Color bgColor) {
+ wallpaperInfo.setBackgroundColor(bgColor);
+ previewPane.getWallpaper()
+ .setBackgroundColor(wallpaperInfo.getBackgroundColor());
+ }
+
+ /**
+ * å£ç´æ
å ±ãä¿åãããã®æ
å ±ããã¨ã«èæ¯ãåæç»ãã.
+ * ignoreErrorãtrueã§ããå ´åãé©ç¨ã«å¤±æããå ´åã¯ãã°ã«è¨é²ããã®ã¿ã§ã å£ç´æ
å ±ã¯ä¿åããããå£ç´ãæ´æ°ãããªã.
+ *
+ * @param wallpaperInfo
+ * å£ç´æ
å ±ãnullä¸å¯
+ * @param ignoreError
+ * 失æãç¡è¦ããå ´å
+ * @throws IOException
+ * 失æ
+ */
+ protected void applyWallpaperInfo(WallpaperInfo wallpaperInfo, boolean ignoreError) throws WallpaperFactoryException {
+ if (wallpaperInfo == null) {
+ throw new IllegalArgumentException();
+ }
+ // å£ç´æ
å ±ããå£ç´ã¤ã³ã¹ã¿ã³ã¹ãçæãã.
+ WallpaperFactory wallpaperFactory = WallpaperFactory.getInstance();
+ Wallpaper wallpaper = null;
+
+ try {
+ // å£ç´æ
å ±ã®æ§ç¯æã«åé¡ãçºçããå ´åã
+ // å復å¦çããã¦ç¶ç¶ãããã¨ã©ã¼ã¨ããã?
+ WallpaperFactoryErrorRecoverHandler handler = null;
+ if (ignoreError) {
+ handler = new WallpaperFactoryErrorRecoverHandler();
+ }
+
+ // å£ç´æ
å ±
+ wallpaper = wallpaperFactory.createWallpaper(wallpaperInfo, handler);
+
+ } catch (WallpaperFactoryException ex) {
+ logger.log(Level.WARNING, "å£ç´æ
å ±ã®é©ç¨ã«å¤±æãã¾ããã", ex);
+ if ( !ignoreError) {
+ throw ex;
+ }
+
+ } catch (RuntimeException ex) {
+ logger.log(Level.WARNING, "å£ç´æ
å ±ã®é©ç¨ã«å¤±æãã¾ããã", ex);
+ if ( !ignoreError) {
+ throw ex;
+ }
+ }
+
+ if (wallpaper == null) {
+ return;
+ }
+
+ // å£ç´ãæ´æ°ãã.
+ previewPane.setWallpaper(wallpaper);
+
+ // å£ç´æ
å ±ã¨ãã¦è¨æ¶ãã.
+ this.wallpaperInfo = wallpaperInfo;
+ }
+
+ /**
+ * ãã¬ãã¥ã¼ãã¦ããç»åããã¡ã¤ã«ã«ä¿åããã ãµãã¼ããã¦ããã®ã¯PNG/JPEGã®ã¿ã
+ */
+ protected void onSavePicture() {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ BufferedImage img = previewPane.getPreviewImage();
+ Color imgBgColor = wallpaperInfo.getBackgroundColor();
+ if (img == null) {
+ tk.beep();
+ return;
+ }
+
+ try {
+ // åºåãªãã·ã§ã³ã®èª¿æ´
+ OutputOption outputOption = imageSaveHelper.getOutputOption();
+ outputOption.setZoomFactor(previewPane.getZoomFactor());
+ outputOption.changeRecommend();
+ imageSaveHelper.setOutputOption(outputOption);
+
+ // ãã¡ã¤ã«ãã¤ã¢ãã°è¡¨ç¤º
+ File outFile = imageSaveHelper.showSaveFileDialog(this);
+ if (outFile == null) {
+ return;
+ }
+ logger.log(Level.FINE, "savePicture: " + outFile);
+ logger.log(Level.FINE, "outputOption: " + outputOption);
+
+ // ç»åã®ãã¡ã¤ã«ã¸ã®åºå
+ StringBuilder warnings = new StringBuilder();
+
+ setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+ try {
+ imageSaveHelper.savePicture(img, imgBgColor, outFile, warnings);
+
+ } finally {
+ setCursor(Cursor.getDefaultCursor());
+ }
+ if (warnings.length() > 0) {
+ JOptionPane.showMessageDialog(this, warnings.toString(), "WARNINGS", JOptionPane.WARNING_MESSAGE);
+ }
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ /**
+ * 伺ãç¨PNG/PNAã®åºå.
+ */
+ protected void onSaveAsUkagaka() {
+ BufferedImage img = previewPane.getPreviewImage();
+ Color bgColor = wallpaperInfo.getBackgroundColor();
+ if (img == null) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+
+ try {
+ ukagakaImageSaveHelper.save(this, img, bgColor);
+
+ } catch (IOException ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ /**
+ * 伺ãç¨PNG/PNAã®å¤æ
+ */
+ protected void onConvertUkagaka() {
+ try {
+ Color colorKey = wallpaperInfo.getBackgroundColor();
+ ukagakaImageSaveHelper.convertChooseFiles(this, colorKey);
+
+ } catch (IOException ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ /**
+ * ãããã¡ã¤ã«ã®å ´æãéã
+ */
+ protected void onBrowseProfileDir() {
+ if (!characterData.isValid()) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+ try {
+ DesktopUtilities.browseBaseDir(characterData.getDocBase());
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ /**
+ * ãã®ãããã¡ã¤ã«ãç·¨éãã.
+ */
+ protected void onEditProfile() {
+ if (!characterData.isValid()) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+ try {
+ CharacterData cd = this.characterData;
+ CharacterData newCd = ProfileListManager.editProfile(this, cd);
+ if (newCd != null) {
+ CharacterDataChangeObserver.getDefault()
+ .notifyCharacterDataChange(this, newCd, true, true);
+ }
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ /**
+ * ãã¼ãã®ç®¡çãã¤ã¢ãã°ãéã.
+ */
+ protected void onManageParts() {
+ if (!characterData.isValid()) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+
+ PartsManageDialog mrgDlg = new PartsManageDialog(this, characterData);
+ mrgDlg.setVisible(true);
+
+ if (mrgDlg.isUpdated()) {
+ // ãã¼ã管çæ
å ±ãæ´æ°ãããå ´åã
+ // ãã¼ããã¼ã¿ããªãã¼ããã.
+ if (characterData.reloadPartsData()) {
+ partsSelectionManager.loadParts();
+ requestPreview();
+ }
+ }
+ }
+
+ /**
+ * ããã¼ãæ¤ç´¢ããã¤ã¢ãã°ãéã.
+ * ãã§ã«éãã¦ãããã¤ã¢ãã°ãããã°ãããã«ãã©ã¼ã«ã¹ãå½ã¦ã.
+ */
+ protected void openSearchDialog() {
+ if (!characterData.isValid()) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+
+ if (lastUseSearchPartsDialog != null) {
+ // éãã¦ãããã¤ã¢ãã°ãããã°ãããã«ãã©ã¼ã«ã¹ãå½ã¦ã.
+ if (lastUseSearchPartsDialog.isDisplayable() && lastUseSearchPartsDialog.isVisible()) {
+ lastUseSearchPartsDialog.requestFocus();
+ return;
+ }
+ }
+
+ SearchPartsDialog searchPartsDlg = new SearchPartsDialog(this, characterData, partsSelectionManager);
+ WindowAdjustLocationSupport.alignRight(this, searchPartsDlg, 0, true);
+ searchPartsDlg.setVisible(true);
+ lastUseSearchPartsDialog = searchPartsDlg;
+ }
+
+ /**
+ * ããã¼ãæ¤ç´¢ããã¤ã¢ãã°ãéãã.
+ */
+ protected void closeSearchDialog() {
+ lastUseSearchPartsDialog = null;
+ for (SearchPartsDialog dlg : SearchPartsDialog.getDialogs()) {
+ if (dlg != null && dlg.isDisplayable() && dlg.getParent() == this) {
+ dlg.dispose();
+ }
+ }
+ }
+
+ /**
+ * ããæ°ã«å
¥ãã®ç®¡çããã¤ã¢ãã°ãéãã
+ */
+ protected void closeManageFavoritesDialog() {
+ if (lastUseManageFavoritesDialog != null) {
+ if (lastUseManageFavoritesDialog.isDisplayable()) {
+ lastUseManageFavoritesDialog.dispose();
+ }
+ lastUseManageFavoritesDialog = null;
+ }
+ }
+
+ /**
+ * ããã¼ãã®ã©ã³ãã é¸æãã¤ã¢ãã°ããéãã
+ */
+ protected void closePartsRandomChooserDialog() {
+ if (lastUsePartsRandomChooserDialog != null) {
+ if (lastUsePartsRandomChooserDialog.isDisplayable()) {
+ lastUsePartsRandomChooserDialog.dispose();
+ }
+ lastUsePartsRandomChooserDialog = null;
+ }
+ }
+
+ /**
+ * ã¯ãªãããã¼ãã«ã³ãã¼
+ *
+ * @param screenImage
+ * ã¹ã¯ãªã¼ã³ã¤ã¡ã¼ã¸
+ */
+ protected void onCopy(boolean screenImage) {
+ try {
+ BufferedImage img = previewPane.getPreviewImage();
+ if (img == null) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+
+ if (screenImage) {
+ // 表示ãã¦ããå
容ããã®ã¾ã¾ã³ãã¼ãã.
+ img = previewPane.getScreenImage();
+ }
+
+ Color imgBgColor = wallpaperInfo.getBackgroundColor();
+ ClipboardUtil.setImage(img, imgBgColor);
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ /**
+ * ã¢ããªã±ã¼ã·ã§ã³ã®è¨å®ãã¤ã¢ãã°ãéã
+ */
+ public void onPreferences() {
+ AppConfigDialog appConfigDlg = new AppConfigDialog(this);
+ appConfigDlg.setVisible(true);
+ }
+
+ /**
+ * æ°è¦ã¢ã¼ãã§ã¤ã³ãã¼ãã¦ã£ã¶ã¼ããå®è¡ãã.
+ */
+ protected void onImportNew() {
+ if (!characterData.isValid()) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+
+ try {
+ // ã¤ã³ãã¼ãã¦ã£ã¶ã¼ãã®å®è¡(æ°è¦ã¢ã¼ã)
+ ImportWizardDialog importWizDialog = new ImportWizardDialog(this, null, null);
+ importWizDialog.setVisible(true);
+ int exitCode = importWizDialog.getExitCode();
+ if (exitCode == ImportWizardDialog.EXIT_PROFILE_CREATED) {
+ CharacterData cd = importWizDialog.getImportedCharacterData();
+ if (cd != null && cd.isValid()) {
+ // ã¤ã³ãã¼ããããã£ã©ã¯ã¿ã¼ãã¼ã¿ã®ãããã¡ã¤ã«ãéã.
+ setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+ try {
+ MainFrame mainFrame = ProfileListManager.openProfile(cd);
+ mainFrame.setVisible(true);
+
+ } finally {
+ setCursor(Cursor.getDefaultCursor());
+ }
+ }
+ }
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ /**
+ * ç¾å¨ã®ãããã¡ã¤ã«ã«å¯¾ããã¤ã³ãã¼ãã¦ã£ã¶ã¼ããå®è¡ãã.
+ * ã¤ã³ãã¼ããå®è¡ãããå ´åã¯ããã¼ãããªãã¼ããã.
+ * ã¤ã³ãã¼ãã¦ã£ã¶ã¼ã表示ä¸ã¯ç£è¦ã¹ã¬ããã¯åæ¢ããã.
+ *
+ * @param initFile
+ * ã¢ã¼ã«ã¤ããã¡ã£ã«ã¾ãã¯ãã£ã¬ã¯ããªãæå®ããªããã°null
+ */
+ protected void onImport(List initFiles) {
+ if (!characterData.isValid()) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+
+ try {
+ watchAgent.suspend();
+ try {
+ // ã¤ã³ãã¼ãã¦ã£ã¶ã¼ãã®å®è¡
+ ImportWizardDialog importWizDialog = new ImportWizardDialog(this, characterData, initFiles);
+ importWizDialog.setVisible(true);
+
+ if (importWizDialog.getExitCode() == ImportWizardDialog.EXIT_PROFILE_UPDATED) {
+ CharacterData importedCd = importWizDialog.getImportedCharacterData();
+ CharacterDataChangeObserver.getDefault()
+ .notifyCharacterDataChange(this, importedCd,
+ false, true);
+ }
+
+ } finally {
+ watchAgent.resume();
+ }
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ /**
+ * ãã¼ãã¨ãæ°ã«å
¥ãããªãã¼ããã.
+ * ã¾ã ãã¼ãããã¦ããªãå ´åã¯ãããã«ãã¼ããã.
+ * å¼æ°newCdãæå®ããã¦ããå ´åã¯ãç¾å¨ã®ãã£ã©ã¯ã¿ã¼å®ç¾©ã®èª¬ææãæ´æ°ãã.
+ * (説ææã®æ´æ°ä»¥å¤ã«ã¯ä½¿ç¨ãããªã.)
+ *
+ * @param newCd
+ * 説æææ´æ°ã®ããã®æ´æ°ããããã£ã©ã¯ã¿ã¼ãã¼ã¿ãæå®ãããnullå¯
+ * @param forceRepaint
+ * å¿
ãåæç»ããå ´å
+ * @throws IOException
+ * 失æ
+ */
+ protected synchronized void reloadPartsAndFavorites(CharacterData newCd,
+ boolean forceRepaint) throws IOException {
+ if (newCd != null) {
+ // (ã¤ã³ãã¼ãç»é¢ã§ã¯èª¬ææã®ã¿æ´æ°ããã®ã§ãããã ãåå¾)
+ characterData.setDescription(newCd.getDescription());
+ }
+
+ if ( !characterData.isPartsLoaded()) {
+ // ãã£ã©ã¯ã¿ã¼ãã¼ã¿ããã¾ã èªã¿è¾¼ã¾ãã¦ããªããã°èªã¿è¾¼ã.
+ ProfileListManager.loadCharacterData(characterData);
+ ProfileListManager.loadFavorites(characterData);
+ partsSelectionManager.loadParts();
+
+ } else {
+ // ãã¼ããã¼ã¿ããªãã¼ããã.
+ if (characterData.reloadPartsData()) {
+ partsSelectionManager.loadParts();
+ }
+
+ // ãæ°ã«å
¥ãããªãã¼ããã.
+ CharacterDataPersistent persiste = CharacterDataPersistent.getInstance();
+ persiste.loadFavorites(characterData);
+
+ // ãæ°ã«å
¥ããæ´æ°ããããã¨ãéç¥ãã.
+ FavoritesChangeObserver.getDefault().notifyFavoritesChange(
+ MainFrame.this, characterData);
+ }
+
+ // ç¾å¨é¸æããã¦ãããã¼ãã»ããããªãå ´åã¯ããã©ã«ãã®ãã¼ãã»ãããé¸æãã.
+ if (showDefaultParts(false) || forceRepaint) {
+ requestPreview();
+ }
+ }
+
+ protected void onExport() {
+ if (!characterData.isValid()) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+ ExportWizardDialog exportWizDlg = new ExportWizardDialog(this, characterData, previewPane.getPreviewImage());
+ exportWizDlg.setVisible(true);
+ }
+
+ protected void onResetColor() {
+ if (!characterData.isValid()) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+
+ Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
+ .getLocalizedProperties(STRINGS_RESOURCE);
+
+ if (JOptionPane.showConfirmDialog(this, strings.get("confirm.resetcolors"), strings.getProperty("confirm"),
+ JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) != JOptionPane.YES_OPTION) {
+ return;
+ }
+ characterData.getPartsColorManager().resetPartsColorInfo();
+ partsColorCoordinator.initColorDialog();
+ requestPreview();
+ }
+
+ /**
+ * ãããã¡ã¤ã«ãéãã.
+ */
+ protected void onCloseProfile() {
+ saveWorkingSet();
+ ProfileListManager.unregisterUsedCharacterData(characterData);
+
+ if (characterData.isValid()) {
+
+ // æå¾ã«ä½¿ç¨ãããã£ã©ã¯ã¿ã¼ãã¼ã¿ã¨ãã¦è¨æ¶ãã.
+ try {
+ RecentDataPersistent recentPersist = RecentDataPersistent.getInstance();
+ recentPersist.saveRecent(characterData);
+
+ } catch (Exception ex) {
+ logger.log(Level.WARNING, "recent data saving failed.", ex);
+ // recentæ
å ±ã®è¨é²ã«å¤±æãã¦ãè´å½çã§ã¯ãªãã®ã§ãããã¯ç¡è¦ãã.
+ }
+ }
+
+ // ã¤ã¡ã¼ã¸ãã«ãã¹ã¬ããã»ãã£ã¬ã¯ããªç£è¦ã¹ã¬ãããåæ¢ãã.
+ stopAgents();
+
+ // ãã¬ã¼ã ã¦ã£ã³ãã¦ãç ´æ£ãã.
+ dispose();
+
+ // ç ´æ£ããããã¨ããã®ã³ã°ãã.
+ logger.log(Level.FINE, "dispose mainframe.");
+ }
+
+ /**
+ * éãã¦ããããã¹ã¦ã®ãããã¡ã¤ã«ãéãã.
+ * (Mac OS Xã®cmd+Qã§éããå ´åãªã©ã§ä½¿ç¨ããã.)
+ */
+ public static void closeAllProfiles() {
+ // ã¦ã£ã³ãã¦ãéãããããã¨ã§ã¢ã¯ãã£ããªãã¬ã¼ã ãåãæ¿ããå ´åãæ³å®ãã
+ // ç¾å¨ã®ã¢ã¯ãã£ããªã¦ã£ã³ãã¦ããããããè¨æ¶ãã¦ãã
+ MainFrame mainFrame = activedMainFrame;
+
+ // gcãããã¦ãã¡ã¤ãã©ã¤ãºãä¿é²ããã
+ SystemUtil.gc();
+
+ // ãã¡ã¤ãã©ã¤ãºããã¦ããªãFrameã®ãã¡ããã¤ãã£ããªã½ã¼ã¹ã¨é¢é£ã¥ãããã¦ãã
+ // ãã¬ã¼ã ã«ã¤ãã¦ããããMainFrameã®ã¤ã³ã¹ã¿ã³ã¹ã§ããã°éãã.
+ // ãã ããç¾å¨ã¢ã¯ãã£ããªãã®ã¯é¤ã
+ for (Frame frame : JFrame.getFrames()) {
+ try {
+ if (frame.isDisplayable()) {
+ // ãã¤ãã£ããªã½ã¼ã¹ã¨é¢é£ã¥ãããã¦ãããã¬ã¼ã
+ if (frame instanceof MainFrame && frame != mainFrame) {
+ // MainFrameã®ã¤ã³ã¹ã¿ã³ã¹ã§ããã®ã§éããå¦çãå¯è½.
+ // (ç¾å¨ã¢ã¯ãã£ããªã¡ã¤ã³ãã¬ã¼ã ã¯æå¾ã«éãããããããã§ã¯éããªã.)
+ ((MainFrame) frame).onCloseProfile();
+ }
+ }
+
+ } catch (Throwable ex) {
+ logger.log(Level.SEVERE, "mainframe closing failed.", ex);
+ // ãã¬ã¼ã ãéããã¨ãã«å¤±æããå ´åãé常ãè´å½çåé¡ã ã
+ // ã¯ãã¼ãºå¦çã¯ç¶ç¶ããªããã°ãªããªã.
+ }
+ }
+
+ // ç¾å¨ã¢ã¯ãã£ããªãã¬ã¼ã ãéãã.
+ // æå¾ã«éãããã¨ã§ãæå¾ã«ä½¿ã£ããããã¡ã¤ã«ãã¨ãã¦è¨æ¶ããã.
+ if (activedMainFrame != null && activedMainFrame.isDisplayable()) {
+ try {
+ activedMainFrame.onCloseProfile();
+
+ } catch (Throwable ex) {
+ logger.log(Level.SEVERE, "mainframe closing failed.", ex);
+ // ãã¬ã¼ã ãéããã¨ãã«å¤±æããå ´åãé常ãè´å½çåé¡ã ã
+ // ã¯ãã¼ãºå¦çã¯ç¶ç¶ããªããã°ãªããªã.
+ }
+ }
+ }
+
+ /**
+ * ç»é¢ã®ä½æ¥ç¶æ
ãä¿åãã.
+ */
+ protected void saveWorkingSet() {
+ if (!characterData.isValid()) {
+ return;
+ }
+ try {
+ // ã¯ã¼ãã³ã°ã»ããã®ä½æ
+ WorkingSet workingSet = new WorkingSet();
+ workingSet.setCharacterDocBase(characterData.getDocBase());
+ workingSet.setCharacterDataRev(characterData.getRev());
+ PartsSet partsSet = partsSelectionManager.createPartsSet();
+ workingSet.setPartsSet(partsSet);
+ workingSet.setPartsColorInfoMap(characterData
+ .getPartsColorManager().getPartsColorInfoMap());
+ workingSet.setLastUsedSaveDir(imageSaveHelper.getLastUsedSaveDir());
+ workingSet.setLastUsedExportDir(ExportWizardDialog.getLastUsedDir());
+ workingSet.setLastUsePresetParts(lastUsePresetParts);
+ workingSet
+ .setCharacterData(characterData.duplicateBasicInfo(false)); // ãã¼ãã»ããã¯ä¿åããªã.
+ workingSet.setWallpaperInfo(wallpaperInfo);
+
+ workingSet.setZoomFactor(previewPane.getZoomFactor());
+ workingSet.setViewPosition(previewPane.getViewPosition());
+
+ Dimension windowSize = getSize();
+ Point windowPos = getLocation();
+ Rectangle windowRect = new Rectangle(windowPos, windowSize);
+ workingSet.setWindowRect(windowRect);
+
+ // XMLå½¢å¼ã§ã®ã¯ã¼ãã³ã°ã»ããã®ä¿å
+ WorkingSetPersist workingSetPersist = WorkingSetPersist
+ .getInstance();
+ workingSetPersist.saveWorkingSet(workingSet);
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ /**
+ * ä¿åããã¦ããã«ã¹ã¿ã ã¬ã¤ã¤ã¼ãã¿ã¼ã³ããã¼ããã
+ */
+ protected void loadCustomLayerOrder() {
+ try {
+ CustomLayerOrderPersist persist = CustomLayerOrderPersist.newInstance(characterData);
+ Map> map = persist.load();
+ if (map != null) {
+ customLayerPatternMgr.setMap(map);
+ }
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ /**
+ * ç»é¢ã®ä½æ¥ç¶æ
ã復å
ãã.
+ *
+ * @return ã¯ã¼ãã³ã°ã»ãããèªã¿è¾¼ãã å ´åã¯trueãããã§ãªããã°false
+ */
+ protected boolean loadWorkingSet() {
+ if (!characterData.isValid()) {
+ return false;
+ }
+ try {
+ WorkingSetPersist workingSetPersist = WorkingSetPersist
+ .getInstance();
+ WorkingSet2 workingSet2 = workingSetPersist
+ .loadWorkingSet(characterData);
+ if (workingSet2 == null) {
+ // ã¯ã¼ãã³ã°ã»ããããªãå ´å.
+ return false;
+ }
+
+ AppConfig appConfig = AppConfig.getInstance();
+ Rectangle windowRect = workingSet2.getWindowRect();
+ if (appConfig.isEnableRestoreWindow() && windowRect != null) {
+ // ä½ç½®ã®å¾©å
+ GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();
+ Rectangle desktopSize = genv.getMaximumWindowBounds(); // ã¡ã¤ã³ã¹ã¯ãªã¼ã³ã®ãµã¤ãº(ãã¹ã¯ãããé åã®ã¿)
+ Point windowPos = windowRect.getLocation();
+ if (desktopSize.contains(windowPos)) {
+ setLocation(windowPos);
+ }
+
+ // ãµã¤ãºã®å¾©å
+ Dimension dim = windowRect.getSize();
+ if (dim.width < 100) {
+ dim.width = 100;
+ }
+ if (dim.height < 100) {
+ dim.height = 100;
+ }
+ setSize(dim);
+ } else {
+ // ããã©ã«ãã®ã¦ã£ã³ãã¦ä½ç½®ã¨ãµã¤ãº
+ setDefaultWindowLocation();
+ }
+
+ URI docBase = characterData.getDocBase();
+ if (docBase != null
+ && !docBase.equals(workingSet2.getCharacterDocBase())) {
+ // docBaseãä¸è´ãã
+ return false;
+ }
+ String sig = characterData.toSignatureString();
+ if (!sig.equals(workingSet2.getCharacterDataSig())) {
+ // æ§é ãä¸è´ãã.
+ return false;
+ }
+
+ // ãã¼ãã®è²æ
å ±ã復å
ãã.
+ Map partsColorInfoMap = characterData
+ .getPartsColorManager().getPartsColorInfoMap();
+ workingSet2.createCompatible(characterData, partsColorInfoMap);
+
+ // é¸æããã¦ãããã¼ãã®å¾©å
+ IndependentPartsSetInfo partsSetInfo = workingSet2
+ .getCurrentPartsSet();
+ if (partsSetInfo != null) {
+ PartsSet partsSet = IndependentPartsSetInfo.convertPartsSet(
+ partsSetInfo, characterData, false);
+ selectPresetParts(partsSet);
+
+ // æå¾ã«é¸æãããæ°ã«å
¥ãæ
å ±ã®å¾©å
+ IndependentPartsSetInfo lastUsePresetPartsInfo = workingSet2
+ .getLastUsePresetParts();
+ if (lastUsePresetPartsInfo != null
+ && lastUsePresetPartsInfo.getId() != null
+ && lastUsePresetPartsInfo.getId().trim().length() > 0) {
+ PartsSet lastUsePresetParts = IndependentPartsSetInfo
+ .convertPartsSet(lastUsePresetPartsInfo,
+ characterData, false);
+ if (lastUsePresetParts.isSameStructure(partsSet)) {
+ this.lastUsePresetParts = lastUsePresetParts;
+ showPresetName(lastUsePresetParts);
+ }
+ }
+ }
+
+ // æå¾ã«ä¿åãããã£ã¬ã¯ããªã復å
ãã.
+ imageSaveHelper.setLastUseSaveDir(workingSet2.getLastUsedSaveDir());
+ ExportWizardDialog.setLastUsedDir(workingSet2
+ .getLastUsedExportDir());
+
+ // å£ç´æ
å ±ãåå¾ãã.
+ WallpaperInfo wallpaperInfo = workingSet2.getWallpaperInfo();
+ if (wallpaperInfo != null) {
+ // å£ç´æ
å ±ãä¿åãããã®æ
å ±ããã¨ã«èæ¯ãåæç»ãã.
+ // (é©ç¨ã«å¤±æããå ´åã¯ã¨ã©ã¼ã¯ç¡è¦ããå£ç´æ
å ±ã¯ä¿åããªã.)
+ applyWallpaperInfo(wallpaperInfo, true);
+ }
+
+ // ãºã¼ã ç¶æ
ã復å
ãã
+ Double zoomFactor = workingSet2.getZoomFactor();
+ if (appConfig.isEnableRestoreWindow() && zoomFactor != null) {
+ previewPane.setZoomFactor(zoomFactor);
+ final Point viewPosition = workingSet2.getViewPosition();
+ if (viewPosition != null) {
+ previewPane.setViewPosition(viewPosition);
+ }
+ }
+
+ return true;
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ return false;
+ }
+
+
+ public void onAbout() {
+ try {
+ AboutBox aboutBox = new AboutBox(this);
+ aboutBox.showAboutBox();
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ protected void onHelp() {
+ Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
+ .getLocalizedProperties(STRINGS_RESOURCE);
+ String helpURL = strings.getProperty("help.url");
+ String helpDescription = strings.getProperty("help.show");
+ DesktopUtilities.browse(this, helpURL, helpDescription);
+ }
+
+ protected void onFlipHolizontal() {
+ if (!characterData.isValid()) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+
+ double[] affineTransformParameter = partsSelectionManager.getAffineTransformParameter();
+ if (affineTransformParameter == null) {
+ // å·¦å³ããªããããã¢ãã£ã³å¤æãã©ã¡ã¼ã¿ãæ§ç¯ãã.
+ Dimension siz = characterData.getImageSize();
+ if (siz != null) {
+ affineTransformParameter = new double[] {-1., 0, 0, 1., siz.width, 0};
+ }
+ } else {
+ // ã¢ãã£ã³å¤æãã©ã¡ã¼ã¿ãã¯ãªã¢ãã.
+ affineTransformParameter = null;
+ }
+ partsSelectionManager.setAffineTransformParameter(affineTransformParameter);
+ requestPreview();
+ }
+
+ protected void onSetDefaultPicture() {
+ if (!characterData.isValid()) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+ try {
+ BufferedImage samplePicture = previewPane.getPreviewImage();
+ if (samplePicture != null) {
+ CharacterDataPersistent persist = CharacterDataPersistent.getInstance();
+ persist.saveSamplePicture(characterData, samplePicture);
+ }
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ protected void onInformation() {
+ if (!characterData.isValid()) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+
+ PartsSet partsSet = partsSelectionManager.createPartsSet();
+ InformationDialog infoDlg = new InformationDialog(this, characterData, partsSet, customLayerPatternMgr);
+ infoDlg.setVisible(true);
+ }
+
+ protected void onManageCustomLayer() {
+ List categories = characterData.getPartsCategories();
+
+ // ã¬ã¤ã¤ã¼ç·¨éãã¤ã¢ãã°ã®æ§ç¯
+ final LayerOrderCustomizeDialog layerOrderCustomDlg = new LayerOrderCustomizeDialog(this, categories);
+ layerOrderCustomDlg.setModalityType(ModalityType.APPLICATION_MODAL);
+ layerOrderCustomDlg.addLayerOrderCustomizeListener(new LayerOrderCustomizeListener() {
+ @Override
+ public void onChange(charactermanaj.ui.LayerOrderCustomizeDialog.LayerOrderCustomizeListener.Change e) {
+ // ã¬ã¤ã¤ã¼ãã¿ã¼ã³ã®ç·¨éããããå ´åããã¬ãã¥ã¼ãã
+ customLayerPatternMgr.applyCustomLayerOrder(layerOrderCustomDlg.getEdittingCustomLayerOrderList());
+ requestPreview();
+ }
+ });
+
+ // ç¾å¨ä¿æãã¦ããã¬ã¤ã¤ã¼ãã¿ã¼ã³ã®ä¸è¦§ãåå¾ãã
+ final LayerOrderCustomizeDialogModel layerOrderCustomDialogModel = new LayerOrderCustomizeDialogModel();
+ for (Map.Entry> entry : customLayerPatternMgr.getMap().entrySet()) {
+ String patternName = entry.getKey();
+ List customLayerOrderList = entry.getValue();
+ layerOrderCustomDialogModel.put(patternName, customLayerOrderList);
+ }
+
+ // ç¾å¨é¸æãã¦ããã¢ã¯ãã£ããªã¬ã¤ã¤ã¼ãã¿ã¼ã³ãåå¾ãã
+ List currentList = customLayerPatternMgr.getMergedCustomLayerOrderList();
+ layerOrderCustomDialogModel.setCurrentList(currentList);
+
+ layerOrderCustomDlg.setModel(layerOrderCustomDialogModel);
+
+ // ãã¿ã¼ã³ã®ä¿åæ
+ layerOrderCustomDialogModel.addListChangeListener(new LayerOrderCustomizeDialogModel.ChangeListener() {
+ @Override
+ public void onChange(Change change) {
+ try {
+ // ç·¨éãããã¬ã¤ã¤ã¼ãã¿ã¼ã³ã®ä¸è¦§ãä¿åããã
+ Map> customLayerPatternMap =
+ new HashMap>();
+ for (String patternName : layerOrderCustomDialogModel.getPatternNames()) {
+ List customLayerOrderList = layerOrderCustomDialogModel.getCopy(patternName);
+ if (customLayerOrderList != null) {
+ customLayerPatternMap.put(patternName, customLayerOrderList);
+ }
+ }
+
+ // ãã®ç»é¢ã®ã«ã¹ã¿ã ã¬ã¤ã¤ã¼ç®¡çãæ´æ°ãã
+ customLayerPatternMgr.setMap(customLayerPatternMap);
+
+ // è¨å®ããã¬ã¤ã¤ã¼ãã¿ã¼ã³ããã¡ã¤ã«ã«æ°¸ç¶åãã
+ CustomLayerOrderPersist persist = CustomLayerOrderPersist.newInstance(characterData);
+ persist.save(customLayerPatternMap);
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(MainFrame.this, ex);
+ }
+ }
+ });
+
+ // ã¢ã¼ãã«ã§ãã¤ã¢ãã°ã表示ãã
+ layerOrderCustomDlg.setLocationByPlatform(true);
+ layerOrderCustomDlg.setVisible(true);
+
+ // æå¾ã«é¸æã¾ãã¯ä¿åãããã¿ã¼ã³åãããã©ã«ãã§é¸æç¶æ
ã¨ãã
+ String lastPatternName = layerOrderCustomDlg.getLastPatternName();
+ if (lastPatternName != null && lastPatternName.trim().length() > 0) {
+ customLayerPatternMgr.setSelected(lastPatternName, true);
+ }
+
+ requestPreview();
+ }
+
+ protected void onManageFavorites() {
+ if (!characterData.isValid()) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+
+ if (lastUseManageFavoritesDialog != null) {
+ // éãã¦ãããã¤ã¢ãã°ãããã°ãããã«ãã©ã¼ã«ã¹ãå½ã¦ã.
+ if (lastUseManageFavoritesDialog.isDisplayable()
+ && lastUseManageFavoritesDialog.isVisible()) {
+ lastUseManageFavoritesDialog.requestFocus();
+ return;
+ }
+ }
+
+ // ãæ°ã«å
¥ãç·¨éãã¤ã¢ãã°ãéã
+ ManageFavoriteDialog dlg = new ManageFavoriteDialog(this, characterData);
+ dlg.setFavoriteManageCallback(new FavoriteManageCallback() {
+
+ public void selectFavorites(PartsSet partsSet) {
+ // ãæ°ã«å
¥ãç·¨éãã¤ã¢ãã°ã§é¸æããããã¼ããé¸æ表示ãã.
+ selectPresetParts(partsSet);
+ }
+
+ public void updateFavorites(CharacterData characterData,
+ boolean savePreset) {
+ // ãæ°ã«å
¥ããç»é²ãã.
+ try {
+ setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+ try {
+ CharacterDataPersistent persiste = CharacterDataPersistent
+ .getInstance();
+ if (savePreset) {
+ persiste.updateProfile(characterData);
+ }
+
+ persiste.saveFavorites(characterData);
+
+ // ãæ°ã«å
¥ããæ´æ°ããããã¨ãéç¥ãã.
+ FavoritesChangeObserver.getDefault()
+ .notifyFavoritesChange(MainFrame.this,
+ characterData);
+
+ } finally {
+ setCursor(Cursor.getDefaultCursor());
+ }
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(MainFrame.this, ex);
+ }
+ }
+ });
+ WindowAdjustLocationSupport.alignRight(this, dlg, 0, true);
+ dlg.setVisible(true);
+ lastUseManageFavoritesDialog = dlg;
+ }
+
+ protected void onRegisterFavorite() {
+ if (!characterData.isValid()) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+ try {
+ // ãã¼ãã»ãããçæ
+ PartsSet partsSet = partsSelectionManager.createPartsSet();
+ if (partsSet.isEmpty()) {
+ // 空ã®ãã¼ãã»ããã¯ç»é²ããªã.
+ return;
+ }
+
+ Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
+ .getLocalizedProperties(STRINGS_RESOURCE);
+
+ // ãæ°ã«å
¥ãã«ç»é²ãããã¼ãã»ãããæå¾ã«ä½¿ç¨ãããæ°ã«å
¥ãã¨åãæ§æã§ããã°ã
+ // ãã®ãæ°ã«å
¥ãåã使ç¨ãã.
+ String initName = getSuggestPartsSetName(partsSet, false);
+
+ // ã«ã©ã¼æ
å ±ã®æç¡ã®ãã§ãã¯ããã¯ã¹.
+ JCheckBox chkColorInfo = new JCheckBox(strings.getProperty("input.favoritesColorInfo"));
+ chkColorInfo.setSelected(true);
+ String partsSetId = null;
+ if (initName != null && lastUsePresetParts != null) {
+ partsSetId = lastUsePresetParts.getPartsSetId();
+ }
+
+ // ä¸æ¸ãä¿åã®å¯å¦ã®ãã§ãã¯ããã¯ã¹
+ JCheckBox chkOverwrite = new JCheckBox(strings.getProperty("input.favoritesOverwrite"));
+ chkOverwrite.setSelected(partsSetId != null && partsSetId.length() > 0);
+ chkOverwrite.setEnabled(partsSetId != null && partsSetId.length() > 0);
+
+ // ãã§ãã¯ããã¯ã¹ããã«
+ Box checkboxsPanel = new Box(BoxLayout.PAGE_AXIS);
+ checkboxsPanel.add(chkColorInfo);
+ checkboxsPanel.add(chkOverwrite);
+
+ // å
¥åãã¤ã¢ãã°ãéã
+ String name = (String) JOptionPane.showInputDialog(this,
+ checkboxsPanel,
+ strings.getProperty("input.favorites"),
+ JOptionPane.QUESTION_MESSAGE,
+ null,
+ null,
+ initName == null ? "" : initName);
+ if (name == null || name.trim().length() == 0) {
+ return;
+ }
+
+ boolean includeColorInfo = chkColorInfo.isSelected();
+ if (!includeColorInfo) {
+ // ã«ã©ã¼æ
å ±ãé¤å»ãã.
+ partsSet.removeColorInfo();
+ }
+
+ // æ°è¦ã®å ´åããããã¯ä¸æ¸ãããªãå ´åã¯IDãè¨å®ãã.
+ if (partsSetId == null || !chkOverwrite.isSelected()) {
+ partsSetId = "ps" + UUID.randomUUID().toString();
+ }
+ partsSet.setPartsSetId(partsSetId);
+
+ // ååãè¨å®ãã.
+ partsSet.setLocalizedName(name);
+
+ // ãã¡ã¤ã«ã«ä¿å
+ setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+ try {
+ CharacterDataPersistent persiste = CharacterDataPersistent.getInstance();
+ // ç¾å¨ã®ææ°æ
å ±ãåãåºã.
+ characterData.clearPartsSets(true);
+ persiste.loadFavorites(characterData);
+
+ // ãæ°ã«å
¥ãã³ã¬ã¯ã·ã§ã³ã«ç»é²
+ characterData.addPartsSet(partsSet);
+
+ persiste.saveFavorites(characterData);
+
+ // ãæ°ã«å
¥ããæ´æ°ããããã¨ãéç¥ãã.
+ FavoritesChangeObserver.getDefault().notifyFavoritesChange(
+ MainFrame.this, characterData);
+
+ } finally {
+ setCursor(Cursor.getDefaultCursor());
+ }
+
+ // æå¾ã«é¸æãããæ°ã«å
¥ãã«ãã
+ lastUsePresetParts = partsSet;
+ showPresetName(partsSet);
+
+ } catch (Exception ex) {
+ ErrorMessageHelper.showErrorDialog(this, ex);
+ }
+ }
+
+ /**
+ * ã©ã³ãã é¸æãã¤ã¢ãã°ãéã.
+ */
+ protected void onToolRandom() {
+ if (!characterData.isValid()) {
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ tk.beep();
+ return;
+ }
+
+ if (lastUsePartsRandomChooserDialog != null) {
+ // éãã¦ãããã¤ã¢ãã°ãããã°ãããã«ãã©ã¼ã«ã¹ãå½ã¦ã.
+ if (lastUsePartsRandomChooserDialog.isDisplayable()
+ && lastUsePartsRandomChooserDialog.isVisible()) {
+ lastUsePartsRandomChooserDialog.requestFocus();
+ return;
+ }
+ }
+
+ // ãæ°ã«å
¥ãç·¨éãã¤ã¢ãã°ãéã
+ PartsRandomChooserDialog dlg = new PartsRandomChooserDialog(this,
+ characterData,
+ new PartsRandomChooserDialog.PartsSetSynchronizer() {
+ public PartsSet getCurrentPartsSet() {
+ // ç¾å¨ã®ãã¼ãã»ãããçæ
+ return partsSelectionManager.createPartsSet();
+ }
+
+ public void setPartsSet(PartsSet partsSet) {
+ selectPresetParts(partsSet);
+ }
+
+ public boolean
+ isExcludePartsIdentifier(PartsIdentifier partsIdentifier) {
+ Boolean exclude = randomExcludePartsIdentifierMap
+ .get(partsIdentifier);
+ return exclude != null && exclude.booleanValue();
+ }
+
+ public void
+ setExcludePartsIdentifier(PartsIdentifier partsIdentifier,
+ boolean exclude) {
+ randomExcludePartsIdentifierMap.put(partsIdentifier,
+ exclude);
+ }
+ });
+
+ WindowAdjustLocationSupport.alignRight(this, dlg, 0, true);
+ dlg.setVisible(true);
+ lastUsePartsRandomChooserDialog = dlg;
+ }
+
+ /**
+ * ã©ã³ãã é¸æãã¼ãã§é¸æåè£ããé¤å¤ãããã¼ãã®ããã.
+ */
+ private HashMap randomExcludePartsIdentifierMap =
+ new HashMap();
+
+ /**
+ * ãã¹ã¦ã®è§£é¤å¯è½ãªãã¼ãã®é¸æã解é¤ããã
+ */
+ protected void onDeselectAll() {
+ partsSelectionManager.deselectAll();
+ }
+
+ /**
+ * åä¸é¸æã«ãã´ãªã®ãã¼ãã®è§£é¤ã許å¯ããã
+ */
+ protected void onDeselectableAllCategory() {
+ partsSelectionManager
+ .setDeselectableSingleCategory( !partsSelectionManager
+ .isDeselectableSingleCategory());
+ }
+
+ /**
+ * ãã¬ãã¥ã¼ã®ãºã¼ã ããã¯ã¹ã®è¡¨ç¤ºå¶å¾¡
+ */
+ protected void onEnableZoom() {
+ previewPane.setVisibleZoomBox( !previewPane.isVisibleZoomBox());
+ }
+
+ /**
+ * ã¡ãã¥ã¼ãã¼ãæ§ç¯ãã¾ã.
+ *
+ * @return ã¡ãã¥ã¼ãã¼
+ */
+ protected JMenuBar createMenuBar() {
+ final Properties strings = LocalizedResourcePropertyLoader
+ .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE);
+
+ MenuDataFactory[] menus = new MenuDataFactory[] {
+ new MenuDataFactory("menu.file", new MenuDataFactory[] {
+ new MenuDataFactory("file.openProfile", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onOpenProfile();
+ }
+ }),
+ new MenuDataFactory("file.savePicture", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onSavePicture();
+ }
+ }),
+ new MenuDataFactory("file.ukagaka", new MenuDataFactory[] {
+ new MenuDataFactory("file.saveAsUkagaka", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onSaveAsUkagaka();
+ };
+ }),
+ new MenuDataFactory("file.convertUkagaka", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onConvertUkagaka();
+ };
+ }),
+ }),
+ null,
+ new MenuDataFactory("file.editprofile", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onEditProfile();
+ }
+ }),
+ new MenuDataFactory("file.opendir", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onBrowseProfileDir();
+ }
+ }),
+ new MenuDataFactory("file.import", new MenuDataFactory[] {
+ new MenuDataFactory("file.importMe", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onImport(null);
+ };
+ }),
+ new MenuDataFactory("file.importNew", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onImportNew();
+ };
+ }),
+ }),
+ new MenuDataFactory("file.export", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onExport();
+ };
+ }),
+ new MenuDataFactory("file.manageParts", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onManageParts();
+ }
+ }),
+ new MenuDataFactory("file.preferences", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onPreferences();
+ };
+ }),
+ null,
+ new MenuDataFactory("file.closeProfile", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onCloseProfile();
+ }
+ }),
+ }),
+ new MenuDataFactory("menu.edit", new MenuDataFactory[] {
+ new MenuDataFactory("edit.search", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ openSearchDialog();
+ }
+ }),
+ new MenuDataFactory("edit.copy", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onCopy((e.getModifiers() & ActionEvent.SHIFT_MASK) != 0);
+ }
+ }),
+ new MenuDataFactory("edit.flipHorizontal", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onFlipHolizontal();
+ }
+ }),
+ new MenuDataFactory("edit.resetcolor", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onResetColor();
+ }
+ }),
+ null,
+ new MenuDataFactory("edit.setDefaultPicture", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onSetDefaultPicture();
+ }
+ }),
+ new MenuDataFactory("edit.information", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onInformation();
+ }
+ }),
+ null,
+ new MenuDataFactory("edit.deselectall", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onDeselectAll();
+ }
+ }),
+ new MenuDataFactory("edit.deselectparts", true, new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onDeselectableAllCategory();
+ }
+ }),
+ new MenuDataFactory("edit.enableAutoShrink", true, new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onClickPartsCategoryTitle(null, true);
+ }
+ }),
+ null,
+ new MenuDataFactory("edit.enableZoomBox", true, new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onEnableZoom();
+ }
+ }),
+ null,
+ new MenuDataFactory("edit.changeBgColor", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onChangeBgColor();
+ }
+ }),
+ new MenuDataFactory("edit.changeWallpaper", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onChangeWallpaper();
+ }
+ }),
+ }),
+ new MenuDataFactory("menu.favorite", new MenuDataFactory[] {
+ new MenuDataFactory("favorite.register", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onRegisterFavorite();
+ }
+ }),
+ new MenuDataFactory("favorite.manage", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onManageFavorites();
+ }
+ }),
+ null,
+ }),
+ new MenuDataFactory("menu.customlayer", new MenuDataFactory[] {
+ new MenuDataFactory("customlayer.manage", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onManageCustomLayer();
+ }
+ }),
+ null,
+ }),
+ new MenuDataFactory("menu.tool",
+ new MenuDataFactory[]{new MenuDataFactory(
+ "tool.random", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onToolRandom();
+ }
+ }),}),
+ new MenuDataFactory("menu.help", new MenuDataFactory[] {
+ new MenuDataFactory("help.recommendations", (ActionListener) null),
+ null,
+ new MenuDataFactory("help.help", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onHelp();
+ }
+ }),
+ new MenuDataFactory("help.forum",
+ DesktopUtilities.createBrowseAction(
+ MainFrame.this,
+ strings.getProperty("help.forum.url"),
+ strings.getProperty("help.forum.description"))
+ ),
+ new MenuDataFactory("help.bugreport",
+ DesktopUtilities.createBrowseAction(
+ MainFrame.this,
+ strings.getProperty("help.reportbugs.url"),
+ strings.getProperty("help.reportbugs.description"))
+ ),
+ new MenuDataFactory("help.about", new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onAbout();
+ }
+ }),
+ }), };
+
+ final MenuBuilder menuBuilder = new MenuBuilder();
+
+ JMenuBar menuBar = menuBuilder.createMenuBar(menus);
+
+ menuBuilder.getJMenu("menu.edit").addMenuListener(new MenuListener() {
+ public void menuCanceled(MenuEvent e) {
+ // do nothing.
+ }
+ public void menuDeselected(MenuEvent e) {
+ // do nothing.
+ }
+ public void menuSelected(MenuEvent e) {
+ menuBuilder.getJMenuItem("edit.copy").setEnabled(previewPane.getPreviewImage() != null);
+ menuBuilder.getJMenuItem("edit.deselectparts").setSelected(
+ partsSelectionManager.isDeselectableSingleCategory());
+ menuBuilder.getJMenuItem("edit.enableAutoShrink").setSelected(minimizeMode);
+ menuBuilder.getJMenuItem("edit.enableZoomBox").setSelected(previewPane.isVisibleZoomBox());
+ }
+ });
+ final JMenu mnuFavorites = menuBuilder.getJMenu("menu.favorite");
+ mnuFavorites.addMenuListener(new MenuListener() {
+ public void menuCanceled(MenuEvent e) {
+ // do nothing.
+ }
+ public void menuDeselected(MenuEvent e) {
+ // do nothing.
+ }
+ public void menuSelected(MenuEvent e) {
+ onSelectedFavoriteMenu(mnuFavorites);
+ }
+ });
+ final JMenu mnuCustomLayer = menuBuilder.getJMenu("menu.customlayer");
+ mnuCustomLayer.addMenuListener(new MenuListener() {
+ public void menuCanceled(MenuEvent e) {
+ // do nothing.
+ }
+ public void menuDeselected(MenuEvent e) {
+ // do nothing.
+ }
+ public void menuSelected(MenuEvent e) {
+ onSelectedCustomLayerMenu(mnuCustomLayer);
+ }
+ });
+
+ // J2SE5ã®å ´åã¯ããã¼ããã£ã¬ã¯ããªãéããã³ãã³ãã¯ä½¿ç¨ä¸å¯ã¨ãã.
+ if (System.getProperty("java.version").startsWith("1.5")) {
+ menuBuilder.getJMenuItem("file.opendir").setEnabled(false);
+ }
+
+ // ãå§ããµã¤ãã¡ãã¥ã¼æ§ç¯
+ final JMenu mnuRecomendation = menuBuilder.getJMenu("help.recommendations");
+ JMenu mnuHelp = menuBuilder.getJMenu("menu.help");
+ mnuHelp.addMenuListener(new MenuListener() {
+ public void menuCanceled(MenuEvent e) {
+ // do nothing.
+ }
+ public void menuDeselected(MenuEvent e) {
+ // do nothing.
+ }
+ public void menuSelected(MenuEvent e) {
+ onSelectedRecommendationMenu(mnuRecomendation);
+ }
+ });
+
+ return menuBar;
+ }
+
+}