package open.dolphin.stampbox; import java.io.*; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import javax.swing.*; import open.dolphin.client.BlockGlass; import open.dolphin.client.ClientContext; import open.dolphin.helper.InfiniteProgressBar; import open.dolphin.infomodel.IInfoModel; /** * StampBox の特別メニュー * @author pns * modified by masuda */ public class UserStampBoxExportImporter { private final StampBoxPlugin context; private final AbstractStampBox stampBox; private InfiniteProgressBar progressBar; public UserStampBoxExportImporter(StampBoxPlugin ctx) { super(); context = ctx; stampBox = context.getUserStampBox(); } private BlockGlass getBlockGlass() { BlockGlass blockGlass = context.getBlockGlass(); blockGlass.setSize(context.getFrame().getSize()); return blockGlass; } /** * スタンプを xml ファイルに書き出す */ public void exportUserStampBox() { // 保存する StampTree の XML データを生成する //masuda^ blockGlassを入れたりSwingWorkerを入れたり・・・ //masuda エクスポートデータ作成より前にファイル選択させる java.util.ResourceBundle bundle = ClientContext.getMyBundle(UserStampBoxExportImporter.class); String title = bundle.getString("title.fileChooser.exportStamp"); JFileChooser fileChooser = new JFileChooser(); fileChooser.setDialogType(JFileChooser.SAVE_DIALOG); fileChooser.setDialogTitle(title); File current = fileChooser.getCurrentDirectory(); fileChooser.setSelectedFile(new File(current.getPath(), "DolphinStamp.xml")); int selected = fileChooser.showSaveDialog(context.getFrame()); if (selected == JFileChooser.APPROVE_OPTION) { final File file = fileChooser.getSelectedFile(); if (!file.exists() || overwriteConfirmed(file)) { SwingWorker worker = new SwingWorker<String, Void>() { @Override protected String doInBackground() throws Exception { //masuda stampBytesを含めたデータを書き出す ExtendedStampTreeXmlBuilder builder = new ExtendedStampTreeXmlBuilder(); ExtendedStampTreeXmlDirector director = new ExtendedStampTreeXmlDirector(builder); //BlockGlass blockGlass = getBlockGlass(); //blockGlass.setText("スタンプ箱をエクスポート中です。"); //blockGlass.block(); ArrayList<StampTree> publishList = new ArrayList<>(IInfoModel.STAMP_ENTITIES.length); publishList.addAll(stampBox.getAllTrees()); String ret = director.build(publishList); return ret; } @Override protected void done() { String xml; //minagawa^ mac jdk7 // FileOutputStream fos = null; // OutputStreamWriter writer = null; //minagawa$ try { xml = get(); //minagawa^ mac jdk7 // fos = new FileOutputStream(file); // writer = new OutputStreamWriter(fos, "UTF-8"); // // 書き出す内容 // writer.write(xml); // writer.flush(); //minagawa$ Path destpath = file.toPath(); Files.write(destpath, xml.getBytes("UTF-8")); } catch (InterruptedException | ExecutionException ex) { processException(ex); } catch (FileNotFoundException ex) { processException(ex); } catch (UnsupportedEncodingException ex) { processException(ex); } catch (IOException ex) { processException(ex); } // finally { // try { // writer.close(); // fos.close(); // } catch (IOException | NullPointerException ex) { // processException(ex); // } // } BlockGlass blockGlass = getBlockGlass(); blockGlass.unblock(); progressBar.stop(); progressBar = null; } private void processException(Exception ex){ System.out.println("StampBoxPluginExtraMenu.java: " + ex); } }; //minagawa^ 念のため doInbackground の外に出す BlockGlass blockGlass = getBlockGlass(); blockGlass.block(); String note = bundle.getString("note.progress.exportingStampBox"); progressBar = new InfiniteProgressBar("StampBoxExport", note, stampBox); progressBar.start(); //minagawa$ worker.execute(); } } //masuda$ } /** * ファイル上書き確認ダイアログを表示する。 * @param file 上書き対象ファイル * @return 上書きOKが指示されたらtrue */ private boolean overwriteConfirmed(File file){ java.util.ResourceBundle bundle = ClientContext.getMyBundle(UserStampBoxExportImporter.class); String title = bundle.getString("title.optionPane.override"); // String message = "既存のファイル " + file.toString() + "\n" // +"を上書きしようとしています。続けますか?"; String fmt = bundle.getString("messageFormat.overriding.existingFile"); String message = new MessageFormat(fmt).format(new String[]{file.toString()}); int confirm = JOptionPane.showConfirmDialog( //int confirm = MyJSheet.showConfirmDialog( context.getFrame(), message, title, JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE ); if(confirm == JOptionPane.OK_OPTION) { return true; } return false; } /** * xml ファイルから新しい userStampBox を作る * modified minagawa. doInBackgroundから component へのアクセスを外す。 */ public void importUserStampBox() { final java.util.ResourceBundle bundle = ClientContext.getMyBundle(UserStampBoxExportImporter.class); String title = bundle.getString("title.fileChooser.importStamp"); final JFileChooser fileChooser = new JFileChooser(); fileChooser.setDialogType(JFileChooser.OPEN_DIALOG); fileChooser.setDialogTitle(title); File current = fileChooser.getCurrentDirectory(); //fileChooser.setSelectedFile(new File(current.getPath(), "DolphinStamp.xml")); //int selected = fileChooser.showSaveDialog(context.getFrame()); int selected = fileChooser.showOpenDialog(context.getFrame()); if (selected == JFileChooser.APPROVE_OPTION) { final File file = fileChooser.getSelectedFile(); SwingWorker worker = new SwingWorker<List<StampTree>, Void>(){ @Override protected List<StampTree> doInBackground() throws Exception { //BlockGlass blockGlass = getBlockGlass(); //blockGlass.setText("スタンプ箱インポート中です。"); //blockGlass.block(); // xml ファイルから StampTree 作成 //minagawa^ mac jdk7 //FileInputStream in = new FileInputStream(file); //BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); BufferedReader reader = Files.newBufferedReader(file.toPath(), Charset.forName("UTF-8")); //minagawa$ //masuda^ stampBytesを含めたデータを読み込む ExtendedStampTreeDirector director = new ExtendedStampTreeDirector(new ExtendedStampTreeBuilder()); //masuda$ List<StampTree> userTrees = director.build(reader); reader.close(); return userTrees; } @Override protected void done() { boolean imported = false; try { List<StampTree> userTrees = get(); int currentTab = stampBox.getSelectedIndex(); StampTreeTransferHandler transferHandler = new StampTreeTransferHandler(); for (final StampTree stampTree : userTrees) { // ORCA は無視 if (stampTree.getEntity().equals(IInfoModel.ENTITY_ORCA)) { continue; } // 読み込んだ stampTree から StampTreePanel を作る stampTree.setUserTree(true); stampTree.setTransferHandler(transferHandler); stampTree.setStampBox(context); StampTreePanel treePanel = new StampTreePanel(stampTree); // 作った StampTreePanel を該当する tab に replace String treeName = stampTree.getTreeName(); int index = stampBox.indexOfTab(treeName); stampBox.removeTabAt(index); //stampBox.addTab(treeName, treePanel, index); stampBox.add(treePanel, treeName, index); } stampBox.setSelectedIndex(currentTab); imported = true; } catch (InterruptedException | ExecutionException ex) { processException(ex); } BlockGlass blockGlass = getBlockGlass(); blockGlass.unblock(); progressBar.stop(); progressBar = null; if(imported) { String msg = bundle.getString("message.importDone"); String title = bundle.getString("title.optionPane.import"); title = ClientContext.getFrameTitle(title); JOptionPane.showMessageDialog(context.getFrame(), msg, title, JOptionPane.INFORMATION_MESSAGE); } } private void processException(Exception ex) { System.out.println("StampBoxPluginExtraMenu.java: " + ex); } }; BlockGlass blockGlass = getBlockGlass(); blockGlass.block(); String note = bundle.getString("note.progress.importing"); progressBar = new InfiniteProgressBar("StampBoxImport", note, stampBox); progressBar.start(); worker.execute(); } } }