From 8141697e3fe7d41805c781d28a3d02324211cf73 Mon Sep 17 00:00:00 2001 From: XiaXiang Date: Sun, 21 Apr 2019 20:11:11 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-14835=20=E6=A8=A1=E6=9D=BF=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=AE=A1=E7=90=86=E4=BC=98=E5=8C=96=E5=8F=8A=E5=86=85?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DesignerFrameFileDealerPane.java | 70 ++++++- .../design/mainframe/toolbar/VcsConfig.java | 74 +++++++ .../design/mainframe/toolbar/VcsContext.java | 17 ++ .../vcs/images/icon_back_normal@2x.png | Bin 0 -> 804 bytes .../mainframe/vcs/images/icon_delete.png | Bin 0 -> 167 bytes .../mainframe/vcs/images/icon_delete@2x.png | Bin 0 -> 211 bytes .../design/mainframe/vcs/images/icon_edit.png | Bin 0 -> 398 bytes .../mainframe/vcs/images/icon_edit@2x.png | Bin 0 -> 730 bytes .../mainframe/vcs/images/icon_filter@1x.png | Bin 0 -> 317 bytes .../mainframe/vcs/images/icon_filter@2x.png | Bin 0 -> 537 bytes .../vcs/images/icon_list_disabled.png | Bin 0 -> 289 bytes .../vcs/images/icon_list_disabled@2x.png | Bin 0 -> 605 bytes .../vcs/images/icon_list_normal@2x.png | Bin 0 -> 586 bytes .../mainframe/vcs/images/icon_revert.png | Bin 0 -> 512 bytes .../mainframe/vcs/images/icon_revert@2x.png | Bin 0 -> 971 bytes .../vcs/images/icon_save_disabled.png | Bin 0 -> 467 bytes .../vcs/images/icon_save_disabled@2x.png | Bin 0 -> 926 bytes .../vcs/images/icon_save_normal@2x.png | Bin 0 -> 908 bytes .../mainframe/vcs/images/icon_user@1x.png | Bin 0 -> 376 bytes .../mainframe/vcs/images/icon_user@2x.png | Bin 0 -> 668 bytes .../design/mainframe/vcs/images/vcs_back.png | Bin 0 -> 310 bytes .../design/mainframe/vcs/images/vcs_list.png | Bin 0 -> 286 bytes .../design/mainframe/vcs/images/vcs_save.png | Bin 0 -> 453 bytes .../vcs/proxy/VcsCacheFileNodeFileProxy.java | 74 +++++++ .../vcs/ui/FileVersionCellEditor.java | 83 ++++++++ .../vcs/ui/FileVersionCellRender.java | 43 ++++ .../mainframe/vcs/ui/FileVersionDialog.java | 77 ++++++++ .../vcs/ui/FileVersionFirstRowPanel.java | 20 ++ .../mainframe/vcs/ui/FileVersionRowPanel.java | 148 ++++++++++++++ .../vcs/ui/FileVersionTablePanel.java | 86 ++++++++ .../mainframe/vcs/ui/FileVersionsPanel.java | 187 ++++++++++++++++++ .../src/main/java/com/fr/start/Designer.java | 52 ++++- 32 files changed, 927 insertions(+), 4 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/toolbar/VcsConfig.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/toolbar/VcsContext.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_back_normal@2x.png create mode 100755 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_delete.png create mode 100755 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_delete@2x.png create mode 100755 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_edit.png create mode 100755 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_edit@2x.png create mode 100755 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_filter@1x.png create mode 100755 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_filter@2x.png create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_list_disabled.png create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_list_disabled@2x.png create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_list_normal@2x.png create mode 100755 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_revert.png create mode 100755 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_revert@2x.png create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_save_disabled.png create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_save_disabled@2x.png create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_save_normal@2x.png create mode 100755 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_user@1x.png create mode 100755 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_user@2x.png create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/vcs_back.png create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/vcs_list.png create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/images/vcs_save.png create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/proxy/VcsCacheFileNodeFileProxy.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellEditor.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellRender.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionDialog.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionFirstRowPanel.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionRowPanel.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionTablePanel.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index cef5c86a08..48e067d36d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -26,6 +26,8 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.toolbar.VcsConfig; +import com.fr.design.mainframe.vcs.ui.FileVersionsPanel; import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; @@ -43,9 +45,13 @@ import com.fr.plugin.manage.PluginFilter; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; import com.fr.stable.CoreConstants; +import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; +import com.fr.stable.project.ProjectConstants; import com.fr.third.org.apache.commons.io.FilenameUtils; +import com.fr.third.springframework.context.annotation.AnnotationConfigApplicationContext; import com.fr.workspace.WorkContext; +import com.fr.workspace.server.vcs.common.Constants; import javax.swing.BorderFactory; import javax.swing.JDialog; @@ -111,6 +117,8 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt private DelFileAction delFileAction = new DelFileAction(); + private VcsAction vcsAction = new VcsAction(); + /** * 刷新 @@ -191,7 +199,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt if (WorkContext.getCurrent().isLocal()) { toolbarDef.addShortCut(showInExplorerAction); } - toolbarDef.addShortCut(renameAction, delFileAction); + toolbarDef.addShortCut(renameAction, delFileAction, vcsAction); Set extraShortCuts = ExtraDesignClassManager.getInstance().getExtraShortCuts(); for (ShortCut shortCut : extraShortCuts) { toolbarDef.addShortCut(shortCut); @@ -209,6 +217,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt showInExplorerAction.setEnabled(false); renameAction.setEnabled(false); delFileAction.setEnabled(false); + vcsAction.setEnabled(false); this.repaint(); } @@ -273,6 +282,63 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } + /** + * 版本管理 + */ + private class VcsAction extends UpdateAction { + public VcsAction() { + this.setName(Toolkit.i18nText("Plugin-VCS_Title")); + this.setSmallIcon(Constants.VCS_LIST_PNG); + } + + @Override + public void actionPerformed(ActionEvent e) { + String path = DesignerFrameFileDealerPane.getInstance().getSelectedOperation().getFilePath(); + path = StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, path); + + boolean isCurrentEditing = isCurrentEditing(path); + + // 如果模板正在编辑,保存后再打开版本管理 + if (isCurrentEditing) { + saveCurrentEditingTemplate(); + } + + // 如果模板已经打开了,关掉,避免出现2个同名tab(1个是模板,1个是版本) + closeOpendTemplate(path, isCurrentEditing); + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(VcsConfig.class); + FileVersionsPanel fileVersionTablePanel = context.getBean(FileVersionsPanel.class); + fileVersionTablePanel.showFileVersionsPane(); + } + + private void closeOpendTemplate(String path, boolean isCurrentEditing) { + for (JTemplate jTemplate : HistoryTemplateListCache.getInstance().getHistoryList()) { + if (ComparatorUtils.equals(jTemplate.getEditingFILE().getPath(), path)) { + if (isCurrentEditing) { + MutilTempalteTabPane.getInstance().setIsCloseCurrent(true); + } + MutilTempalteTabPane.getInstance().closeFormat(jTemplate); + MutilTempalteTabPane.getInstance().closeSpecifiedTemplate(jTemplate); + return; + } + } + } + + + } + + private void saveCurrentEditingTemplate() { + JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + jt.stopEditing(); + jt.saveTemplate(); + jt.requestFocus(); + } + + private boolean isCurrentEditing(String path) { + JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + String editing = jt.getEditingFILE().getPath(); + return ComparatorUtils.equals(editing, path); + } + /** * 在系统资源管理器中打开 */ @@ -386,11 +452,11 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt newFolderAction.setEnabled(singleSelected); renameAction.setEnabled(singleSelected); showInExplorerAction.setEnabled(singleSelected); + vcsAction.setEnabled(singleSelected); // 删除操作在至少选中一个时可用 boolean selected = selectedPathNum > 0; delFileAction.setEnabled(selected); - // 刷新操作始终可用 refreshTreeAction.setEnabled(true); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/VcsConfig.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/VcsConfig.java new file mode 100644 index 0000000000..8364f546f0 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/VcsConfig.java @@ -0,0 +1,74 @@ +package com.fr.design.mainframe.toolbar; + +import com.fr.design.mainframe.vcs.ui.FileVersionCellEditor; +import com.fr.design.mainframe.vcs.ui.FileVersionCellRender; +import com.fr.design.mainframe.vcs.ui.FileVersionFirstRowPanel; +import com.fr.design.mainframe.vcs.ui.FileVersionRowPanel; +import com.fr.design.mainframe.vcs.ui.FileVersionTablePanel; +import com.fr.design.mainframe.vcs.ui.FileVersionsPanel; +import com.fr.third.javax.inject.Singleton; +import com.fr.third.springframework.context.annotation.Bean; +import com.fr.third.springframework.context.annotation.ComponentScan; +import com.fr.third.springframework.context.annotation.Configuration; +import com.fr.workspace.WorkContext; +import com.fr.workspace.server.vcs.VcsOperator; +import com.fr.workspace.server.vcs.VcsOperatorImpl; +import com.fr.workspace.server.vcs.filesystem.VcsFileSystem; +import com.fr.workspace.server.vcs.git.FineGit; + + +/** + * Created by XiaXiang on 2019/4/16. + */ +@Configuration +@ComponentScan({"com.fr.workspace.server.vcs", "com.fr.design.mainframe.vcs"}) +public class VcsConfig { + @Bean + @Singleton + public FileVersionsPanel fileVersionsPanel() { + return new FileVersionsPanel(fileVersionTablePanel()); + } + + @Bean + @Singleton + public FileVersionTablePanel fileVersionTablePanel() { + return new FileVersionTablePanel(vcsOperator(), fileVersionCellEditor(), fileVersionCellRender()); + } + + @Bean + @Singleton + public FileVersionCellEditor fileVersionCellEditor() { + return new FileVersionCellEditor(fileVersionFirstRowPanel(), fileVersionRowPanel(), vcsOperator()); + } + + @Bean + @Singleton + public FileVersionFirstRowPanel fileVersionFirstRowPanel() { + return new FileVersionFirstRowPanel(); + } + + @Bean + public FileVersionRowPanel fileVersionRowPanel() { + return new FileVersionRowPanel(vcsOperator()); + } + + @Bean + @Singleton + public FileVersionCellRender fileVersionCellRender() { + return new FileVersionCellRender(fileVersionFirstRowPanel(), fileVersionRowPanel()); + } + + @Bean + @Singleton + public VcsOperator vcsOperator() { + return new VcsOperatorImpl(vcsFileSystem(), new FineGit(vcsFileSystem().getVcsHistoryPath())); + } + + @Bean + @Singleton + public VcsFileSystem vcsFileSystem() { + return new VcsFileSystem(WorkContext.getCurrent()); + } + + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/VcsContext.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/VcsContext.java new file mode 100644 index 0000000000..894ee95eb6 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/VcsContext.java @@ -0,0 +1,17 @@ +package com.fr.design.mainframe.toolbar; + +import com.fr.third.springframework.context.annotation.AnnotationConfigApplicationContext; + +/** + * Created by XiaXiang on 2019/4/20. + */ +public class VcsContext extends AnnotationConfigApplicationContext { + public static final VcsContext INSTANCE = new VcsContext(); + + public static VcsContext get() { + + return INSTANCE; + } + + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_back_normal@2x.png b/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_back_normal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bb3fd50cdc6b295cb491b7de2023cc024aa27f3e GIT binary patch literal 804 zcmV+<1Ka$GP)Px%-bqA3R9Fe^S3QUmK@^_JKPn;y)Iziou9MT<7%x@8Baq_kP7n*NtOa|C)^e?A zB^DN5qjDYyf(jS<#d%}P$ligJlrzh^Q@*qfQ#jiLw_*v!m(@B8NMn>X`j z8B_fVg+fTB^D8&a)W@N%VVLf4AUaZ^P%7JOHoMC-&5F{16q8YFDP>B$V?!qYCDZyK zQw~E8+7e?&V@hgL!01sbmD;B@GK|z!!#JMS8vPq3MF3CRJA1?{7$4{J`FOKwe`k!Z zT2_sZ>qK8lkWQ!fce_6twrww4R$U4d1WF}B{=#+L=|m#Fvsf%{aD7t(VSxO-?YiuA zI2@X)R;zD?Ja7x53$j!SO!OZE4CB~Y#9_hv3d8N>Rg90ZgDx@FyUAGO{d zqL1V{ECVPLiHrfhhh#d*SmK~%J^K)d0N@h9GqG4SSuU4bGBC-c9sv9r;3 zyiu>$4hVVRmhu3nt#T!N5rU+L=bbO(Eu+600c{#h;t8GI$lnEEiTgdu(jgtsA9H{% z1=xKT`;+lC#=?2aTG8LA243nM)aq!XIgWFS${rcgh6{!GY>@IdQ3P_i-1b&$jn3K= z0}o$e;#{p(8{JQ}u8)*~9LQucd)C)G4>9pHQQ(cA;^3Rp-5f?!$$P#X5Cx)7!xtGl za>lZ5bmX-DrP6vJgX3y*3UB1QE4#0qgbL%LAFid1S6$UwJYZOB>%wC`EgOI0vruzX(F-5Q#60 ibqCAiG29xCMc^l{itpWEp literal 0 HcmV?d00001 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_delete.png b/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..6fb2baac51ead86742e20545aa0a62413be50b12 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|5K|k5|2~(;g&RwlQDDH z6mGYiaof(gobd%$;YW8~2X4ulg}lLC>)IYUq%_XtS$r|Kq4RPN8^beAv5Lrm+Yvy^ O7(8A5T-G@yGywp$2|2L< literal 0 HcmV?d00001 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_delete@2x.png b/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_delete@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..b98c9f4cd256d0541f89536dd00ad38266a4ac66 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}y`CZF_>`rhn_~ z_&2e7;i7A&1A-p1Eb&`WJmt=e`<`vW61^vP3Pw5}y~L^Rz-+*{c3D)+EU%jf*hJ=@ zPn1$%6au0MGvRNX?0+XmHWe_X@voV|on9;Gmynj%zgxUpNj^&=>Ch3N!x%hW{an^L HB{Ts5r8-QC literal 0 HcmV?d00001 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_edit.png b/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..7206039bf6fe35ebdd2358e90c24ec2631653213 GIT binary patch literal 398 zcmV;90df9`P)Px$NJ&INR5%f(k}*rfKoEs@lZy!H#MUB>U@4bK0%B!z$90;{!cJ`b4e9J{L<_MH zETY}TyE0%AF$w;J6j#`YSc=JIeJM5!$0~tKGjC_#_n1k-*pd&IylvZ&5Ns&VwB~u% z`druDDof)l&!68LPfr>fm>OlDR>yJnt7<;wym~=@x4CNrs8OW>Z`8H8$DPi(Hjy4p zivOzb`zu0-2YA*w=abQBcrN{&0*a!zz=}J73&ZFg1wl}E4#4QgfKLE_GbRp_B>C+3 zZP6(JUuGNdWn<=?on~3~CP7*MT*33aHDHg}eHHLknx?lBqE#7y9ksHo?f_eWUoFcz zqY%}~fbn>`2Y3ME2X;RU!|;bfR4W5GpKrnx>AE(+=ral|YUPh)n&wR$$JdKy)mb?K s;7Vmy_1X#WvYzPoRhdaIB6>Ob3o|xqE87|UtN;K207*qoM6N<$g8jFzrT_o{ literal 0 HcmV?d00001 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_edit@2x.png b/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_edit@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..5993e438970be9f2f8f200920bbcdd8dd815b9ac GIT binary patch literal 730 zcmV<00ww*4P)Px%lu1NER9Fe+R?lk_K^UEhY1&94;=zkWnhFYfu$avzA(wblyjcT+dJv?do;(N& zJ@g=WQ1DjJg9U#f#Cj9F88DEz*%kZ;!U}rvphAP%G|Bk3GIVA)Zg#d?1YHQ00#LQ$Y(_|N@EW!%Xlj096xda*=+tOcF`>t z(YsV?`xRGiJ&aU9u~^)LH~kFVZ{uW?(l29U@!49f_LJvC8<~JgrIP4&d(W}mb_)ap zO39gKvuO)C$&E}vyKUbEc|k%abfML1y^?cs6o~)~-8qn7mZ8Z@(==}KTsEsQ=f`7i zH!VQd^}`stdmPZQc<=3WI&~J-Lnzic{-y+!%jKOoY?d)}Ne&FsAF&uciJ|+(bAC3o z0Fcs^mCj>;?~@7GMZ+-O%eg;Cp#^A~J`dOvGBjN@P4khQ^N&Iaz!&ZqhHgQIrp@W; zsjG5sbfhexP$*2{^ZEqP!dm({k%*sie`-h5OCY1mF?17aYdvS^cJXQqT^}%~8;!;% zo>Q?x7o(STI^Qp#>WEy)Zdlga*K#g+q$B|6{2>t<-7jP4Zi_ipUr7LV-hP3gK0cl} zFT|l-&tEcs6t)*#FX5nB#9lZ3YlGcY5|B(z==FO2YcS|wRZ6cQYH~-Sl7L`6sa5@T z0iGGakbT5KGdb+rt=5~j+QD{bhdco`H>}XTP&NLI$>vno{rmO50OTdUv!e9YMF0Q* M07*qoM6N<$f;+2M?EnA( literal 0 HcmV?d00001 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_filter@1x.png b/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_filter@1x.png new file mode 100755 index 0000000000000000000000000000000000000000..7a8ec6287b759b3aab8201425a66f71536186197 GIT binary patch literal 317 zcmV-D0mA-?P)Px#_en%SR5%f1U>In?2y=j~t*z*{Z$Hj6F#MN>iD9D|85yrCDk>PQUcLGkNS+B* z(SLqaJ|^$~|NnwtzI=gO3}=9pnwpwA|NHlUE0D>KsTC~pfti`f;nb;97h&?uFb0Tz z_Uzex85!wo3=E7RKrWi=7``zwvUr|8eeyK29uxzhhFq7Dl6nGU`y(m*&B(|Qbmq*d zeMn+pCWZkZQJ_oCOG!y<1DPPqz{JE@d*;lU`5-nrKzAlw9%$niIER7Z1ri&DiPHcS zRd_gq+kkI)Tn?AQ>4pFQIa-0~0VCSrI*DNblPx1Kbtagbo2wF|o-8#0rYAp~Rrqz` P00000NkvXXu0mjf=n8{` literal 0 HcmV?d00001 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_filter@2x.png b/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_filter@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..9b3a132a7704ceb8798e1ddea5bc72025b72af0f GIT binary patch literal 537 zcmV+!0_OdRP)Px$(@8`@R9Fe^S3OI^Kp4JD(ho4*TneIeb8|?EhzeB{)WO+Z5c~@Y{s=c0ogG~q zZ9qbaZBPq>ij!y&5gZ!vqnP-l5@_oi)3l|7Cd=iX_v^`X*Y~cBMbCd%fKvkGa=D~s zz3e-Vvj}^P@(F=ioD18f(#a+jBT%4aS*s|%3|qIw-So2K*c+;oP;@;K$k`;3iR&@fptTLy$-YB)yd+andl1y8yqs zncRd_plKR;#)K6}`$^fqG5#ou!hE~M-5Ak7*-uNQa(|Uh4?Qzh?~qLnAXY{Dn8VNQ zqR9|2kpk?5neGo*nsd`Eh3*|~F9E@%Cs0HnQXomX6kdE$bBpJ b=L&rR literal 0 HcmV?d00001 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_list_disabled.png b/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_list_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..5325682ff8ec5a050e95b95e5e2d6f0173f9297f GIT binary patch literal 289 zcmV++0p9+JP)Px#+et)0R5%f(Qo#+vFboW7E3pAv@TiJ10Z%6G1cAKRf(`gIf{SvNNl5_FkL^4A zoLp*5{Ts)_N!XV{&}uSG?nn}&HUvKtXh%KDPGFWrjB(4H5tuYsYwsi&fo)JgN-Kc) z{&19Y&h3~ZN{yuHRg-)w$t|?J&ZR+iW>)HVD>T**gFR~i0>HQ?8N~t-(#vA@+BnT4 zhml=puHO4w$(eH7sv!gHOP9n`$)#!&6}$(I;VX;|*zvSrzdH@cWf1l=& nXA|Wm((n4o1MmPx%7fD1xR9Fe^S3OU|Fc5XDl8BkDKY@WE5h@)JOU1^oWkW28p;V|D82Aa@m{C(m z$R&A~Yih?yqY5gK#pm<$eY`t6iBhH~3@`7X*ARM)VK|8ZCtEs>7fUGGN4XWq!UQHt zrQ=$zC63ec^tx8pl1HM<3`=qRdJnnV7)4hTiJVTSr#v^g=(d=nI1Ap<5E!uKQ-ByS zpU*#`mobfkVDu;z6=(x+K@=t!%et7UCk(Of`}$dW#a<)pyeI@jRpdY(n?wt2t5}hc zj+e`qMJv*>$Shjco$65&VPU-qqd8YXMbYHeR%p2s#7W)n%R7xksU%5yon>iY4^OYG z*9GP2;)8kyw}`Qf#ugRfls!|ndQrx1VG9dFEFxI1zh-ne`rkC-MsS5KoNkFm4z>`E z$&nhMs^ML*a~kuMH?BjIS548WWqMp205st`lPJT6K^l=l|FET%qn3B>lV&!=U0$`D zTz}GB+jG9jJKzaN4>hpbqRWk(Q`=yZ73^53l9^RD9|-R3BHXM)os%=zfKAdd0|%g* z>^mP0z(%#{@Hwsa0B{LF3ux+LV-S=B7-VI@=Klb=3GFQE75%8tw}|h1Z~OKLow6j! zF0$-9cSSbKhi^i3yXniKJfi8j=czL^D-3iU=>?i)>LUpByG)`31AKvW{PQbAYD-84 rEdn?!)zYbyxdfyPx%1W80eR9Fe^R?AVtFc7t4SCAVF)W9JIUugphp$H0r4mfiS*avC|gKtz2WAqg5 z&PHBgIdNu^8GO-d|NEp}D@n9(u_!v?&xjbY7De$y>e83x^%$gSS7}NDSa2F$m)wy+ zuB>2~jT8`_g3yB3b!BCwIJ_3c^^4Rh%kqNvT8KEI(UMiLktA4QE2h-Y;!9qh=h>xX zz&K6QZ*ro7fpZB#?+hE`_-46Wev%_z{b(%k2-34fBBBqprytzrkRaWy4 zJfs+s+YF>oLtV;=mM4Mh`V~BAvM?(FCs;>7_K-&@>vj8PaytvcRaN(@9CZ%i zfjgs35$iA(DAKdX7?ZY|u3_4XWNKcaImS;KF%i_x3WXK?y|40#I&k;I{tJ5Dh%Tcu z7FcbO=F}2&Ei;D4zb!2c1l}%Icd5#PyA|tUEBVAbX_<1WxMPFcb3hr zsP%f+$am_7+Z@-1jC`Hgy_-5K=kpwPF}KK0)_sE`nDD{Vnh}^9Y6Oh=IDrtVM}jd@(D*g3F)?LFN;l!wvXl= zd~0mDhv8tv*OGU!p! YzvuAEZ2qlZNB{r;07*qoM6N<$g5yvKS^xk5 literal 0 HcmV?d00001 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_revert.png b/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_revert.png new file mode 100755 index 0000000000000000000000000000000000000000..993ba3c21be88bf44ff4222996dea913ec2fcd18 GIT binary patch literal 512 zcmV+b0{{JqP)Px$x=BPqR5%f(Q$0%qK@gqfq7Xs^k)*f?F=@02DDHY1Oe0o;V0Dd_LJEI?rD!V( zq7tpFZ1ehPSV)?n7e5{lkK*c0uUiZ@jWVva+A;JTM{p$C&0P3EreixKU@d_dk7f9S;jR5 zV+v;zz`tRd1p{+$_`M7hpAVKC2M$qSCy^Knmr6y=G)pX*OoVZF3&1(!oS%N=cmhaj zbx#w+Saz;ftF20)VHj_CwG)7W8N{tIrs;Ce6NpAf4gdly5KuV9NF;J8K{A?V{sAl5 z#7c7XPIA4ksO$P5WBipKors+Z7@M2se0JqGN^~8>m8oN%0D!$9gpH5X|L9aeeMV}E z%IhWJVp1-rdj&EH5}Va(eZ7}}i)p$XAd`S)S#4Dvtz-L+RW*LyXjso*2{D$Q!0TS& z(`5^V+dIN^1Sn}Vo+`1J8pjqLscP&clbOG-R4O*@QQ5&@C`)8C+c|n-m)2=`R_=ZR zbWP&q@VjGWcl}!{e-a=9nZ&m3McJyKekS*TzlV28HKtif9xTiN0000h literal 0 HcmV?d00001 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_revert@2x.png b/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_revert@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..5f26df54c089c8ed1dc901ba9febdc7e478de6f5 GIT binary patch literal 971 zcmV;+12p`JP)Px&g-Jv~R9Fe^R?kaRK^&iXyH?t>ALt=FNFd}TBY3+StklcYONYYx2MmIc0+Hy_ zp;Lz>s7qcvc#o32X6Z&=bay)x2nDs^!3u;dx2)WK)93qkp3b~|tE)aDsDZaL^PSIp zzMuWRH{ba(_OG`{Pykw6TRR#W8ZIOfiS+F3Y#|5}mMt1Y}5W9UWc09pY{w73q zG3GGzS_A$t40uFmp}=liR(v8FHLg!jPiHh>z=Q|bm}SLW7n~bcLD~cd{R-|UguQ_M zC8F`E7yxk)>n#vwqpy-!ip-E{?(R<}lX+DCnh^mjZpvp@X9SV! zk!zE+wPtrvBq|c1IB+0lIGs*kR&0SoIOp+r{0^cqKmbJWemb4H;s+akg9K-T?64Ui zJY8l@GsB@srBc_>kJ17J^&v8r2EwGwDcET<_N&`4geK5&xWm|vCw`K0a}t5?;v!>< zCxEHX=bb_H+8+pf1?330YDfO)N969({z$}VR`Z1R54Y-IqkTf`8v$m8aE`;ysrWx4 zAd`9e1+U|I(Xl`>TWgvC+qR>YWqap$4He2ryplAHDxD@Em-_~lxp^F)V=5?&F-|4j z7jzmZYpym;02Ys8r3&v!`%+iYAq?nbs5F`YEV?Rz(NwA%wmMcgKd2m<04&VO#TFG5 z&X`klsd+x!iBA9@Co9gZO&5!c2;qmg@On=csfs>4TAu)COfFQ>t>%HY+ex-|iD29;=m#FP=2mU49K zogyLFJc>)Cx6;?K?Sh1ywzs$MUtaz}6|pM<{Q`=STXeBdZYPYtg;tVz#1sjn=X(fe zA8cNjv0kTGpe$)_&n)KZA4_; tlr2;E9D;;I=8U0cd{d6&zx}U^z;9PYWN{fEZVvze002ovPDHLkV1i86vVZ^p literal 0 HcmV?d00001 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_save_disabled.png b/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/icon_save_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..3e164a0ebfa62379c3d4392bba542b157f48a353 GIT binary patch literal 467 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 IM6N<$f_N2tQvd(} literal 0 HcmV?d00001 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/vcs_list.png b/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/vcs_list.png new file mode 100644 index 0000000000000000000000000000000000000000..df6cd02de67c069a372e1342661652a8c9673956 GIT binary patch literal 286 zcmV+(0pb3MP)Px#*hxe|R5%f(Qtc7KAPfbsW9Sq_ox!??Lv;|H!IMs*dte_nxfn|2PW~kCgFph# z)mI3VMEwH7RuiKAlf`0dL9jDNy_E%U8wM$*E$1A;iNSmSVu2$#4}em-0)!YJJ2tjO zqGPX}Aso&b6VYk4zg2N6AzkS5Iu}Fr4ogR9uJhjYnm~DQd`un`14MK+Sq42gtt0){&T49(8_T?t=RJO_5M$2~~aNTjdU#-}JWy~$+B~QMA7BFG^`?QXH9-_QN k{;t1ffX|1*w%FhJ4RGa2%S^h7EC2ui07*qoM6N<$f~l)@dH?_b literal 0 HcmV?d00001 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/vcs_save.png b/designer-base/src/main/java/com/fr/design/mainframe/vcs/images/vcs_save.png new file mode 100644 index 0000000000000000000000000000000000000000..6783204cf8800adc44c61a2db6df8439de8cf429 GIT binary patch literal 453 zcmV;$0XqJPP)Px$e@R3^R5%fJQ$0_^Kn%4@Bo?N2Mgq0JgS0C!@<*stB#`<+14~o&k1&^&hTlN| ziMgFvkVp?dC%&R2J*n~e`T3pCz7olrP2U{rhiRo7pbdO^QmJWuUo^#oY5%%7~2oyi27v8Dar~+{7MR0W3>i3T~HC%=8Dt^Cz z*48JTE_!4F)-Myla4|plEd3jd+AZS(tMu`I5Clnv(FLJ$+_%w4g-uXN5FB(3$G)g8 zF${K}Kqx1z`gf-Z67j jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + jt.stopEditing(); + MutilTempalteTabPane.getInstance().setIsCloseCurrent(true); + MutilTempalteTabPane.getInstance().closeFormat(jt); + MutilTempalteTabPane.getInstance().closeSpecifiedTemplate(jt); + //再打开cache中的模板 + DesignerContext.getDesignerFrame().openTemplate(new VcsCacheFileNodeFileProxy(new FileNode(fileOfVersion, false))); + + } + + double height = editor.getPreferredSize().getHeight(); + if (table.getRowHeight(row) != height) { + table.setRowHeight(row, (int) height); + } + return editor; + } + + @Override + public Object getCellEditorValue() { + return renderAndEditor.getFileVersion(); + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellRender.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellRender.java new file mode 100644 index 0000000000..78e75bdf55 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellRender.java @@ -0,0 +1,43 @@ +package com.fr.design.mainframe.vcs.ui; + +import com.fr.report.entity.VcsEntity; + +import javax.swing.JPanel; +import javax.swing.JTable; +import javax.swing.table.TableCellRenderer; +import java.awt.Component; + +import static com.fr.design.constants.UIConstants.TREE_BACKGROUND; +import static com.fr.workspace.server.vcs.common.Constants.TABLE_SELECT_BACKGROUND; + + +public class FileVersionCellRender implements TableCellRenderer { + + //第一行 + private final JPanel firstRowPanel; + //其余行 + private final FileVersionRowPanel render; + + public FileVersionCellRender(FileVersionFirstRowPanel firstRowPanel, FileVersionRowPanel render) { + this.render = render; + this.firstRowPanel = firstRowPanel; + } + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + Component editor = row == 0 ? firstRowPanel : render; + // https://stackoverflow.com/questions/3054775/jtable-strange-behavior-from-getaccessiblechild-method-resulting-in-null-point + if (value != null) { + render.update((VcsEntity) value); + } + editor.setBackground(isSelected ? TABLE_SELECT_BACKGROUND : TREE_BACKGROUND); + + double height = editor.getPreferredSize().getHeight(); + if (table.getRowHeight(row) != height) { + table.setRowHeight(row, (int) height); + } + return editor; + } + + +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionDialog.java new file mode 100644 index 0000000000..e674f3ced0 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionDialog.java @@ -0,0 +1,77 @@ +package com.fr.design.mainframe.vcs.ui; + +import com.fr.design.dialog.UIDialog; +import com.fr.design.editor.editor.DateEditor; +import com.fr.design.gui.date.UIDatePicker; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; + +import javax.swing.AbstractAction; +import javax.swing.Box; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.Window; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Date; + +import static com.fr.workspace.server.vcs.common.Constants.EMPTY_BORDER; +import static com.fr.workspace.server.vcs.common.Constants.EMPTY_BORDER_BOTTOM; + + +public class FileVersionDialog extends UIDialog { + private UIButton okBtn = new UIButton("确定"); + private UIButton cancelBtn = new UIButton("取消"); + + + public FileVersionDialog(Frame frame) { + super(frame); + setUndecorated(true); + JPanel panel = new JPanel(new BorderLayout()); + Box box0 = Box.createHorizontalBox(); + box0.setBorder(EMPTY_BORDER_BOTTOM); + box0.add(new UILabel("生成日期")); + box0.add(Box.createHorizontalGlue()); + box0.add(new DateEditor(new Date(), true, "生成日期", UIDatePicker.STYLE_CN_DATE1)); + Box box1 = Box.createHorizontalBox(); + box1.setBorder(EMPTY_BORDER_BOTTOM); + box1.add(new UILabel("备注关键词 ")); + box1.add(new UITextField()); + Box box2 = Box.createHorizontalBox(); + box2.add(Box.createHorizontalGlue()); + box2.setBorder(EMPTY_BORDER); + box2.add(okBtn); + box2.add(cancelBtn); + okBtn.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + FileVersionDialog.this.setVisible(false); + } + }); + cancelBtn.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + FileVersionDialog.this.setVisible(false); + } + }); + panel.add(box0, BorderLayout.NORTH); + panel.add(box1, BorderLayout.CENTER); + panel.add(box2, BorderLayout.SOUTH); + add(panel); + setSize(new Dimension(220, 100)); + centerWindow(this); + } + + private void centerWindow(Window window) { + window.setLocation(0, 95); + + } + + @Override + public void checkValid() throws Exception { + + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionFirstRowPanel.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionFirstRowPanel.java new file mode 100644 index 0000000000..8200f14275 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionFirstRowPanel.java @@ -0,0 +1,20 @@ +package com.fr.design.mainframe.vcs.ui; + +import com.fr.design.gui.ilable.UILabel; + +import javax.swing.Box; +import javax.swing.JPanel; +import javax.swing.border.EmptyBorder; +import java.awt.BorderLayout; + + +public class FileVersionFirstRowPanel extends JPanel { + + public FileVersionFirstRowPanel() { + super(new BorderLayout()); + Box upPane = Box.createVerticalBox(); + upPane.setBorder(new EmptyBorder(5, 10, 5, 10)); + upPane.add(new UILabel("本地用户")); + add(upPane, BorderLayout.CENTER); + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionRowPanel.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionRowPanel.java new file mode 100644 index 0000000000..712dcf4b10 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionRowPanel.java @@ -0,0 +1,148 @@ +package com.fr.design.mainframe.vcs.ui; + +import com.fr.design.gui.frpane.UITextPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.toolbar.VcsConfig; +import com.fr.log.FineLoggerFactory; +import com.fr.report.entity.VcsEntity; +import com.fr.stable.StringUtils; +import com.fr.third.springframework.context.annotation.AnnotationConfigApplicationContext; +import com.fr.workspace.server.vcs.VcsOperator; +import com.fr.workspace.server.vcs.common.Constants; + +import javax.swing.Box; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import javax.swing.text.BadLocationException; +import javax.swing.text.Style; +import javax.swing.text.StyleConstants; +import javax.swing.text.StyledDocument; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.text.SimpleDateFormat; +import java.util.Date; + + +public class FileVersionRowPanel extends JPanel { + + private final VcsOperator vcs; + private VcsEntity fileVersion; + private UILabel versionLabel = new UILabel(); + private UILabel usernameLabel = new UILabel("", Constants.VCS_USER_PNG, SwingConstants.LEFT); + private UITextPane timeAndMsgLabel = new UITextPane(); + private UILabel timeLabel = new UILabel(); + + + @SuppressWarnings("unchecked") + public FileVersionRowPanel(final VcsOperator vcsOperator) { + this.vcs = vcsOperator; + setLayout(new BorderLayout()); + + // version + username + Box upPane = Box.createHorizontalBox(); + upPane.setBorder(Constants.EMPTY_BORDER); + upPane.add(versionLabel); + upPane.add(Box.createHorizontalGlue()); + + + // msg + timeAndMsgLabel.setBorder(Constants.EMPTY_BORDER); + timeAndMsgLabel.setOpaque(false); + timeAndMsgLabel.setBackground(new Color(0, 0, 0, 0)); + timeAndMsgLabel.setEditable(false); + + // confirm + delete + UIButton confirmBtn = new UIButton(Constants.VCS_REVERT); + confirmBtn.set4ToolbarButton(); + confirmBtn.setToolTipText(Toolkit.i18nText("Plugin-VCS_Version_Revert")); + confirmBtn.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent evt) { + if (JOptionPane.showConfirmDialog(null, Toolkit.i18nText("Plugin-VCS_Version_Revert_Confirm"), Toolkit.i18nText("Plugin-VCS_Version_Revert_Title"), + JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { + try { + vcs.rollbackTo(fileVersion); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(VcsConfig.class); + context.getBean(FileVersionsPanel.class).exitVcs(fileVersion.getFilename()); + } + } + }); + UIButton deleteBtn = new UIButton(Constants.VCS_DELETE_PNG); + deleteBtn.set4ToolbarButton(); + deleteBtn.setToolTipText(Toolkit.i18nText("Plugin-VCS_Version_Delete")); + deleteBtn.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent evt) { + if (JOptionPane.showConfirmDialog(null, Toolkit.i18nText("Plugin-VCS_Version_Delete_Confirm"), Toolkit.i18nText("FR-Designer_Remove"), + JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { + //TODO refactor + try { + vcs.deleteVersion(fileVersion.getFilename(), fileVersion.getVersion()); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } + FileVersionTablePanel table = (FileVersionTablePanel) (FileVersionRowPanel.this.getParent()); + table.updateModel(table.getSelectedRow() - 1); + } + } + }); + UIButton editBtn = new UIButton(Constants.VCS_EDIT_PNG); + editBtn.set4ToolbarButton(); + editBtn.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + showEditDialog(); + + } + }); + upPane.add(editBtn); + upPane.add(confirmBtn); + upPane.add(deleteBtn); + Box downPane = Box.createHorizontalBox(); + downPane.add(usernameLabel); + downPane.setBorder(Constants.EMPTY_BORDER_BOTTOM); + downPane.add(Box.createHorizontalGlue()); + downPane.add(timeLabel); + add(upPane, BorderLayout.NORTH); + add(timeAndMsgLabel, BorderLayout.CENTER); + add(downPane, BorderLayout.SOUTH); + } + + private void showEditDialog() { + + } + + + public void update(final VcsEntity fileVersion) { + this.fileVersion = fileVersion; + versionLabel.setText(String.format("V.%s", fileVersion.getVersion())); + usernameLabel.setText(fileVersion.getUsername()); + timeAndMsgLabel.setText(StringUtils.EMPTY); + timeLabel.setText(timeStr(fileVersion.getTime())); + try { + StyledDocument doc = timeAndMsgLabel.getStyledDocument(); + Style style = timeAndMsgLabel.getLogicalStyle(); + StyleConstants.setForeground(style, Color.BLACK); + doc.insertString(doc.getLength(), " " + fileVersion.getCommitMsg(), style); + } catch (BadLocationException e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } + } + + private String timeStr(Date time) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return simpleDateFormat.format(time); + } + + public VcsEntity getFileVersion() { + return fileVersion; + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionTablePanel.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionTablePanel.java new file mode 100644 index 0000000000..45b52b9ba1 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionTablePanel.java @@ -0,0 +1,86 @@ +package com.fr.design.mainframe.vcs.ui; + +import com.fr.design.mainframe.DesignerFrameFileDealerPane; +import com.fr.log.FineLoggerFactory; +import com.fr.report.entity.VcsEntity; +import com.fr.workspace.server.vcs.VcsOperator; + +import javax.swing.JTable; +import javax.swing.ListSelectionModel; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; +import java.util.ArrayList; +import java.util.List; + + +public class FileVersionTablePanel extends JTable { + + private final VcsOperator vcs; + + public FileVersionTablePanel(VcsOperator vcs, TableCellEditor tableCellEditor, TableCellRenderer tableCellRenderer) { + super(new Model(new ArrayList())); + this.vcs = vcs; + setDefaultRenderer(VcsEntity.class, tableCellRenderer); + setDefaultEditor(VcsEntity.class, tableCellEditor); + setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + setTableHeader(null); + setRowHeight(30); + } + + public void updateModel(int selectedRow) { + String path = DesignerFrameFileDealerPane.getInstance().getSelectedOperation().getFilePath(); + //TODO path "/" + List vcsEntities = null; + try { + vcsEntities = vcs.getVersions(path.replaceFirst("/", "")); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } + if (selectedRow > vcsEntities.size()) { + selectedRow = vcsEntities.size(); + } + setModel(new Model(vcsEntities)); + editCellAt(selectedRow, 0); + setRowSelectionInterval(selectedRow, selectedRow); + } + + private static class Model extends AbstractTableModel { + private List vcsEntities; + + + Model(List vcsEntities) { + this.vcsEntities = vcsEntities; + } + + public Class getColumnClass(int columnIndex) { + return VcsEntity.class; + } + + public int getColumnCount() { + return 1; + } + + public int getRowCount() { + return (vcsEntities == null) ? 0 : vcsEntities.size() + 1; + } + + public Object getValueAt(int rowIndex, int columnIndex) { + if (rowIndex == 0) { + return null; + } + return (vcsEntities == null) ? null : vcsEntities.get(rowIndex - 1); + } + + public boolean isCellEditable(int columnIndex, int rowIndex) { + return true; + } + + + public List getVcsEntities() { + return vcsEntities; + } + + + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java new file mode 100644 index 0000000000..a04ac705ad --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java @@ -0,0 +1,187 @@ +package com.fr.design.mainframe.vcs.ui; + +import com.fr.base.GraphHelper; +import com.fr.design.base.mode.DesignModeContext; +import com.fr.design.dialog.BasicPane; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.file.HistoryTemplateListPane; +import com.fr.design.file.MutilTempalteTabPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.DesignerFrameFileDealerPane; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.mainframe.ToolBarNewTemplatePane; +import com.fr.design.mainframe.WestRegionContainerPane; +import com.fr.design.menu.ToolBarDef; +import com.fr.file.FileNodeFILE; +import com.fr.file.filetree.FileNode; +import com.fr.stable.StableUtils; +import com.fr.stable.project.ProjectConstants; +import com.fr.workspace.server.vcs.common.Constants; + +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.SwingConstants; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + + +public class FileVersionsPanel extends BasicPane { + private static final String ELLIPSIS = "..."; + + private final FileVersionTablePanel fileVersionsTablePane; + private UILabel titleLabel; + private String templatePath; + private UIButton filterBtn; + private FileVersionDialog versionDialog; + + + public FileVersionsPanel(FileVersionTablePanel fileVersionTablePanel) { + this.fileVersionsTablePane = fileVersionTablePanel; + initComponents(); + } + + private void initComponents() { + setLayout(new BorderLayout()); + UIToolbar toolbar = ToolBarDef.createJToolBar(); + toolbar.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0)); + toolbar.setBorderPainted(true); + Box upPane = Box.createHorizontalBox(); + UIButton backBtn = new UIButton(Constants.VCS_BACK_PNG); + backBtn.set4ToolbarButton(); + backBtn.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + exitVcs(templatePath); + } + }); + toolbar.add(backBtn); + filterBtn = new UIButton(Constants.VCS_FILTER_PNG); + filterBtn.set4ToolbarButton(); + filterBtn.setHorizontalAlignment(SwingConstants.RIGHT); + filterBtn.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + showFilterPane(); + } + }); + titleLabel = new UILabel() { + @Override + public Dimension getMaximumSize() { + return new Dimension(257, 21); + } + }; + upPane.add(titleLabel); + upPane.add(Box.createHorizontalGlue()); + upPane.add(filterBtn); + toolbar.add(Box.createHorizontalGlue()); + toolbar.add(upPane); + add(toolbar, BorderLayout.NORTH); + + UIScrollPane jScrollPane = new UIScrollPane(fileVersionsTablePane); + add(jScrollPane, BorderLayout.CENTER); + } + + private void showFilterPane() { + versionDialog = new FileVersionDialog(DesignerContext.getDesignerFrame()); + versionDialog.setVisible(true); + } + + + /** + * 退出版本管理,并且打开模板 + * + * @param path 被管理的模板的名字 + */ + public void exitVcs(String path) { + + // 关闭当前打开的版本 + JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + MutilTempalteTabPane.getInstance().setIsCloseCurrent(true); + MutilTempalteTabPane.getInstance().closeFormat(jt); + MutilTempalteTabPane.getInstance().closeSpecifiedTemplate(jt); + + udpateDesignerFrame(true); + + final String selectedFilePath = StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, path); + DesignerContext.getDesignerFrame().openTemplate(new FileNodeFILE(new FileNode(selectedFilePath, false))); + } + + private void refreshVersionTablePane() { + templatePath = DesignerFrameFileDealerPane.getInstance().getSelectedOperation().getFilePath(); + String[] paths = StableUtils.pathSplit(templatePath); + String filename = paths[paths.length - 1]; + int width = fileVersionsTablePane.getWidth() - 40; + if (getStringWidth(filename) > width) { + filename = getEllipsisName(filename, width); + } + titleLabel.setText(filename); + fileVersionsTablePane.updateModel(1); + } + + public void showFileVersionsPane() { + udpateDesignerFrame(false); + refreshVersionTablePane(); + } + + @Override + protected String title4PopupWindow() { + return null; + } + + + private void udpateDesignerFrame(boolean isExit) { + // 左上侧面板 + WestRegionContainerPane.getInstance().replaceUpPane( + isExit ? DesignerFrameFileDealerPane.getInstance() : this); + + DesignModeContext.switchTo(isExit ? com.fr.design.base.mode.DesignerMode.NORMAL : com.fr.design.base.mode.DesignerMode.VCS); + // MutilTempalteTabPane & NewTemplatePane 是否可点 + ToolBarNewTemplatePane.getInstance().setButtonGray(!isExit); + + JTemplate currentEditingTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); + if (currentEditingTemplate.isJWorkBook()) { + DesignerContext.getDesignerFrame().resetToolkitByPlus(currentEditingTemplate); + } + } + + + private int getStringWidth(String str) { + return GraphHelper.getFontMetrics(this.getFont()).stringWidth(str); + } + + + private String getEllipsisName(String name, int maxStringlength) { + + //若是名字长度大于能显示的长度,那能显示的文字的最大长度还要减去省略号的最大长度 +// int maxellipsislength = maxStringlength - ELLIPSIS.length(); + int ellipsisWidth = getStringWidth(ELLIPSIS); + int leftkeyPoint = 0; + int rightKeyPoint = name.length() - 1; + int leftStrWidth = 0; + int rightStrWidth = 0; + while (leftStrWidth + rightStrWidth + ellipsisWidth < maxStringlength) { + if (leftStrWidth <= rightStrWidth) { + leftkeyPoint++; + } else { + rightKeyPoint--; + } + leftStrWidth = getStringWidth(name.substring(0, leftkeyPoint)); + rightStrWidth = getStringWidth(name.substring(rightKeyPoint)); + + if (leftStrWidth + rightStrWidth + ellipsisWidth > maxStringlength) { + if (leftStrWidth <= rightStrWidth) { + rightKeyPoint++; + } + break; + } + } + + return name.substring(0, leftkeyPoint) + ELLIPSIS + name.substring(rightKeyPoint); + } +} diff --git a/designer-realize/src/main/java/com/fr/start/Designer.java b/designer-realize/src/main/java/com/fr/start/Designer.java index d262359dda..b66ba090ca 100644 --- a/designer-realize/src/main/java/com/fr/start/Designer.java +++ b/designer-realize/src/main/java/com/fr/start/Designer.java @@ -12,6 +12,7 @@ import com.fr.design.actions.server.ServerConfigManagerAction; import com.fr.design.actions.server.StyleListAction; import com.fr.design.actions.server.WidgetManagerAction; import com.fr.design.constants.UIConstants; +import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.MutilTempalteTabPane; import com.fr.design.fun.MenuHandler; @@ -30,6 +31,9 @@ import com.fr.design.mainframe.bbs.UserInfoLabel; import com.fr.design.mainframe.bbs.UserInfoPane; import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; +import com.fr.design.mainframe.toolbar.VcsConfig; +import com.fr.design.mainframe.vcs.proxy.VcsCacheFileNodeFileProxy; +import com.fr.design.mainframe.vcs.ui.FileVersionTablePanel; import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; @@ -49,13 +53,17 @@ import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.lifecycle.LifecycleFatalError; +import com.fr.stable.project.ProjectConstants; import com.fr.stable.xml.XMLTools; import com.fr.start.fx.SplashFx; import com.fr.start.jni.SplashMac; import com.fr.start.module.StartupArgs; import com.fr.start.preload.ImagePreLoader; import com.fr.start.server.ServerTray; +import com.fr.third.springframework.context.annotation.AnnotationConfigApplicationContext; import com.fr.workspace.WorkContext; +import com.fr.workspace.server.vcs.VcsOperator; +import com.fr.workspace.server.vcs.common.Constants; import javax.swing.JComponent; import javax.swing.JOptionPane; @@ -107,7 +115,6 @@ public class Designer extends BaseDesigner { System.exit(0); return; } - RestartHelper.deleteRecordFilesWhenStart(); preloadResource(); @@ -259,7 +266,7 @@ public class Designer extends BaseDesigner { */ @Override public UIButton[] createUp() { - return new UIButton[]{createSaveButton(), createUndoButton(), createRedoButton()}; + return new UIButton[]{createSaveButton(), createUndoButton(), createRedoButton(), }; } @@ -274,11 +281,52 @@ public class Designer extends BaseDesigner { jt.stopEditing(); jt.saveTemplate(); jt.requestFocus(); + String fileName = getEditingFilename(); + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(VcsConfig.class); + VcsOperator vcsOperator = context.getBean(VcsOperator.class); + int latestFileVersion = 0; + try { + latestFileVersion = vcsOperator.getLatestFileVersion(fileName); + + } catch (Exception e1) { + FineLoggerFactory.getLogger().error(e1.getMessage()); + } + + try { + if (jt.getEditingFILE() instanceof VcsCacheFileNodeFileProxy) { + vcsOperator.saveVersionFromCache(Constants.CURRENT_USERSNAME, fileName, StringUtils.EMPTY, latestFileVersion + 1); + context.getBean(FileVersionTablePanel.class).updateModel(1); + } else { + vcsOperator.saveVersion(Constants.CURRENT_USERSNAME, fileName, StringUtils.EMPTY, latestFileVersion + 1); + } + } catch (Exception e1) { + FineLoggerFactory.getLogger().error(e1.getMessage()); + } + + + + } }); return saveButton; } + public static String getEditingFilename() { + JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + String editingFilePath = jt.getEditingFILE().getPath(); + //TODO 如果是cache里的文件,也会走到这里,这里是找到reportlets去掉的。万一刚好cache/reportlets会出问题 + if (editingFilePath.startsWith(ProjectConstants.REPORTLETS_NAME)) { + editingFilePath = editingFilePath.replaceFirst(ProjectConstants.REPORTLETS_NAME, StringUtils.EMPTY); + } else if (editingFilePath.startsWith(Constants.VCS_CACHE_DIR)) { + editingFilePath = editingFilePath.replaceFirst(Constants.VCS_CACHE_DIR, StringUtils.EMPTY); + } + //TODO refactor 考虑直接用reportlets/xxx/x/x/x/x/x// or /xx/x/x/x/x/x + if (editingFilePath.startsWith("/")) { + editingFilePath = editingFilePath.substring(1); + } + return editingFilePath; + } + private UIButton createUndoButton() { undo = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/undo.png")); undo.setToolTipText(KeySetUtils.UNDO.getMenuKeySetName());