Browse Source

Merge pull request #905 in BA/design from ~HZZZ/design:fix-REPORT-2773-9.0 to 9.0

* commit '85b2ed5e0424c000f47ef1e8f772a37223ed20e8':
  PMD
  PMD
  PMD
  PMD
  REPORT-2773 mac中复制快捷键的修复
  PMD
  PMD
  REPORT-2773 mac中复制快捷键的修复
  REPORT-2773 mac中复制快捷键的修复
  PMD
  局部变量不行..还是改回去吧
  PMD
  PMD
  REPORT-2773 mac中复制快捷键的修复
  REPORT-2773 mac中复制快捷键的修复
  REPORT-2773 mac中复制快捷键的修复
  REPORT-2773 mac中复制快捷键的修复
  fix
  修logPane的快捷键
  REPORT-2773 mac中复制快捷键的修复
master
superman 8 years ago
parent
commit
5148082547
  1. 4
      designer/src/com/fr/design/actions/file/newReport/NewPolyReportAction.java
  2. 4
      designer/src/com/fr/design/actions/file/newReport/NewWorkBookAction.java
  3. 366
      designer/src/com/fr/design/mainframe/AuthorityToolBarPane.java
  4. 12
      designer/src/com/fr/design/mainframe/ElementCasePane.java
  5. 172
      designer/src/com/fr/design/mainframe/FormatBrushAction.java
  6. 392
      designer/src/com/fr/grid/GridKeyListener.java
  7. 1605
      designer/src/com/fr/grid/GridMouseAdapter.java
  8. 21
      designer_base/src/com/fr/common/inputevent/InputEventBaseOnOS.java
  9. 4
      designer_base/src/com/fr/design/actions/edit/CopyAction.java
  10. 4
      designer_base/src/com/fr/design/actions/edit/CutAction.java
  11. 4
      designer_base/src/com/fr/design/actions/edit/PasteAction.java
  12. 2
      designer_base/src/com/fr/design/actions/help/AboutPane.java
  13. 30
      designer_base/src/com/fr/design/gui/autocomplete/AutoCompletePopupWindow.java
  14. 2593
      designer_base/src/com/fr/design/gui/autocomplete/AutoCompletion.java
  15. 75
      designer_base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java
  16. 8
      designer_base/src/com/fr/design/gui/frpane/UIAdvancedTextPane.java
  17. 8
      designer_base/src/com/fr/design/gui/icombobox/ExtendedComboBox.java
  18. 7
      designer_base/src/com/fr/design/gui/icombobox/UIComboBoxUI.java
  19. 585
      designer_base/src/com/fr/design/gui/ilist/CheckBoxList.java
  20. 11
      designer_base/src/com/fr/design/gui/ilist/UIList.java
  21. 20
      designer_base/src/com/fr/design/gui/itable/TableSorter.java
  22. 51
      designer_base/src/com/fr/design/gui/itabpane/UITabsHeaderIconPane.java
  23. 20
      designer_base/src/com/fr/design/gui/itextarea/UITextArea.java
  24. 38
      designer_base/src/com/fr/design/gui/itextfield/UITextField.java
  25. 63
      designer_base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTree.java
  26. 3
      designer_base/src/com/fr/design/gui/itree/refreshabletree/UserObjectRefreshJTree.java
  27. 2
      designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaDefaultInputMap.java
  28. 24
      designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTADefaultInputMap.java
  29. 2
      designer_base/src/com/fr/design/locale/designer.properties
  30. 2
      designer_base/src/com/fr/design/locale/designer_en_US.properties
  31. 2
      designer_base/src/com/fr/design/locale/designer_ja_JP.properties
  32. 2
      designer_base/src/com/fr/design/locale/designer_ko_KR.properties
  33. 2
      designer_base/src/com/fr/design/locale/designer_zh_CN.properties
  34. 2
      designer_base/src/com/fr/design/locale/designer_zh_TW.properties
  35. 35
      designer_base/src/com/fr/design/mainframe/loghandler/DesignerLogHandler.java
  36. 20
      designer_base/src/com/fr/design/menu/KeySetUtils.java
  37. 3
      designer_base/src/com/fr/design/roleAuthority/UIRoleTreeUI.java
  38. 4
      designer_form/src/com/fr/design/designer/beans/actions/CopyAction.java
  39. 4
      designer_form/src/com/fr/design/designer/beans/actions/CutAction.java
  40. 4
      designer_form/src/com/fr/design/designer/beans/actions/PasteAction.java
  41. 5
      designer_form/src/com/fr/design/designer/beans/models/SelectionModel.java
  42. 4
      designer_form/src/com/fr/design/mainframe/actions/NewFormAction.java
  43. 479
      designer_form/src/com/fr/design/mainframe/widget/editors/DataTableConfigPane.java

4
designer/src/com/fr/design/actions/file/newReport/NewPolyReportAction.java

@ -11,13 +11,15 @@ import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.JPolyWorkBook; import com.fr.design.mainframe.JPolyWorkBook;
import com.fr.general.Inter; import com.fr.general.Inter;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
public class NewPolyReportAction extends UpdateAction { public class NewPolyReportAction extends UpdateAction {
public NewPolyReportAction() { public NewPolyReportAction() {
this.setName(Inter.getLocText("M-New_Multi_Report")); this.setName(Inter.getLocText("M-New_Multi_Report"));
this.setMnemonic('F'); this.setMnemonic('F');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/formExport.png")); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/formExport.png"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, KeyEvent.CTRL_MASK)); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, DEFAULT_MODIFIER));
} }
/** /**

4
designer/src/com/fr/design/actions/file/newReport/NewWorkBookAction.java

@ -12,6 +12,8 @@ import java.awt.event.ActionEvent;
import java.awt.event.InputEvent; import java.awt.event.InputEvent;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
public class NewWorkBookAction extends UpdateAction { public class NewWorkBookAction extends UpdateAction {
public NewWorkBookAction() { public NewWorkBookAction() {
@ -47,7 +49,7 @@ public class NewWorkBookAction extends UpdateAction {
@Override @Override
public KeyStroke getKeyStroke() { public KeyStroke getKeyStroke() {
return KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK); return KeyStroke.getKeyStroke(KeyEvent.VK_N, DEFAULT_MODIFIER);
} }
}; };

366
designer/src/com/fr/design/mainframe/AuthorityToolBarPane.java

File diff suppressed because one or more lines are too long

12
designer/src/com/fr/design/mainframe/ElementCasePane.java

@ -127,6 +127,8 @@ import com.fr.stable.ColumnRow;
import com.fr.stable.Constants; import com.fr.stable.Constants;
import com.fr.stable.unit.FU; import com.fr.stable.unit.FU;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
/** /**
* This class used to edit Report. * This class used to edit Report.
*/ */
@ -280,7 +282,7 @@ public abstract class ElementCasePane<T extends TemplateElementCase> extends Tar
} }
} }
}); });
formatBrush.registerKeyboardAction(keyListener, KeyStroke.getKeyStroke(KeyEvent.VK_B, InputEvent.CTRL_MASK), JComponent.WHEN_IN_FOCUSED_WINDOW); formatBrush.registerKeyboardAction(keyListener, KeyStroke.getKeyStroke(KeyEvent.VK_B, DEFAULT_MODIFIER), JComponent.WHEN_IN_FOCUSED_WINDOW);
formatBrush.registerKeyboardAction(escKey, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW); formatBrush.registerKeyboardAction(escKey, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);
} }
@ -855,7 +857,7 @@ public abstract class ElementCasePane<T extends TemplateElementCase> extends Tar
// clearReportPage old values. // clearReportPage old values.
inputMapAncestor.clear(); inputMapAncestor.clear();
actionMap.clear(); actionMap.clear();
inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK), "cut"); inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER), "cut");
actionMap.put("cut", new AbstractAction() { actionMap.put("cut", new AbstractAction() {
public void actionPerformed(ActionEvent evt) { public void actionPerformed(ActionEvent evt) {
if (cut()) { if (cut()) {
@ -863,13 +865,13 @@ public abstract class ElementCasePane<T extends TemplateElementCase> extends Tar
} }
} }
}); });
inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK), "copy"); inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER), "copy");
actionMap.put("copy", new AbstractAction() { actionMap.put("copy", new AbstractAction() {
public void actionPerformed(ActionEvent evt) { public void actionPerformed(ActionEvent evt) {
copy(); copy();
} }
}); });
inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK), "paste"); inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, DEFAULT_MODIFIER), "paste");
actionMap.put("paste", new AbstractAction() { actionMap.put("paste", new AbstractAction() {
public void actionPerformed(ActionEvent evt) { public void actionPerformed(ActionEvent evt) {
if (paste()) { if (paste()) {
@ -887,7 +889,7 @@ public abstract class ElementCasePane<T extends TemplateElementCase> extends Tar
} }
} }
}); });
inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, InputEvent.CTRL_MASK), "delete_all"); inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, DEFAULT_MODIFIER), "delete_all");
actionMap.put("delete_all", new AbstractAction() { actionMap.put("delete_all", new AbstractAction() {
public void actionPerformed(ActionEvent evt) { public void actionPerformed(ActionEvent evt) {
if (clearAll()) { if (clearAll()) {

172
designer/src/com/fr/design/mainframe/FormatBrushAction.java

File diff suppressed because one or more lines are too long

392
designer/src/com/fr/grid/GridKeyListener.java

@ -1,212 +1,208 @@
package com.fr.grid; package com.fr.grid;
import java.awt.Toolkit; import com.fr.common.inputevent.InputEventBaseOnOS;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import com.fr.design.mainframe.ElementCasePane; import com.fr.design.mainframe.ElementCasePane;
import com.fr.grid.selection.CellSelection; import com.fr.grid.selection.CellSelection;
import com.fr.grid.selection.FloatSelection; import com.fr.grid.selection.FloatSelection;
import com.fr.grid.selection.Selection; import com.fr.grid.selection.Selection;
import com.fr.report.elementcase.ElementCase; import com.fr.report.elementcase.ElementCase;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
/** /**
*
* @editor zhou * @editor zhou
* @since 2012-3-23上午10:55:36 * @since 2012-3-23上午10:55:36
*/ */
public class GridKeyListener implements KeyListener { public class GridKeyListener implements KeyListener {
private static final int DIFF = 48; // 103 - 55 = 48, 小键盘和大键盘数字的差值 48
private Grid grid; private static final int DELAY = 32;
// Keypressed last time private Grid grid;
private long keyPressedLastTime = 0; // Keypressed last time
private boolean isKeyPressedContentChanged = false; private long keyPressedLastTime = 0;
private boolean isKeyPressedContentChanged = false;
public GridKeyListener(Grid grid) {
this.grid = grid; public GridKeyListener(Grid grid) {
} this.grid = grid;
}
public void keyPressed(KeyEvent evt) {
if (!grid.isEnabled() || evt.isConsumed()) {// 如果用户在自己的KyeListener里面consume了.就不执行下面的代码了. public void keyPressed(KeyEvent evt) {
return; if (!grid.isEnabled() || evt.isConsumed()) {// 如果用户在自己的KyeListener里面consume了.就不执行下面的代码了.
} return;
KeyEvent newEvt = KeyEventWork.processKeyEvent(evt); }
if (newEvt == null) { if (KeyEventWork.processKeyEvent(evt) == null) {
return; return;
} }
long systemCurrentTime = System.currentTimeMillis(); long systemCurrentTime = System.currentTimeMillis();
int code = evt.getKeyCode(); int code = evt.getKeyCode();
boolean isNeedRepaint = false; boolean isNeedRepaint = false;
ElementCasePane reportPane = grid.getElementCasePane(); ElementCasePane reportPane = grid.getElementCasePane();
ElementCase report = reportPane.getEditingElementCase(); ElementCase report = reportPane.getEditingElementCase();
if (reportPane.getSelection() instanceof FloatSelection) { if (reportPane.getSelection() instanceof FloatSelection) {
if (systemCurrentTime - keyPressedLastTime <= 2) { if (systemCurrentTime - keyPressedLastTime <= 2) {
return; return;
} else { } else {
keyPressedLastTime = systemCurrentTime; keyPressedLastTime = systemCurrentTime;
} }
dealWithFloatSelection(reportPane, code); dealWithFloatSelection(reportPane, code);
} else {
} else { if (systemCurrentTime - keyPressedLastTime <= DELAY) {
if (systemCurrentTime - keyPressedLastTime <= 32) { return;
return; } else {
} else { keyPressedLastTime = systemCurrentTime;
keyPressedLastTime = systemCurrentTime; }
} dealWithCellSelection(evt, code);
dealWithCellSelection(evt, code); }
switch (code) {
} case KeyEvent.VK_PAGE_UP: {// page up
reportPane.getVerticalScrollBar().setValue(Math.max(0, grid.getVerticalValue() - grid.getVerticalExtent()));
switch (code) { isNeedRepaint = true;
case KeyEvent.VK_PAGE_UP: {// page up break;
reportPane.getVerticalScrollBar().setValue(Math.max(0, grid.getVerticalValue() - grid.getVerticalExtent())); }
isNeedRepaint = true; case KeyEvent.VK_PAGE_DOWN: {// page down
break; reportPane.getVerticalScrollBar().setValue(grid.getVerticalValue() + grid.getVerticalExtent());
} isNeedRepaint = true;
case KeyEvent.VK_PAGE_DOWN: {// page down break;
reportPane.getVerticalScrollBar().setValue(grid.getVerticalValue() + grid.getVerticalExtent()); }
isNeedRepaint = true; // Richie:Ctrl + A全选单元格
break; case KeyEvent.VK_A:
} if (InputEventBaseOnOS.isControlDown(evt)) {
// Richie:Ctrl + A全选单元格 reportPane.setSelection(new CellSelection(0, 0, report.getColumnCount(), report.getRowCount()));
case KeyEvent.VK_A: }
if (code == KeyEvent.VK_A && evt.isControlDown()) { isNeedRepaint = true;
reportPane.setSelection(new CellSelection(0, 0, report.getColumnCount(), report.getRowCount())); break;
isNeedRepaint = true; }
} if (isNeedRepaint) {
isNeedRepaint = true; reportPane.repaint();
break; }
} }
if (isNeedRepaint) { /**
reportPane.repaint(); * 单选中悬浮元素时只处理4个方向键
} *
} * @param reportPane
* @param code
/** */
* 单选中悬浮元素时只处理4个方向键 private void dealWithFloatSelection(ElementCasePane reportPane, int code) {
* boolean isContentChanged = false;
* @param reportPane FloatSelection floatselection = (FloatSelection) reportPane.getSelection();
* @param code
*/ switch (code) {
private void dealWithFloatSelection(ElementCasePane reportPane, int code) { case KeyEvent.VK_LEFT: {// left
boolean isContentChanged = false; floatselection.moveLeft(reportPane);
FloatSelection floatselection = (FloatSelection)reportPane.getSelection(); isContentChanged = true;
break;
switch (code) { }
case KeyEvent.VK_LEFT: {// left case KeyEvent.VK_RIGHT: {// right
floatselection.moveLeft(reportPane); floatselection.moveRight(reportPane);
isContentChanged = true; isContentChanged = true;
break; break;
} }
case KeyEvent.VK_RIGHT: {// right case KeyEvent.VK_UP: {// up
floatselection.moveRight(reportPane); floatselection.moveUp(reportPane);
isContentChanged = true; isContentChanged = true;
break; break;
} }
case KeyEvent.VK_UP: {// up case KeyEvent.VK_DOWN: {// down
floatselection.moveUp(reportPane); floatselection.moveDown(reportPane);
isContentChanged = true; isContentChanged = true;
break; break;
} }
case KeyEvent.VK_DOWN: {// down }
floatselection.moveDown(reportPane);
isContentChanged = true; if (isContentChanged) {
break; grid.getElementCasePane().repaint();
} this.isKeyPressedContentChanged = true;
} }
}
if (isContentChanged) {
grid.getElementCasePane().repaint(); private void dealWithCellSelection(KeyEvent evt, int code) {
this.isKeyPressedContentChanged = true; switch (code) {
} case KeyEvent.VK_ESCAPE: {
} if (grid.isCellEditing()) {
grid.cancelEditing();
private void dealWithCellSelection(KeyEvent evt, int code) { }
switch (code) { break;
case KeyEvent.VK_ESCAPE: { }
if (grid.isCellEditing()) { case KeyEvent.VK_F2: {
grid.cancelEditing(); if (!grid.isCellEditing()) {
} grid.startEditing();
break; }
}
case KeyEvent.VK_F2: { break;
if (!grid.isCellEditing()) { }
grid.startEditing(); }
}
// 支持小键盘
break; if (IS_NUM_PAD_KEY(code)) {
} keyTyped(evt);
} }
}
// 支持小键盘
if (IS_NUM_PAD_KEY(code)) { public void keyReleased(KeyEvent evt) {
keyTyped(evt); if (!grid.isEnabled() || evt.isConsumed()) {
} return;
} }
KeyEvent newEvt = KeyEventWork.processKeyEvent(evt);
public void keyReleased(KeyEvent evt) { if (newEvt == null) {
if (!grid.isEnabled() || evt.isConsumed()) { return;
return; }
}
KeyEvent newEvt = KeyEventWork.processKeyEvent(evt); if (this.isKeyPressedContentChanged) {
if (newEvt == null) { grid.getElementCasePane().fireTargetModified();
return;
} this.isKeyPressedContentChanged = false;
}
if (this.isKeyPressedContentChanged) { }
grid.getElementCasePane().fireTargetModified();
public void keyTyped(KeyEvent evt) {
this.isKeyPressedContentChanged = false; if (!grid.isEnabled() || evt.isConsumed()) {
} return;
} }
KeyEvent newEvt = KeyEventWork.processKeyEvent(evt);
public void keyTyped(KeyEvent evt) { if (newEvt == null || InputEventBaseOnOS.isControlDown(evt)) {// uneditable.
if (!grid.isEnabled() || evt.isConsumed()) { return;
return; }
} char ch = evt.getKeyChar();
KeyEvent newEvt = KeyEventWork.processKeyEvent(evt); if (ch == KeyEvent.VK_TAB) {// 禁止Tab键.
if (newEvt == null || evt.isControlDown()) {// uneditable. return;
return; }
} int code = evt.getKeyCode();
char ch = evt.getKeyChar(); if (Character.isDefined(ch)) {// VK_SUBTRACT小键盘的减号
if (ch == KeyEvent.VK_TAB) {// 禁止Tab键. Selection s = grid.getElementCasePane().getSelection();
return; if (s instanceof CellSelection) {
} if (!grid.getElementCasePane().isSelectedOneCell()) {
int code = evt.getKeyCode(); Toolkit.getDefaultToolkit().beep();
if (Character.isDefined(ch)) {// VK_SUBTRACT小键盘的减号 return;
Selection s = grid.getElementCasePane().getSelection(); }
if (s instanceof CellSelection) { if (!grid.isCellEditing()) {
if (!grid.getElementCasePane().isSelectedOneCell()) { grid.startEditing(true);
Toolkit.getDefaultToolkit().beep(); }
return;
} if (grid.getCellEditor() != null && grid.editorComponent != null) {
if (!grid.isCellEditing()) { if (IS_NUM_PAD_KEY(code)) {
grid.startEditing(true); KeyEvent ke = new KeyEvent(grid, KeyEvent.KEY_PRESSED, 0, 0, code - DIFF, ch);
} grid.editorComponent.dispatchEvent(ke);
ke.consume();
if (grid.getCellEditor() != null && grid.editorComponent != null) { } else {
if (IS_NUM_PAD_KEY(code)) { if (!evt.isConsumed()) {
// 103 - 55 = 48, 小键盘和大键盘数字的差值 48 grid.editorComponent.dispatchEvent(evt);
KeyEvent ke = new KeyEvent(grid, KeyEvent.KEY_PRESSED, 0, 0, code - 48, ch); }
grid.editorComponent.dispatchEvent(ke); }
ke.consume(); }
} else { }
if (!evt.isConsumed()) { }
grid.editorComponent.dispatchEvent(evt); }
}
} /**
} * 小键盘
} *
} * @param code
} * @return
/** */
* 小键盘 private static boolean IS_NUM_PAD_KEY(int code) {
* @param code return code == KeyEvent.VK_NUMPAD0 || code == KeyEvent.VK_NUMPAD1
* @return
*/
private static boolean IS_NUM_PAD_KEY(int code){
return code == KeyEvent.VK_NUMPAD0 || code == KeyEvent.VK_NUMPAD1
|| code == KeyEvent.VK_NUMPAD2 || code == KeyEvent.VK_NUMPAD2
|| code == KeyEvent.VK_NUMPAD3 || code == KeyEvent.VK_NUMPAD3
|| code == KeyEvent.VK_NUMPAD4 || code == KeyEvent.VK_NUMPAD4
@ -215,10 +211,10 @@ public class GridKeyListener implements KeyListener {
|| code == KeyEvent.VK_NUMPAD7 || code == KeyEvent.VK_NUMPAD7
|| code == KeyEvent.VK_NUMPAD8 || code == KeyEvent.VK_NUMPAD8
|| code == KeyEvent.VK_NUMPAD9 || code == KeyEvent.VK_NUMPAD9
|| code == KeyEvent.VK_MULTIPLY || code == KeyEvent.VK_MULTIPLY
|| code == KeyEvent.VK_ADD || code == KeyEvent.VK_ADD
|| code == KeyEvent.VK_SUBTRACT || code == KeyEvent.VK_SUBTRACT
|| code == KeyEvent.VK_DECIMAL || code == KeyEvent.VK_DECIMAL
|| code == KeyEvent.VK_DIVIDE; || code == KeyEvent.VK_DIVIDE;
} }
} }

1605
designer/src/com/fr/grid/GridMouseAdapter.java

File diff suppressed because it is too large Load Diff

21
designer_base/src/com/fr/common/inputevent/InputEventBaseOnOS.java

@ -0,0 +1,21 @@
package com.fr.common.inputevent;
import com.fr.stable.OperatingSystem;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
/**
* Created by hzzz on 2017/5/26.
*/
public class InputEventBaseOnOS {
private static final boolean IS_MACOS = OperatingSystem.isMacOS();
public static boolean isControlDown(MouseEvent e) {
return IS_MACOS ? e.isMetaDown() : e.isControlDown();
}
public static boolean isControlDown(KeyEvent e) {
return IS_MACOS ? e.isMetaDown() : e.isControlDown();
}
}

4
designer_base/src/com/fr/design/actions/edit/CopyAction.java

@ -11,6 +11,8 @@ import com.fr.general.Inter;
import javax.swing.*; import javax.swing.*;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
/** /**
* Copy. * Copy.
*/ */
@ -21,7 +23,7 @@ public class CopyAction extends TemplateComponentAction {
this.setName(Inter.getLocText("M_Edit-Copy")); this.setName(Inter.getLocText("M_Edit-Copy"));
this.setMnemonic('C'); this.setMnemonic('C');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png")); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_MASK)); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER));
} }
@Override @Override

4
designer_base/src/com/fr/design/actions/edit/CutAction.java

@ -12,6 +12,8 @@ import com.fr.design.actions.TemplateComponentAction;
import com.fr.design.designer.TargetComponent; import com.fr.design.designer.TargetComponent;
import com.fr.general.Inter; import com.fr.general.Inter;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
/** /**
* Cut. * Cut.
*/ */
@ -25,7 +27,7 @@ public class CutAction extends TemplateComponentAction {
this.setName(Inter.getLocText("M_Edit-Cut")); this.setName(Inter.getLocText("M_Edit-Cut"));
this.setMnemonic('T'); this.setMnemonic('T');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/cut.png")); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/cut.png"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_MASK)); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER));
} }
@Override @Override

4
designer_base/src/com/fr/design/actions/edit/PasteAction.java

@ -12,6 +12,8 @@ import com.fr.design.actions.TemplateComponentAction;
import com.fr.design.designer.TargetComponent; import com.fr.design.designer.TargetComponent;
import com.fr.general.Inter; import com.fr.general.Inter;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
/** /**
* Paste. * Paste.
*/ */
@ -25,7 +27,7 @@ public class PasteAction extends TemplateComponentAction {
this.setName(Inter.getLocText("M_Edit-Paste")); this.setName(Inter.getLocText("M_Edit-Paste"));
this.setMnemonic('P'); this.setMnemonic('P');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/paste.png")); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/paste.png"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_MASK)); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, DEFAULT_MODIFIER));
} }
@Override @Override

2
designer_base/src/com/fr/design/actions/help/AboutPane.java

@ -47,7 +47,7 @@ public class AboutPane extends JPanel {
BoxCenterAlignmentCopyablePane buildCopyPane = new BoxCenterAlignmentCopyablePane( BoxCenterAlignmentCopyablePane buildCopyPane = new BoxCenterAlignmentCopyablePane(
getBuildTitle(), getBuildTitle(),
GeneralUtils.readBuildNO(), GeneralUtils.readFullBuildNO(),
new String[]{ new String[]{
Inter.getLocText("FR-Designer-Basic_Copy_Build_NO"), Inter.getLocText("FR-Designer-Basic_Copy_Build_NO"),
Inter.getLocText("FR-Designer-Basic_Copy_Build_NO_OK") Inter.getLocText("FR-Designer-Basic_Copy_Build_NO_OK")

30
designer_base/src/com/fr/design/gui/autocomplete/AutoCompletePopupWindow.java

@ -10,6 +10,7 @@
package com.fr.design.gui.autocomplete; package com.fr.design.gui.autocomplete;
import com.fr.design.gui.syntax.ui.rsyntaxtextarea.PopupWindowDecorator; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.PopupWindowDecorator;
import com.fr.general.FRLogger;
import javax.swing.*; import javax.swing.*;
import javax.swing.event.CaretEvent; import javax.swing.event.CaretEvent;
@ -40,6 +41,7 @@ import java.util.List;
class AutoCompletePopupWindow extends JWindow implements CaretListener, class AutoCompletePopupWindow extends JWindow implements CaretListener,
ListSelectionListener, MouseListener { ListSelectionListener, MouseListener {
private final static int DIS = 5;
/** /**
* The parent AutoCompletion instance. * The parent AutoCompletion instance.
*/ */
@ -179,7 +181,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener,
} else { } else {
doAutocomplete(); doAutocomplete();
} }
} else if (AutoCompletion.getDebug()) { } else if (AutoCompletion.isDebug()) {
Thread.dumpStack(); Thread.dumpStack();
} }
} }
@ -300,8 +302,8 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener,
*/ */
private void installKeyBindings() { private void installKeyBindings() {
if (AutoCompletion.getDebug()) { if (AutoCompletion.isDebug()) {
System.out.println("PopupWindow: Installing keybindings"); FRLogger.getLogger().debug("PopupWindow: Installing keybindings");
} }
if (escapeKap == null) { // Lazily create actions. if (escapeKap == null) { // Lazily create actions.
@ -313,7 +315,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener,
ActionMap am = comp.getActionMap(); ActionMap am = comp.getActionMap();
replaceAction(im, am, KeyEvent.VK_ESCAPE, escapeKap, oldEscape); replaceAction(im, am, KeyEvent.VK_ESCAPE, escapeKap, oldEscape);
if (AutoCompletion.getDebug() && oldEscape.action == escapeKap.action) { if (AutoCompletion.isDebug() && oldEscape.action == escapeKap.action) {
Thread.dumpStack(); Thread.dumpStack();
} }
replaceAction(im, am, KeyEvent.VK_UP, upKap, oldUp); replaceAction(im, am, KeyEvent.VK_UP, upKap, oldUp);
@ -371,7 +373,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener,
*/ */
private void positionDescWindow() { private void positionDescWindow() {
boolean showDescWindow = descWindow != null && ac.getShowDescWindow(); boolean showDescWindow = descWindow != null && ac.isShowDescWindow();
if (!showDescWindow) { if (!showDescWindow) {
return; return;
} }
@ -387,14 +389,14 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener,
// Try to position to the right first (LTR) // Try to position to the right first (LTR)
int x; int x;
if (ac.getTextComponentOrientation().isLeftToRight()) { if (ac.getTextComponentOrientation().isLeftToRight()) {
x = getX() + getWidth() + 5; x = getX() + getWidth() + DIS;
if (x + descWindow.getWidth() > screenBounds.x + screenBounds.width) { // doesn't fit if (x + descWindow.getWidth() > screenBounds.x + screenBounds.width) { // doesn't fit
x = getX() - 5 - descWindow.getWidth(); x = getX() - DIS - descWindow.getWidth();
} }
} else { // RTL } else { // RTL
x = getX() - 5 - descWindow.getWidth(); x = getX() - DIS - descWindow.getWidth();
if (x < screenBounds.x) { // Doesn't fit if (x < screenBounds.x) { // Doesn't fit
x = getX() + getWidth() + 5; x = getX() + getWidth() + DIS;
} }
} }
@ -604,7 +606,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener,
Rectangle screenBounds = Util.getScreenBoundsForPoint(r.x, r.y); Rectangle screenBounds = Util.getScreenBoundsForPoint(r.x, r.y);
//Dimension screenSize = getToolkit().getScreenSize(); //Dimension screenSize = getToolkit().getScreenSize();
boolean showDescWindow = descWindow != null && ac.getShowDescWindow(); boolean showDescWindow = descWindow != null && ac.isShowDescWindow();
int totalH = getHeight(); int totalH = getHeight();
if (showDescWindow) { if (showDescWindow) {
totalH = Math.max(totalH, descWindow.getHeight()); totalH = Math.max(totalH, descWindow.getHeight());
@ -655,7 +657,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener,
installKeyBindings(); installKeyBindings();
lastLine = ac.getLineOfCaret(); lastLine = ac.getLineOfCaret();
selectFirstItem(); selectFirstItem();
if (descWindow == null && ac.getShowDescWindow()) { if (descWindow == null && ac.isShowDescWindow()) {
descWindow = createDescriptionWindow(); descWindow = createDescriptionWindow();
positionDescWindow(); positionDescWindow();
} }
@ -693,7 +695,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener,
// because of the way child JWindows' visibility is handled - in // because of the way child JWindows' visibility is handled - in
// some ways it's dependent on the parent, in other ways it's not. // some ways it's dependent on the parent, in other ways it's not.
if (descWindow != null) { if (descWindow != null) {
descWindow.setVisible(visible && ac.getShowDescWindow()); descWindow.setVisible(visible && ac.isShowDescWindow());
} }
} }
@ -708,8 +710,8 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener,
*/ */
private void uninstallKeyBindings() { private void uninstallKeyBindings() {
if (AutoCompletion.getDebug()) { if (AutoCompletion.isDebug()) {
System.out.println("PopupWindow: Removing keybindings"); FRLogger.getLogger().debug("PopupWindow: Removing keybindings");
} }
JTextComponent comp = ac.getTextComponent(); JTextComponent comp = ac.getTextComponent();

2593
designer_base/src/com/fr/design/gui/autocomplete/AutoCompletion.java

File diff suppressed because it is too large Load Diff

75
designer_base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java

@ -14,6 +14,7 @@ import com.fr.design.gui.autocomplete.ParameterizedCompletionInsertionInfo.Repla
import com.fr.design.gui.syntax.ui.rsyntaxtextarea.DocumentRange; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.DocumentRange;
import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxTextArea; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxTextArea;
import com.fr.design.gui.syntax.ui.rtextarea.ChangeableHighlightPainter; import com.fr.design.gui.syntax.ui.rtextarea.ChangeableHighlightPainter;
import com.fr.general.FRLogger;
import javax.swing.*; import javax.swing.*;
import javax.swing.event.CaretEvent; import javax.swing.event.CaretEvent;
@ -254,7 +255,7 @@ class ParameterizedCompletionContext {
* *
* @param offs The offset into the document. * @param offs The offset into the document.
* @return The text of the parameter containing the offset, or * @return The text of the parameter containing the offset, or
* <code>null</code> if the offset is not in a parameter. * <code>null</code> if the offset is not in a parameter.
*/ */
public String getArgumentText(int offs) { public String getArgumentText(int offs) {
List<Highlight> paramHighlights = getParameterHighlights(); List<Highlight> paramHighlights = getParameterHighlights();
@ -284,7 +285,7 @@ class ParameterizedCompletionContext {
* Returns the highlight of the current parameter. * Returns the highlight of the current parameter.
* *
* @return The current parameter's highlight, or <code>null</code> if * @return The current parameter's highlight, or <code>null</code> if
* the caret is not in a parameter's bounds. * the caret is not in a parameter's bounds.
* @see #getCurrentParameterStartOffset() * @see #getCurrentParameterStartOffset()
*/ */
private Highlight getCurrentParameterHighlight() { private Highlight getCurrentParameterHighlight() {
@ -332,7 +333,7 @@ class ParameterizedCompletionContext {
* Returns the starting offset of the current parameter. * Returns the starting offset of the current parameter.
* *
* @return The current parameter's starting offset, or <code>-1</code> if * @return The current parameter's starting offset, or <code>-1</code> if
* the caret is not in a parameter's bounds. * the caret is not in a parameter's bounds.
* @see #getCurrentParameterHighlight() * @see #getCurrentParameterHighlight()
*/ */
private int getCurrentParameterStartOffset() { private int getCurrentParameterStartOffset() {
@ -407,7 +408,7 @@ class ParameterizedCompletionContext {
* Inserts the choice selected in the parameter choices window. * Inserts the choice selected in the parameter choices window.
* *
* @return Whether the choice was inserted. This will be <code>false</code> * @return Whether the choice was inserted. This will be <code>false</code>
* if the window is not visible, or no choice is selected. * if the window is not visible, or no choice is selected.
*/ */
boolean insertSelectedChoice() { boolean insertSelectedChoice() {
if (paramChoicesWindow != null && paramChoicesWindow.isVisible()) { if (paramChoicesWindow != null && paramChoicesWindow.isVisible()) {
@ -438,11 +439,9 @@ class ParameterizedCompletionContext {
* @see #uninstallKeyBindings() * @see #uninstallKeyBindings()
*/ */
private void installKeyBindings() { private void installKeyBindings() {
if (AutoCompletion.isDebug()) {
if (AutoCompletion.getDebug()) { FRLogger.getLogger().debug("CompletionContext: Installing keybindings");
System.out.println("CompletionContext: Installing keybindings");
} }
JTextComponent tc = ac.getTextComponent(); JTextComponent tc = ac.getTextComponent();
InputMap im = tc.getInputMap(); InputMap im = tc.getInputMap();
ActionMap am = tc.getActionMap(); ActionMap am = tc.getActionMap();
@ -489,7 +488,6 @@ class ParameterizedCompletionContext {
im.put(ks, IM_KEY_CLOSING); im.put(ks, IM_KEY_CLOSING);
oldClosingAction = am.get(IM_KEY_CLOSING); oldClosingAction = am.get(IM_KEY_CLOSING);
am.put(IM_KEY_CLOSING, new ClosingAction()); am.put(IM_KEY_CLOSING, new ClosingAction());
} }
@ -513,12 +511,7 @@ class ParameterizedCompletionContext {
List<Highlight> highlights = getParameterHighlights(); List<Highlight> highlights = getParameterHighlights();
for (int i = 0; i < highlights.size(); i++) { for (int i = 0; i < highlights.size(); i++) {
Highlight hl = highlights.get(i); Highlight hl = highlights.get(i);
// Check "< dot", not "<= dot" as OutlineHighlightPainter paints if (needUpdate(currentNext, hl, dot)) {
// starting at one char AFTER the highlight starts, to work around
// Java issue. Thanks to Matthew Adereth!
if (currentNext == null || currentNext.getStartOffset() </*=*/dot ||
(hl.getStartOffset() > dot &&
hl.getStartOffset() <= currentNext.getStartOffset())) {
currentNext = hl; currentNext = hl;
pos = i; pos = i;
} }
@ -538,6 +531,15 @@ class ParameterizedCompletionContext {
} }
private boolean needUpdate(Highlight currentNext, Highlight hl, int dot) {
// Check "< dot", not "<= dot" as OutlineHighlightPainter paints
// starting at one char AFTER the highlight starts, to work around
// Java issue. Thanks to Matthew Adereth!
return currentNext == null || currentNext.getStartOffset() </*=*/dot ||
(hl.getStartOffset() > dot &&
hl.getStartOffset() <= currentNext.getStartOffset());
}
/** /**
* Moves to and selects the previous parameter. * Moves to and selects the previous parameter.
@ -562,10 +564,7 @@ class ParameterizedCompletionContext {
for (int i = 0; i < highlights.size(); i++) { for (int i = 0; i < highlights.size(); i++) {
Highlight h = highlights.get(i); Highlight h = highlights.get(i);
if (currentPrev == null || currentPrev.getStartOffset() >= dot || if (pos == lastSelectedParam || needUpdate(currentPrev, dot, h, selStart)) {
(h.getStartOffset() < selStart &&
(h.getStartOffset() > currentPrev.getStartOffset() ||
pos == lastSelectedParam))) {
currentPrev = h; currentPrev = h;
pos = i; pos = i;
} }
@ -593,6 +592,12 @@ class ParameterizedCompletionContext {
} }
private boolean needUpdate(Highlight currentPrev, int dot, Highlight h, int selStart) {
return currentPrev == null
|| currentPrev.getStartOffset() >= dot
|| (currentPrev.getStartOffset() < h.getStartOffset() && h.getStartOffset() < selStart);
}
private void possiblyUpdateParamCopies(Document doc) { private void possiblyUpdateParamCopies(Document doc) {
@ -616,7 +621,7 @@ class ParameterizedCompletionContext {
try { try {
replacement = doc.getText(start, len); replacement = doc.getText(start, len);
} catch (BadLocationException ble) { } catch (BadLocationException ble) {
// Never happens // Never happens
} }
// Replace any param copies tracking this parameter with the // Replace any param copies tracking this parameter with the
@ -718,7 +723,7 @@ class ParameterizedCompletionContext {
return h; return h;
} catch (BadLocationException ble) { } catch (BadLocationException ble) {
// Never happens // Never happens
} }
return null; return null;
@ -733,8 +738,8 @@ class ParameterizedCompletionContext {
*/ */
private void uninstallKeyBindings() { private void uninstallKeyBindings() {
if (AutoCompletion.getDebug()) { if (AutoCompletion.isDebug()) {
System.out.println("CompletionContext Uninstalling keybindings"); FRLogger.getLogger().debug("CompletionContext Uninstalling keybindings");
} }
JTextComponent tc = ac.getTextComponent(); JTextComponent tc = ac.getTextComponent();
@ -1037,7 +1042,6 @@ class ParameterizedCompletionContext {
* @see #uninstall() * @see #uninstall()
*/ */
public void install(JTextComponent tc) { public void install(JTextComponent tc) {
boolean replaceTabs = false; boolean replaceTabs = false;
if (tc instanceof RSyntaxTextArea) { if (tc instanceof RSyntaxTextArea) {
RSyntaxTextArea textArea = (RSyntaxTextArea) tc; RSyntaxTextArea textArea = (RSyntaxTextArea) tc;
@ -1047,14 +1051,10 @@ class ParameterizedCompletionContext {
} }
Highlighter h = tc.getHighlighter(); Highlighter h = tc.getHighlighter();
try { try {
// Insert the parameter text // Insert the parameter text
ParameterizedCompletionInsertionInfo info = ParameterizedCompletionInsertionInfo info = pc.getInsertionInfo(tc, replaceTabs);
pc.getInsertionInfo(tc, replaceTabs);
tc.replaceSelection(info.getTextToInsert()); tc.replaceSelection(info.getTextToInsert());
// Add highlights around the parameters. // Add highlights around the parameters.
final int replacementCount = info.getReplacementCount(); final int replacementCount = info.getReplacementCount();
for (int i = 0; i < replacementCount; i++) { for (int i = 0; i < replacementCount; i++) {
@ -1067,40 +1067,31 @@ class ParameterizedCompletionContext {
for (int i = 0; i < info.getReplacementCopyCount(); i++) { for (int i = 0; i < info.getReplacementCopyCount(); i++) {
ReplacementCopy rc = info.getReplacementCopy(i); ReplacementCopy rc = info.getReplacementCopy(i);
paramCopyInfos.add(new ParamCopyInfo(rc.getId(), paramCopyInfos.add(new ParamCopyInfo(rc.getId(),
(Highlight) h.addHighlight(rc.getStart(), rc.getEnd(), (Highlight) h.addHighlight(rc.getStart(), rc.getEnd(), paramCopyP)));
paramCopyP)));
} }
// Go back and start at the first parameter. // Go back and start at the first parameter.
tc.setCaretPosition(info.getSelectionStart()); tc.setCaretPosition(info.getSelectionStart());
if (info.hasSelection()) { if (info.hasSelection()) {
tc.moveCaretPosition(info.getSelectionEnd()); tc.moveCaretPosition(info.getSelectionEnd());
} }
minPos = info.getMinOffset(); minPos = info.getMinOffset();
maxPos = info.getMaxOffset(); maxPos = info.getMaxOffset();
try { try {
defaultEndOffs = tc.getDocument().createPosition( defaultEndOffs = tc.getDocument().createPosition(info.getDefaultEndOffs());
info.getDefaultEndOffs());
} catch (BadLocationException ble) { } catch (BadLocationException ble) {
// Never happens // Never happens
} }
// Listen for document events AFTER we insert // Listen for document events AFTER we insert
tc.getDocument().addDocumentListener(this); tc.getDocument().addDocumentListener(this);
} catch (BadLocationException ble) { } catch (BadLocationException ble) {
// Never happens // Never happens
} }
// Add listeners to the text component, AFTER text insertion. // Add listeners to the text component, AFTER text insertion.
tc.addCaretListener(this); tc.addCaretListener(this);
tc.addFocusListener(this); tc.addFocusListener(this);
installKeyBindings(); installKeyBindings();
} }
public void removeUpdate(DocumentEvent e) { public void removeUpdate(DocumentEvent e) {
handleDocumentEvent(e); handleDocumentEvent(e);
} }

8
designer_base/src/com/fr/design/gui/frpane/UIAdvancedTextPane.java

@ -20,6 +20,8 @@ import com.fr.design.actions.UpdateAction;
import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.KeySetUtils;
import com.fr.general.Inter; import com.fr.general.Inter;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
/** /**
* p:这是一个增强的JTextPane,支持很多Action * p:这是一个增强的JTextPane,支持很多Action
*/ */
@ -143,7 +145,7 @@ public class UIAdvancedTextPane extends UITextPane {
setName(Inter.getLocText("M_Edit-Cut")); setName(Inter.getLocText("M_Edit-Cut"));
setMnemonic('T'); setMnemonic('T');
setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/cut.png")); setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/cut.png"));
setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_MASK)); setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER));
} }
public void actionPerformed(ActionEvent evt) { public void actionPerformed(ActionEvent evt) {
@ -162,7 +164,7 @@ public class UIAdvancedTextPane extends UITextPane {
this.setName(Inter.getLocText("M_Edit-Copy")); this.setName(Inter.getLocText("M_Edit-Copy"));
this.setMnemonic('C'); this.setMnemonic('C');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png")); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_MASK)); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER));
} }
public void actionPerformed(ActionEvent evt) { public void actionPerformed(ActionEvent evt) {
@ -181,7 +183,7 @@ public class UIAdvancedTextPane extends UITextPane {
this.setName(Inter.getLocText("M_Edit-Paste")); this.setName(Inter.getLocText("M_Edit-Paste"));
this.setMnemonic('P'); this.setMnemonic('P');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/paste.png")); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/paste.png"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_MASK)); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, DEFAULT_MODIFIER));
} }
public void actionPerformed(ActionEvent evt) { public void actionPerformed(ActionEvent evt) {

8
designer_base/src/com/fr/design/gui/icombobox/ExtendedComboBox.java

@ -1,5 +1,7 @@
package com.fr.design.gui.icombobox; package com.fr.design.gui.icombobox;
import com.fr.common.inputevent.InputEventBaseOnOS;
import java.awt.Component; import java.awt.Component;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Point; import java.awt.Point;
@ -17,6 +19,8 @@ import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicComboPopup; import javax.swing.plaf.basic.BasicComboPopup;
import javax.swing.plaf.basic.ComboPopup; import javax.swing.plaf.basic.ComboPopup;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
public class ExtendedComboBox extends UIComboBox { public class ExtendedComboBox extends UIComboBox {
private static final int VALUE120 = 120; private static final int VALUE120 = 120;
@ -74,12 +78,12 @@ public class ExtendedComboBox extends UIComboBox {
protected JList createList() { protected JList createList() {
return new JList(comboBox.getModel()) { return new JList(comboBox.getModel()) {
public void processMouseEvent(MouseEvent e) { public void processMouseEvent(MouseEvent e) {
if (e.isControlDown()) { if (InputEventBaseOnOS.isControlDown(e)) {
// Fix for 4234053. Filter out the Control // Fix for 4234053. Filter out the Control
// Key from the list. // Key from the list.
// ie., don't allow CTRL key deselection. // ie., don't allow CTRL key deselection.
e = new MouseEvent((Component) e.getSource(), e.getID(), e.getWhen(), e.getModifiers() e = new MouseEvent((Component) e.getSource(), e.getID(), e.getWhen(), e.getModifiers()
^ InputEvent.CTRL_MASK, e.getX(), e.getY(), e.getClickCount(), e.isPopupTrigger()); ^ DEFAULT_MODIFIER, e.getX(), e.getY(), e.getClickCount(), e.isPopupTrigger());
} }
super.processMouseEvent(e); super.processMouseEvent(e);
} }

7
designer_base/src/com/fr/design/gui/icombobox/UIComboBoxUI.java

@ -16,6 +16,7 @@ import javax.swing.plaf.basic.BasicComboBoxUI;
import javax.swing.plaf.basic.BasicComboPopup; import javax.swing.plaf.basic.BasicComboPopup;
import javax.swing.plaf.basic.ComboPopup; import javax.swing.plaf.basic.ComboPopup;
import com.fr.common.inputevent.InputEventBaseOnOS;
import com.fr.design.constants.UIConstants; import com.fr.design.constants.UIConstants;
import sun.swing.DefaultLookup; import sun.swing.DefaultLookup;
@ -24,6 +25,8 @@ import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.stable.Constants; import com.fr.stable.Constants;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
/** /**
* @author zhou F * @author zhou F
* @since 2012-5-9下午4:33:07 * @since 2012-5-9下午4:33:07
@ -207,8 +210,8 @@ public class UIComboBoxUI extends BasicComboBoxUI implements MouseListener {
@Override @Override
public void processMouseEvent(MouseEvent e) { public void processMouseEvent(MouseEvent e) {
if (e.isControlDown()) { if (InputEventBaseOnOS.isControlDown(e)) {
e = new MouseEvent((Component) e.getSource(), e.getID(), e.getWhen(), e.getModifiers() ^ InputEvent.CTRL_MASK, e.getX(), e.getY(), e.getClickCount(), e = new MouseEvent((Component) e.getSource(), e.getID(), e.getWhen(), e.getModifiers() ^ DEFAULT_MODIFIER, e.getX(), e.getY(), e.getClickCount(),
e.isPopupTrigger()); e.isPopupTrigger());
} }
super.processMouseEvent(e); super.processMouseEvent(e);

585
designer_base/src/com/fr/design/gui/ilist/CheckBoxList.java

@ -1,311 +1,300 @@
package com.fr.design.gui.ilist; package com.fr.design.gui.ilist;
import java.awt.BorderLayout; import com.fr.design.gui.icheckbox.UICheckBox;
import java.awt.Component; import com.fr.stable.StringUtils;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import javax.swing.*;
import java.awt.event.KeyAdapter; import javax.swing.border.Border;
import java.awt.event.KeyEvent; import javax.swing.border.EmptyBorder;
import java.awt.event.MouseAdapter; import java.awt.*;
import java.awt.event.MouseEvent; import java.awt.event.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.EventListener; import java.util.EventListener;
import java.util.List; import java.util.List;
import javax.swing.JComponent;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.stable.StringUtils;
/** /**
* CheckBoxs + JList. * CheckBoxs + JList.
*/ */
public class CheckBoxList extends JComponent { public class CheckBoxList extends JComponent {
/** private final static int X_COORDINATE = 20;
* 选择状态----全选和全不选
* /**
* @editor zhou * 选择状态----全选和全不选
* @since 2012-4-1下午2:39:10 *
*/ * @editor zhou
public static enum SelectedState { * @since 2012-4-1下午2:39:10
ALL, NONE */
} public static enum SelectedState {
ALL, NONE
private boolean[] selects; }
private JList jlist;
private UICheckBox chooseAll; private boolean[] selects;
private JList jlist;
public CheckBoxList(Object[] items) { private UICheckBox chooseAll;
this(items, SelectedState.NONE, StringUtils.EMPTY);
} public CheckBoxList(Object[] items) {
this(items, SelectedState.NONE, StringUtils.EMPTY);
public CheckBoxList(Object[] items, String name) { }
this(items, SelectedState.NONE, name);
} public CheckBoxList(Object[] items, String name) {
this(items, SelectedState.NONE, name);
/** }
* Class constructor.
* /**
* @param items * Class constructor.
* Items with which to populate the list. *
* @param default_state * @param items Items with which to populate the list.
* default state, true or false * @param state default state, true or false
*/ */
public CheckBoxList(Object[] items, SelectedState state, String name) { public CheckBoxList(Object[] items, SelectedState state, String name) {
jlist = new BOXLIST(items); jlist = new BOXLIST(items);
jlist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); jlist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
this.selects = new boolean[items.length]; this.selects = new boolean[items.length];
boolean default_state = (state == SelectedState.ALL); boolean default_state = (state == SelectedState.ALL);
Arrays.fill(this.selects, default_state); Arrays.fill(this.selects, default_state);
jlist.setCellRenderer(new CheckListCellRenderer()); jlist.setCellRenderer(new CheckListCellRenderer());
jlist.addMouseListener(new MouseAdapter() { jlist.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) { public void mousePressed(MouseEvent e) {
doCheck(); doCheck();
} }
public void mouseReleased(MouseEvent e) { public void mouseReleased(MouseEvent e) {
doCheck(); doCheck();
} }
}); });
jlist.addKeyListener(new KeyAdapter() { jlist.addKeyListener(new KeyAdapter() {
@Override @Override
public void keyTyped(KeyEvent e) { public void keyTyped(KeyEvent e) {
if (e.getKeyChar() == ' ') { if (e.getKeyChar() == ' ') {
doCheck(); doCheck();
} }
} }
}); });
this.setLayout(new BorderLayout()); this.setLayout(new BorderLayout());
chooseAll = new UICheckBox(name, default_state); chooseAll = new UICheckBox(name, default_state);
chooseAll.addActionListener(new ActionListener() { chooseAll.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
if (chooseAll.isSelected()) { if (chooseAll.isSelected()) {
setSelected(true); setSelected(true);
} else { } else {
setSelected(false); setSelected(false);
} }
} }
}); });
this.add(chooseAll, BorderLayout.NORTH); this.add(chooseAll, BorderLayout.NORTH);
this.add(jlist, BorderLayout.CENTER); this.add(jlist, BorderLayout.CENTER);
} }
/* /*
* 用于CellRenderer显示value为text * 用于CellRenderer显示value为text
*/ */
protected String value2Text(Object value) { protected String value2Text(Object value) {
return value != null ? value.toString() : StringUtils.EMPTY; return value != null ? value.toString() : StringUtils.EMPTY;
} }
public void setItems(Object[] os) { public void setItems(Object[] os) {
if (os == null) { if (os == null) {
this.setSelected(false); this.setSelected(false);
} else { } else {
for (int i = 0, len = os.length; i < len; i++) { for (int i = 0, len = os.length; i < len; i++) {
Object o = os[i]; Object o = os[i];
for (int j = 0, jen = jlist.getModel().getSize(); j < jen; j++) { for (int j = 0, jen = jlist.getModel().getSize(); j < jen; j++) {
if (o.equals(jlist.getModel().getElementAt(j))) { if (o.equals(jlist.getModel().getElementAt(j))) {
this.setSelected(j, true); this.setSelected(j, true);
} }
} }
} }
} }
this.repaint(); this.repaint();
} }
/** /**
* Is selected * Is selected
*/ */
public boolean isSelected(int index) { public boolean isSelected(int index) {
if (selects == null || index >= selects.length) { if (selects == null || index >= selects.length) {
return false; return false;
} }
return selects[index]; return selects[index];
} }
public void setSelected(int index, boolean isSelected) { public void setSelected(int index, boolean isSelected) {
if (selects == null || index >= selects.length) { if (selects == null || index >= selects.length) {
return; return;
} }
selects[index] = isSelected; selects[index] = isSelected;
this.repaint(this.getBounds()); this.repaint(this.getBounds());
this.fireCheckBoxListSelectionChangeListener(); this.fireCheckBoxListSelectionChangeListener();
} }
private void setSelected(boolean isSelected) { private void setSelected(boolean isSelected) {
if (selects == null) { if (selects == null) {
return; return;
} }
for (int i = 0; i < selects.length; i++) { for (int i = 0; i < selects.length; i++) {
selects[i] = isSelected; selects[i] = isSelected;
} }
this.repaint(this.getBounds()); this.repaint(this.getBounds());
this.fireCheckBoxListSelectionChangeListener(); this.fireCheckBoxListSelectionChangeListener();
} }
/** /**
* Returns an array of the objects that have been selected. Overrides the * Returns an array of the objects that have been selected. Overrides the
* JList method. * JList method.
*/ */
public Object[] getSelectedValues() { public Object[] getSelectedValues() {
return this.jlist.getSelectedValues(); return this.jlist.getSelectedValues();
} }
private class BOXLIST extends JList { private class BOXLIST extends JList {
public BOXLIST(Object[] items) { public BOXLIST(Object[] items) {
super(items); super(items);
} }
@Override @Override
protected void processMouseEvent(MouseEvent e) { protected void processMouseEvent(MouseEvent e) {
if (e.getX() < 20) { if (e.getX() < X_COORDINATE) {
if (e.isControlDown() || e.isAltDown() || e.isShiftDown() || e.isMetaDown()) { boolean anyMaskDown = e.isControlDown() || e.isAltDown() || e.isShiftDown() || e.isMetaDown();
int[] indices = getSelectedIndices(); if (anyMaskDown) {
if (indices.length == 0) { int[] indices = getSelectedIndices();
super.processMouseEvent(e); if (indices.length == 0) {
} super.processMouseEvent(e);
} else { }
super.processMouseEvent(e); } else {
} super.processMouseEvent(e);
} else { }
super.processMouseEvent(e); } else {
} super.processMouseEvent(e);
int id = e.getID(); }
switch (id) { int id = e.getID();
case MouseEvent.MOUSE_PRESSED: switch (id) {
break; case MouseEvent.MOUSE_PRESSED:
case MouseEvent.MOUSE_RELEASED: break;
break; case MouseEvent.MOUSE_RELEASED:
case MouseEvent.MOUSE_CLICKED: break;
doCheck(); case MouseEvent.MOUSE_CLICKED:
break; doCheck();
case MouseEvent.MOUSE_EXITED: break;
break; case MouseEvent.MOUSE_EXITED:
case MouseEvent.MOUSE_ENTERED: break;
break; case MouseEvent.MOUSE_ENTERED:
} break;
} }
}
@Override
protected void processMouseMotionEvent(MouseEvent e) { @Override
if (e.getX() < 20) { protected void processMouseMotionEvent(MouseEvent e) {
return; if (e.getX() < X_COORDINATE) {
} return;
}
super.processMouseEvent(e);
} super.processMouseEvent(e);
}
@Override
public Object[] getSelectedValues() { @Override
List<Object> list = new ArrayList<Object>(selects.length); public Object[] getSelectedValues() {
for (int i = 0; i < selects.length; i++) { List<Object> list = new ArrayList<Object>(selects.length);
if (selects[i]) { for (int i = 0; i < selects.length; i++) {
list.add(this.getModel().getElementAt(i)); if (selects[i]) {
} list.add(this.getModel().getElementAt(i));
} }
}
return list.toArray();
} return list.toArray();
}
}
}
private void doCheck() {
// p:这里必须改变所有选择checkbox. private void doCheck() {
int index = jlist.getSelectedIndex(); // p:这里必须改变所有选择checkbox.
boolean sValue = !selects[index]; int index = jlist.getSelectedIndex();
boolean sValue = !selects[index];
// p:开始设置所有选择的checkbox.
int[] indices = jlist.getSelectedIndices(); // p:开始设置所有选择的checkbox.
for (int i = 0; i < indices.length; i++) { int[] indices = jlist.getSelectedIndices();
setSelected(indices[i], sValue); for (int i = 0; i < indices.length; i++) {
} setSelected(indices[i], sValue);
for (boolean selected : selects) { }
if (!selected) { for (boolean selected : selects) {
chooseAll.setSelected(false); if (!selected) {
return; chooseAll.setSelected(false);
} return;
} }
chooseAll.setSelected(true); }
repaint(); chooseAll.setSelected(true);
} repaint();
}
private static final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
private static final Border NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1);
private class CheckListCellRenderer extends UICheckBox implements ListCellRenderer {
private class CheckListCellRenderer extends UICheckBox implements ListCellRenderer {
public CheckListCellRenderer() {
this.setOpaque(true); public CheckListCellRenderer() {
this.setBorder(noFocusBorder); this.setOpaque(true);
} this.setBorder(NO_FOCUS_BORDER);
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
this.setText(value2Text(value)); public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
this.setSelected(selects[index]); this.setText(value2Text(value));
this.setFont(list.getFont()); this.setSelected(selects[index]);
this.setFont(list.getFont());
if (isSelected) {
this.setBackground(list.getSelectionBackground()); if (isSelected) {
this.setForeground(list.getSelectionForeground()); this.setBackground(list.getSelectionBackground());
} else { this.setForeground(list.getSelectionForeground());
this.setBackground(list.getBackground()); } else {
this.setForeground(list.getForeground()); this.setBackground(list.getBackground());
} this.setForeground(list.getForeground());
}
if (cellHasFocus) {
this.setBorder(UIManager.getBorder("List.focusCellHighlightBorder")); if (cellHasFocus) {
} else { this.setBorder(UIManager.getBorder("List.focusCellHighlightBorder"));
this.setBorder(noFocusBorder); } else {
} this.setBorder(NO_FOCUS_BORDER);
}
return this;
} return this;
} }
}
public void addCheckBoxListSelectionChangeListener(CheckBoxListSelectionChangeListener l) {
this.listenerList.add(CheckBoxListSelectionChangeListener.class, l); public void addCheckBoxListSelectionChangeListener(CheckBoxListSelectionChangeListener l) {
} this.listenerList.add(CheckBoxListSelectionChangeListener.class, l);
}
public void removeCheckBoxListSelectionChangeListener(CheckBoxListSelectionChangeListener l) {
this.listenerList.remove(CheckBoxListSelectionChangeListener.class, l); public void removeCheckBoxListSelectionChangeListener(CheckBoxListSelectionChangeListener l) {
} this.listenerList.remove(CheckBoxListSelectionChangeListener.class, l);
}
public void fireCheckBoxListSelectionChangeListener() {
// Guaranteed to return a non-null array public void fireCheckBoxListSelectionChangeListener() {
Object[] listeners = listenerList.getListenerList(); // Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event // Process the listeners last to first, notifying
for (int i = listeners.length - 2; i >= 0; i -= 2) { // those that are interested in this event
if (listeners[i] == CheckBoxListSelectionChangeListener.class) { for (int i = listeners.length - 2; i >= 0; i -= 2) {
((CheckBoxListSelectionChangeListener)listeners[i + 1]).selectionChanged(this); if (listeners[i] == CheckBoxListSelectionChangeListener.class) {
} ((CheckBoxListSelectionChangeListener) listeners[i + 1]).selectionChanged(this);
} }
}
}
}
public static interface CheckBoxListSelectionChangeListener extends EventListener {
public void selectionChanged(CheckBoxList target); public static interface CheckBoxListSelectionChangeListener extends EventListener {
} public void selectionChanged(CheckBoxList target);
}
public ListModel getModel() {
return jlist.getModel(); public ListModel getModel() {
} return jlist.getModel();
}
} }

11
designer_base/src/com/fr/design/gui/ilist/UIList.java

@ -17,7 +17,7 @@ import java.util.Vector;
* Time: 上午11:07 * Time: 上午11:07
* To change this template use File | Settings | File Templates. * To change this template use File | Settings | File Templates.
*/ */
public class UIList extends JList{ public class UIList extends JList {
private Icon icon; private Icon icon;
public UIList() { public UIList() {
@ -46,12 +46,12 @@ public class UIList extends JList{
if (rendererComp.getPreferredSize().width > getVisibleRect().width) { if (rendererComp.getPreferredSize().width > getVisibleRect().width) {
String tips = (rendererComp instanceof JComponent) ? ((JComponent) rendererComp).getToolTipText() : null; String tips = (rendererComp instanceof JComponent) ? ((JComponent) rendererComp).getToolTipText() : null;
if (tips == null) { if (tips == null) {
if(value instanceof JTemplate){ if (value instanceof JTemplate) {
tips = ((JTemplate) value).getEditingFILE().getName(); tips = ((JTemplate) value).getEditingFILE().getName();
icon = ((JTemplate) value).getEditingFILE().getIcon(); icon = ((JTemplate) value).getEditingFILE().getIcon();
} else if (value instanceof ListModelElement || value instanceof TableProcedure){ } else if (value instanceof ListModelElement || value instanceof TableProcedure) {
tips = ((JLabel)rendererComp).getText(); tips = ((JLabel) rendererComp).getText();
icon = ((JLabel)rendererComp).getIcon(); icon = ((JLabel) rendererComp).getIcon();
} }
} }
return tips; return tips;
@ -71,6 +71,7 @@ public class UIList extends JList{
} }
return null; return null;
} }
public JToolTip createToolTip() { public JToolTip createToolTip() {
UIToolTip tip = new UIToolTip(icon); UIToolTip tip = new UIToolTip(icon);
tip.setComponent(this); tip.setComponent(this);

20
designer_base/src/com/fr/design/gui/itable/TableSorter.java

@ -15,6 +15,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import javax.swing.Icon; import javax.swing.Icon;
import com.fr.common.inputevent.InputEventBaseOnOS;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
import javax.swing.JTable; import javax.swing.JTable;
import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelEvent;
@ -79,7 +81,7 @@ import javax.swing.table.TableModel;
public class TableSorter extends AbstractTableModel { public class TableSorter extends AbstractTableModel {
protected TableModel tableModel; protected TableModel tableModel;
private static final int ADD = 4;
public static final int DESCENDING = -1; public static final int DESCENDING = -1;
public static final int NOT_SORTED = 0; public static final int NOT_SORTED = 0;
public static final int ASCENDING = 1; public static final int ASCENDING = 1;
@ -341,17 +343,14 @@ public class TableSorter extends AbstractTableModel {
fireTableChanged(e); fireTableChanged(e);
return; return;
} }
// If the table structure has changed, cancel the sorting; the
// If the table structure has changed, cancel the sorting; the // sorting columns may have been either moved or deleted from the model.
// sorting columns may have been either moved or deleted from
// the model.
if (e.getFirstRow() == TableModelEvent.HEADER_ROW) { if (e.getFirstRow() == TableModelEvent.HEADER_ROW) {
cancelSorting(); cancelSorting();
fireTableChanged(e); fireTableChanged(e);
return; return;
} }
// We can map a cell event through to the view without widening
// We can map a cell event through to the view without widening
// when the following conditions apply: // when the following conditions apply:
// //
// a) all the changes are on one row (e.getFirstRow() == e.getLastRow()) and, // a) all the changes are on one row (e.getFirstRow() == e.getLastRow()) and,
@ -380,8 +379,7 @@ public class TableSorter extends AbstractTableModel {
column, e.getType())); column, e.getType()));
return; return;
} }
// Something has happened to the data that may have invalidated the row order.
// Something has happened to the data that may have invalidated the row order.
clearSortingState(); clearSortingState();
fireTableDataChanged(); fireTableDataChanged();
return; return;
@ -396,13 +394,13 @@ public class TableSorter extends AbstractTableModel {
int column = columnModel.getColumn(viewColumn).getModelIndex(); int column = columnModel.getColumn(viewColumn).getModelIndex();
if (column != -1) { if (column != -1) {
int status = getSortingStatus(column); int status = getSortingStatus(column);
if (!e.isControlDown()) { if (!InputEventBaseOnOS.isControlDown(e)) {
cancelSorting(); cancelSorting();
} }
// Cycle the sorting states through {NOT_SORTED, ASCENDING, DESCENDING} or // Cycle the sorting states through {NOT_SORTED, ASCENDING, DESCENDING} or
// {NOT_SORTED, DESCENDING, ASCENDING} depending on whether shift is pressed. // {NOT_SORTED, DESCENDING, ASCENDING} depending on whether shift is pressed.
status = status + (e.isShiftDown() ? -1 : 1); status = status + (e.isShiftDown() ? -1 : 1);
status = (status + 4) % 3 - 1; // signed mod, returning {-1, 0, 1} status = (status + ADD) % 3 - 1; // signed mod, returning {-1, 0, 1}
setSortingStatus(column, status); setSortingStatus(column, status);
} }
} }

51
designer_base/src/com/fr/design/gui/itabpane/UITabsHeaderIconPane.java

@ -1,36 +1,23 @@
package com.fr.design.gui.itabpane; package com.fr.design.gui.itabpane;
import java.awt.BorderLayout; import com.fr.base.BaseUtils;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.InputMap;
import javax.swing.JComponent;
import com.fr.design.constants.UIConstants; import com.fr.design.constants.UIConstants;
import com.fr.design.gui.core.UITabComponent;
import com.fr.design.gui.ibutton.UITabButton;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
import javax.swing.JPanel; import com.fr.stable.StringUtils;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants; import javax.swing.*;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.fr.base.BaseUtils; import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
import com.fr.design.gui.core.UITabComponent;
import com.fr.design.gui.ibutton.UITabButton;
import com.fr.stable.StringUtils;
/** /**
* 本来想弄个延迟加载的发现在单元格属性表那边没有意义就算了.这个面板是纯粹的没有与模板的任何交互操作(比如说populate() update()) * 本来想弄个延迟加载的发现在单元格属性表那边没有意义就算了.这个面板是纯粹的没有与模板的任何交互操作(比如说populate() update())
@ -40,6 +27,7 @@ import com.fr.stable.StringUtils;
*/ */
public class UITabsHeaderIconPane extends JPanel implements UITabComponent { public class UITabsHeaderIconPane extends JPanel implements UITabComponent {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final int DIS = 30;
private UILabel nameLabel; private UILabel nameLabel;
@ -125,7 +113,7 @@ public class UITabsHeaderIconPane extends JPanel implements UITabComponent {
inputMapAncestor.clear(); inputMapAncestor.clear();
actionMap.clear(); actionMap.clear();
inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, KeyEvent.CTRL_MASK), "switch"); inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, DEFAULT_MODIFIER), "switch");
actionMap.put("switch", new AbstractAction() { actionMap.put("switch", new AbstractAction() {
/** /**
@ -143,9 +131,7 @@ public class UITabsHeaderIconPane extends JPanel implements UITabComponent {
private void show(final JPanel panel) { private void show(final JPanel panel) {
int count = centerPane.getComponentCount();// 获取centerPanel中控件数 int count = centerPane.getComponentCount();// 获取centerPanel中控件数
List<Component> list = new ArrayList<Component>();// List<Component> list = new ArrayList<Component>();//
for (Component comp : centerPane.getComponents()) { list.addAll(Arrays.asList(centerPane.getComponents()));
list.add(comp);
}
if (count > 0) {// 如果centerPanel中控件数大于0就执行效果 if (count > 0) {// 如果centerPanel中控件数大于0就执行效果
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
Component comp = centerPane.getComponent(i);// 获得该位置的控件 Component comp = centerPane.getComponent(i);// 获得该位置的控件
@ -159,11 +145,11 @@ public class UITabsHeaderIconPane extends JPanel implements UITabComponent {
int height = centerPane.getHeight(); int height = centerPane.getHeight();
int width = centerPane.getWidth(); int width = centerPane.getWidth();
int y = -height; int y = -height;
for (int i = 0; i <= height; i += 30) { for (int i = 0; i <= height; i += DIS) {
// 设置面板位置 // 设置面板位置
currentPanel.setBounds(0, i, width, height); currentPanel.setBounds(0, i, width, height);
panel.setBounds(0, y, width, height); panel.setBounds(0, y, width, height);
y += 30; y += DIS;
try { try {
Thread.sleep(3); Thread.sleep(3);
} catch (InterruptedException e) { } catch (InterruptedException e) {
@ -173,7 +159,6 @@ public class UITabsHeaderIconPane extends JPanel implements UITabComponent {
centerPane.remove(currentPanel);// 移除当前面板 centerPane.remove(currentPanel);// 移除当前面板
} }
panel.setBounds(0, 0, width, height); panel.setBounds(0, 0, width, height);
} }
}.start(); }.start();
break; break;

20
designer_base/src/com/fr/design/gui/itextarea/UITextArea.java

@ -7,13 +7,33 @@ import com.fr.design.utils.gui.GUICoreUtils;
import javax.swing.*; import javax.swing.*;
import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener; import javax.swing.event.DocumentListener;
import javax.swing.text.DefaultEditorKit;
import java.awt.*; import java.awt.*;
import java.awt.event.KeyEvent;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
public class UITextArea extends JTextArea implements UIObserver { public class UITextArea extends JTextArea implements UIObserver {
private UIObserverListener uiObserverListener; private UIObserverListener uiObserverListener;
public UITextArea(int i, int j) { public UITextArea(int i, int j) {
super(i, j); super(i, j);
InputMap inputMap = this.getInputMap();
while (inputMap.getParent() != null) {
inputMap = inputMap.getParent();
}
if (inputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_A, DEFAULT_MODIFIER)) == null) {
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, DEFAULT_MODIFIER), DefaultEditorKit.selectAllAction);
}
if (inputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER)) == null) {
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER), DefaultEditorKit.copyAction);
}
if (inputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_V, DEFAULT_MODIFIER)) == null) {
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, DEFAULT_MODIFIER), DefaultEditorKit.pasteAction);
}
if (inputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER)) == null) {
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER), DefaultEditorKit.cutAction);
}
initComponents(); initComponents();
} }

38
designer_base/src/com/fr/design/gui/itextfield/UITextField.java

@ -1,20 +1,21 @@
package com.fr.design.gui.itextfield; package com.fr.design.gui.itextfield;
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import com.fr.design.event.GlobalNameListener; import com.fr.design.event.GlobalNameListener;
import com.fr.design.event.GlobalNameObserver; import com.fr.design.event.GlobalNameObserver;
import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserver;
import com.fr.design.event.UIObserverListener; import com.fr.design.event.UIObserverListener;
import com.fr.stable.Constants;
import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.stable.Constants;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.DefaultEditorKit;
import javax.swing.text.Document;
import java.awt.*;
import java.awt.event.KeyEvent;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
/** /**
* @author Jerry * @author Jerry
@ -30,6 +31,22 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs
public UITextField() { public UITextField() {
super(); super();
InputMap inputMap = this.getInputMap();
while (inputMap.getParent() != null) {
inputMap = inputMap.getParent();
}
if (inputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_A, DEFAULT_MODIFIER)) == null) {
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, DEFAULT_MODIFIER), DefaultEditorKit.selectAllAction);
}
if (inputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER)) == null) {
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER), DefaultEditorKit.copyAction);
}
if (inputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_V, DEFAULT_MODIFIER)) == null) {
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, DEFAULT_MODIFIER), DefaultEditorKit.pasteAction);
}
if (inputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER)) == null) {
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER), DefaultEditorKit.cutAction);
}
initListener(); initListener();
} }
@ -186,6 +203,7 @@ public class UITextField extends JTextField implements UIObserver, GlobalNameObs
/** /**
* 主函数 * 主函数
*
* @param args 参数 * @param args 参数
*/ */
public static void main(String... args) { public static void main(String... args) {

63
designer_base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTree.java

@ -5,8 +5,14 @@
*/ */
package com.fr.design.gui.itree.checkboxtree; package com.fr.design.gui.itree.checkboxtree;
import java.awt.Component; import com.fr.design.gui.icheckbox.UICheckBox;
import java.awt.Rectangle;
import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.text.Position;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.awt.event.KeyListener; import java.awt.event.KeyListener;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
@ -16,19 +22,6 @@ import java.beans.PropertyChangeListener;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Vector; import java.util.Vector;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.text.Position;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import com.fr.design.gui.icheckbox.UICheckBox;
/** /**
* CheckBoxTree is a special JTree which uses UICheckBox as the tree renderer. * CheckBoxTree is a special JTree which uses UICheckBox as the tree renderer.
* In addition to regular JTree's features, it also allows you select any number * In addition to regular JTree's features, it also allows you select any number
@ -37,11 +30,11 @@ import com.fr.design.gui.icheckbox.UICheckBox;
* select one or several tree nodes and press SPACE key to toggle the * select one or several tree nodes and press SPACE key to toggle the
* check box selection for all selected tree nodes. * check box selection for all selected tree nodes.
* <p/> * <p/>
* In order to retrieve which tree paths are selected, you need to call * In order to retrieve which tree paths are selected, you need to call
* {@link #getCheckBoxTreeSelectionModel()}. * {@link #getCheckBoxTreeSelectionModel()}.
* It will return the selection model that keeps track of which tree * It will return the selection model that keeps track of which tree
* paths have been checked. For example * paths have been checked. For example
* {@link CheckBoxTreeSelectionModel#getSelectionPaths()} * {@link CheckBoxTreeSelectionModel#getSelectionPaths()}
* will give the list of paths which have * will give the list of paths which have
* been checked. * been checked.
*/ */
@ -111,7 +104,7 @@ public class CheckBoxTree extends JTree {
addPropertyChangeListener(JTree.SELECTION_MODEL_PROPERTY, _modelChangeListener); addPropertyChangeListener(JTree.SELECTION_MODEL_PROPERTY, _modelChangeListener);
updateRowMapper(); updateRowMapper();
} }
/** /**
* Inserts the mouse listener at the particular index in the listeners' chain. * Inserts the mouse listener at the particular index in the listeners' chain.
* *
@ -122,7 +115,7 @@ public class CheckBoxTree extends JTree {
private void insertMouseListener(Component component, MouseListener l, int index) { private void insertMouseListener(Component component, MouseListener l, int index) {
MouseListener[] listeners = component.getMouseListeners(); MouseListener[] listeners = component.getMouseListeners();
for (int i = 0, length = listeners.length; i < length; i++) { for (int i = 0, length = listeners.length; i < length; i++) {
component.removeMouseListener(listeners[i]); component.removeMouseListener(listeners[i]);
} }
// for (MouseListener listener : listeners) { // for (MouseListener listener : listeners) {
// component.removeMouseListener(listener); // component.removeMouseListener(listener);
@ -168,7 +161,7 @@ public class CheckBoxTree extends JTree {
* Gets the cell renderer with check box. * Gets the cell renderer with check box.
* *
* @return CheckBoxTree's own cell renderer which has the check box. The actual cell renderer * @return CheckBoxTree's own cell renderer which has the check box. The actual cell renderer
* you set by setCellRenderer() can be accessed by using {@link #getActualCellRenderer()}. * you set by setCellRenderer() can be accessed by using {@link #getActualCellRenderer()}.
*/ */
public TreeCellRenderer getCellRenderer() { public TreeCellRenderer getCellRenderer() {
TreeCellRenderer cellRenderer = super.getCellRenderer(); TreeCellRenderer cellRenderer = super.getCellRenderer();
@ -177,8 +170,7 @@ public class CheckBoxTree extends JTree {
} }
if (_treeCellRenderer == null) { if (_treeCellRenderer == null) {
_treeCellRenderer = createCellRenderer(cellRenderer); _treeCellRenderer = createCellRenderer(cellRenderer);
} } else {
else {
_treeCellRenderer.setActualTreeRenderer(cellRenderer); _treeCellRenderer.setActualTreeRenderer(cellRenderer);
} }
return _treeCellRenderer; return _treeCellRenderer;
@ -194,8 +186,7 @@ public class CheckBoxTree extends JTree {
public TreeCellRenderer getActualCellRenderer() { public TreeCellRenderer getActualCellRenderer() {
if (_treeCellRenderer != null) { if (_treeCellRenderer != null) {
return _treeCellRenderer.getActualTreeRenderer(); return _treeCellRenderer.getActualTreeRenderer();
} } else {
else {
return super.getCellRenderer(); return super.getCellRenderer();
} }
} }
@ -245,13 +236,13 @@ public class CheckBoxTree extends JTree {
} }
TreePath path = _tree.getPathForLocation(e.getX(), e.getY()); TreePath path = _tree.getPathForLocation(e.getX(), e.getY());
if (path == null) if (path == null) {
return null; return null;
}
if (clicksInCheckBox(e, path)) { if (clicksInCheckBox(e, path)) {
return path; return path;
} } else {
else {
return null; return null;
} }
} }
@ -259,13 +250,11 @@ public class CheckBoxTree extends JTree {
protected boolean clicksInCheckBox(MouseEvent e, TreePath path) { protected boolean clicksInCheckBox(MouseEvent e, TreePath path) {
if (!_tree.isCheckBoxVisible(path)) { if (!_tree.isCheckBoxVisible(path)) {
return false; return false;
} } else {
else {
Rectangle bounds = _tree.getPathBounds(path); Rectangle bounds = _tree.getPathBounds(path);
if (_tree.getComponentOrientation().isLeftToRight()) { if (_tree.getComponentOrientation().isLeftToRight()) {
return e.getX() < bounds.x + _hotspot; return e.getX() < bounds.x + _hotspot;
} } else {
else {
return e.getX() > bounds.x + bounds.width - _hotspot; return e.getX() > bounds.x + bounds.width - _hotspot;
} }
} }
@ -320,8 +309,9 @@ public class CheckBoxTree extends JTree {
return; return;
} }
if (e.getModifiers() == 0 && e.getKeyChar() == KeyEvent.VK_SPACE) if (e.getModifiers() == 0 && e.getKeyChar() == KeyEvent.VK_SPACE) {
toggleSelections(); toggleSelections();
}
} }
public void keyTyped(KeyEvent e) { public void keyTyped(KeyEvent e) {
@ -349,8 +339,7 @@ public class CheckBoxTree extends JTree {
selectionModel.removeSelectionPath(path); selectionModel.removeSelectionPath(path);
else else
selectionModel.addSelectionPath(path); selectionModel.addSelectionPath(path);
} } finally {
finally {
if (!selectionModel.isSingleEventMode()) { if (!selectionModel.isSingleEventMode()) {
selectionModel.setBatchMode(false); selectionModel.setBatchMode(false);
} }
@ -365,8 +354,8 @@ public class CheckBoxTree extends JTree {
return; return;
} }
for (int i = 0, length = treePaths.length; i < length; i++) { for (int i = 0, length = treePaths.length; i < length; i++) {
TreePath tmpTreePath = treePaths[i]; TreePath tmpTreePath = treePaths[i];
toggleSelection(tmpTreePath); toggleSelection(tmpTreePath);
} }
// for (TreePath treePath : treePaths) { // for (TreePath treePath : treePaths) {
// toggleSelection(treePath); // toggleSelection(treePath);

3
designer_base/src/com/fr/design/gui/itree/refreshabletree/UserObjectRefreshJTree.java

@ -1,5 +1,6 @@
package com.fr.design.gui.itree.refreshabletree; package com.fr.design.gui.itree.refreshabletree;
import com.fr.common.inputevent.InputEventBaseOnOS;
import com.fr.general.NameObject; import com.fr.general.NameObject;
import com.fr.design.gui.itree.refreshabletree.loader.ChildrenLoaderFactory; import com.fr.design.gui.itree.refreshabletree.loader.ChildrenLoaderFactory;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
@ -147,7 +148,7 @@ public abstract class UserObjectRefreshJTree<T extends UserObjectOP<?>> extends
} }
} }
// marks:鼠标在上次选中的paths上,则将上次的paths设为的树的路径,否则将鼠标所在的节点设为选中的节点 // marks:鼠标在上次选中的paths上,则将上次的paths设为的树的路径,否则将鼠标所在的节点设为选中的节点
if (!(e.isShiftDown() || e.isControlDown())) { if (!(e.isShiftDown() || InputEventBaseOnOS.isControlDown(e))) {
if (isFind) { if (isFind) {
setSelectionPaths(oldPaths); setSelectionPaths(oldPaths);
} else { } else {

2
designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaDefaultInputMap.java

@ -34,7 +34,7 @@ public class RSyntaxTextAreaDefaultInputMap extends RTADefaultInputMap {
*/ */
public RSyntaxTextAreaDefaultInputMap() { public RSyntaxTextAreaDefaultInputMap() {
int defaultMod = getDefaultModifier(); int defaultMod = DEFAULT_MODIFIER;
//int ctrl = InputEvent.CTRL_MASK; //int ctrl = InputEvent.CTRL_MASK;
int shift = InputEvent.SHIFT_MASK; int shift = InputEvent.SHIFT_MASK;
//int alt = InputEvent.ALT_MASK; //int alt = InputEvent.ALT_MASK;

24
designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTADefaultInputMap.java

@ -41,6 +41,14 @@ import javax.swing.text.DefaultEditorKit;
public class RTADefaultInputMap extends InputMap { public class RTADefaultInputMap extends InputMap {
/**
* Returns the default modifier key for a system. For example, on Windows
* this would be the CTRL key (<code>InputEvent.CTRL_MASK</code>).
*
* @return The default modifier key.
*/
public static final int DEFAULT_MODIFIER = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
/** /**
* Constructs the default input map for an <code>RTextArea</code>. * Constructs the default input map for an <code>RTextArea</code>.
*/ */
@ -48,7 +56,7 @@ public class RTADefaultInputMap extends InputMap {
super(); super();
int defaultModifier = getDefaultModifier(); int defaultModifier = DEFAULT_MODIFIER;
//int ctrl = InputEvent.CTRL_MASK; //int ctrl = InputEvent.CTRL_MASK;
int alt = InputEvent.ALT_MASK; int alt = InputEvent.ALT_MASK;
int shift = InputEvent.SHIFT_MASK; int shift = InputEvent.SHIFT_MASK;
@ -134,18 +142,4 @@ public class RTADefaultInputMap extends InputMap {
*/ */
} }
/**
* Returns the default modifier key for a system. For example, on Windows
* this would be the CTRL key (<code>InputEvent.CTRL_MASK</code>).
*
* @return The default modifier key.
*/
protected static final int getDefaultModifier() {
return Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
}
} }

2
designer_base/src/com/fr/design/locale/designer.properties

@ -1137,7 +1137,7 @@ FRFont-bold=bold
FR-Designer_Set_Submit_Condition= FR-Designer_Set_Submit_Condition=
Form-Change_Widget_Name=Change Widget Name Form-Change_Widget_Name=Change Widget Name
ReportColumns-Report_Columns=Report Columns ReportColumns-Report_Columns=Report Columns
Can_not_use_FormatBursh= FR-Designer_Can_not_use_FormatBursh=
CellElement-Property_Table=CellElement Property Table CellElement-Property_Table=CellElement Property Table
Dictionary-Dynamic_SQL=Dynamic SQL Dictionary-Dynamic_SQL=Dynamic SQL
FR-Designer_Form-CheckBoxGroup=CheckBoxGroup FR-Designer_Form-CheckBoxGroup=CheckBoxGroup

2
designer_base/src/com/fr/design/locale/designer_en_US.properties

@ -1138,7 +1138,7 @@ FRFont-bold=Bold
FR-Designer_Set_Submit_Condition=Submit Condition FR-Designer_Set_Submit_Condition=Submit Condition
Form-Change_Widget_Name=Change Control Name Form-Change_Widget_Name=Change Control Name
ReportColumns-Report_Columns=Multi-columns/lines display ReportColumns-Report_Columns=Multi-columns/lines display
Can_not_use_FormatBursh=Can't use format painter in multiple selections FR-Designer_Can_not_use_FormatBursh=Can't use format painter in multiple selections
CellElement-Property_Table=Cell Attribute Table CellElement-Property_Table=Cell Attribute Table
Dictionary-Dynamic_SQL=Dynamic SQL Dictionary-Dynamic_SQL=Dynamic SQL
FR-Designer_Form-CheckBoxGroup=CheckBoxGroup FR-Designer_Form-CheckBoxGroup=CheckBoxGroup

2
designer_base/src/com/fr/design/locale/designer_ja_JP.properties

@ -1133,7 +1133,7 @@ FRFont-bold=\u592A\u5B57
FR-Designer_Set_Submit_Condition=\u63D0\u51FA\u6761\u4EF6\u3092\u8A2D\u5B9A FR-Designer_Set_Submit_Condition=\u63D0\u51FA\u6761\u4EF6\u3092\u8A2D\u5B9A
Form-Change_Widget_Name=\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u540D\u5909\u66F4 Form-Change_Widget_Name=\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u540D\u5909\u66F4
ReportColumns-Report_Columns=\u5E33\u7968\u30B3\u30E9\u30E0 ReportColumns-Report_Columns=\u5E33\u7968\u30B3\u30E9\u30E0
Can_not_use_FormatBursh=\u8907\u6570\u9078\u629E\u3057\u305F\u30A8\u30EA\u30A2\u3067\u306F\u66F8\u5F0F\u30D6\u30E9\u30B7\u3092\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\! FR-Designer_Can_not_use_FormatBursh=\u8907\u6570\u9078\u629E\u3057\u305F\u30A8\u30EA\u30A2\u3067\u306F\u66F8\u5F0F\u30D6\u30E9\u30B7\u3092\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\!
CellElement-Property_Table=\u30BB\u30EB\u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u00B7\u30B7\u30FC\u30C8 CellElement-Property_Table=\u30BB\u30EB\u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u00B7\u30B7\u30FC\u30C8
Dictionary-Dynamic_SQL=\u52D5\u614BSQL Dictionary-Dynamic_SQL=\u52D5\u614BSQL
FR-Designer_Form-CheckBoxGroup=\u30D5\u30EC\u30FC\u30E0\u30BB\u30C3\u30C8\u3092\u8907\u6570\u9078\u629E FR-Designer_Form-CheckBoxGroup=\u30D5\u30EC\u30FC\u30E0\u30BB\u30C3\u30C8\u3092\u8907\u6570\u9078\u629E

2
designer_base/src/com/fr/design/locale/designer_ko_KR.properties

@ -1134,7 +1134,7 @@ FRFont-bold=\uAD75\uAC8C
FR-Designer_Set_Submit_Condition=\uC81C\uCD9C\uC870\uAC74\uC124\uC815 FR-Designer_Set_Submit_Condition=\uC81C\uCD9C\uC870\uAC74\uC124\uC815
Form-Change_Widget_Name=\uC18C\uD504\uD2B8\uC6E8\uC5B4\uC81C\uC5B4\uC774\uB984\uBCC0\uACBD Form-Change_Widget_Name=\uC18C\uD504\uD2B8\uC6E8\uC5B4\uC81C\uC5B4\uC774\uB984\uBCC0\uACBD
ReportColumns-Report_Columns=\uBB38\uC11C\uC140\uB098\uB204\uAE30 ReportColumns-Report_Columns=\uBB38\uC11C\uC140\uB098\uB204\uAE30
Can_not_use_FormatBursh=\uC911\uBCF5\uC120\uD0DD\uB41C\uC601\uC5ED\uC5D0\uC11C\uC2DD\uC744\uC774\uC6A9\uD558\uC5EC\uC778\uC1C4\uD560\uC218\uC5C6\uC2B5\uB2C8\uB2E4.\! FR-Designer_Can_not_use_FormatBursh=\uC911\uBCF5\uC120\uD0DD\uB41C\uC601\uC5ED\uC5D0\uC11C\uC2DD\uC744\uC774\uC6A9\uD558\uC5EC\uC778\uC1C4\uD560\uC218\uC5C6\uC2B5\uB2C8\uB2E4.\!
CellElement-Property_Table=\uC140\uC18D\uC131\uD45C CellElement-Property_Table=\uC140\uC18D\uC131\uD45C
Dictionary-Dynamic_SQL=\uB3D9\uC801 SQL Dictionary-Dynamic_SQL=\uB3D9\uC801 SQL
FR-Designer_Form-CheckBoxGroup=\uCCB4\uD06C\uBC15\uC2A4\uADF8\uB8F9 FR-Designer_Form-CheckBoxGroup=\uCCB4\uD06C\uBC15\uC2A4\uADF8\uB8F9

2
designer_base/src/com/fr/design/locale/designer_zh_CN.properties

@ -1133,7 +1133,7 @@ FRFont-bold=\u52A0\u7C97
FR-Designer_Set_Submit_Condition=\u8BBE\u7F6E\u63D0\u4EA4\u6761\u4EF6 FR-Designer_Set_Submit_Condition=\u8BBE\u7F6E\u63D0\u4EA4\u6761\u4EF6
Form-Change_Widget_Name=\u66F4\u6539\u63A7\u4EF6\u540D Form-Change_Widget_Name=\u66F4\u6539\u63A7\u4EF6\u540D
ReportColumns-Report_Columns=\u62A5\u8868\u5206\u680F ReportColumns-Report_Columns=\u62A5\u8868\u5206\u680F
Can_not_use_FormatBursh=\u4E0D\u80FD\u5BF9\u591A\u91CD\u9009\u5B9A\u533A\u57DF\u4F7F\u7528\u683C\u5F0F\u5237\! FR-Designer_Can_not_use_FormatBursh=\u4E0D\u80FD\u5BF9\u591A\u91CD\u9009\u5B9A\u533A\u57DF\u4F7F\u7528\u683C\u5F0F\u5237\!
CellElement-Property_Table=\u5355\u5143\u683C\u5C5E\u6027\u8868 CellElement-Property_Table=\u5355\u5143\u683C\u5C5E\u6027\u8868
Dictionary-Dynamic_SQL=\u52A8\u6001SQL Dictionary-Dynamic_SQL=\u52A8\u6001SQL
FR-Designer_Form-CheckBoxGroup=\u590D\u9009\u6846\u7EC4 FR-Designer_Form-CheckBoxGroup=\u590D\u9009\u6846\u7EC4

2
designer_base/src/com/fr/design/locale/designer_zh_TW.properties

@ -1133,7 +1133,7 @@ FRFont-bold=\u7C97\u9AD4
FR-Designer_Set_Submit_Condition=\u8A2D\u5B9A\u63D0\u4EA4\u689D\u4EF6 FR-Designer_Set_Submit_Condition=\u8A2D\u5B9A\u63D0\u4EA4\u689D\u4EF6
Form-Change_Widget_Name=\u66F4\u6539\u63A7\u5236\u9805\u540D Form-Change_Widget_Name=\u66F4\u6539\u63A7\u5236\u9805\u540D
ReportColumns-Report_Columns=\u5831\u8868\u5206\u6B04 ReportColumns-Report_Columns=\u5831\u8868\u5206\u6B04
Can_not_use_FormatBursh=\u7121\u6CD5\u4F7F\u7528\u8907\u88FD\u683C\u5F0F FR-Designer_Can_not_use_FormatBursh=\u7121\u6CD5\u4F7F\u7528\u8907\u88FD\u683C\u5F0F
CellElement-Property_Table=\u5132\u5B58\u683C\u5C6C\u6027\u8868 CellElement-Property_Table=\u5132\u5B58\u683C\u5C6C\u6027\u8868
Dictionary-Dynamic_SQL=\u52D5\u614BSQL Dictionary-Dynamic_SQL=\u52D5\u614BSQL
FR-Designer_Form-CheckBoxGroup=\u5FA9\u9078\u6846\u7D44 FR-Designer_Form-CheckBoxGroup=\u5FA9\u9078\u6846\u7D44

35
designer_base/src/com/fr/design/mainframe/loghandler/DesignerLogHandler.java

@ -13,10 +13,7 @@ import com.fr.general.LogRecordTime;
import com.fr.stable.xml.LogRecordTimeProvider; import com.fr.stable.xml.LogRecordTimeProvider;
import javax.swing.*; import javax.swing.*;
import javax.swing.text.BadLocationException; import javax.swing.text.*;
import javax.swing.text.Document;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import java.awt.*; import java.awt.*;
import java.awt.event.*; import java.awt.event.*;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -24,6 +21,8 @@ import java.util.Date;
import java.util.logging.Handler; import java.util.logging.Handler;
import java.util.logging.LogRecord; import java.util.logging.LogRecord;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
public class DesignerLogHandler { public class DesignerLogHandler {
protected static final int INFO_INT = FRLogLevel.INFO.intValue(); protected static final int INFO_INT = FRLogLevel.INFO.intValue();
protected static final int ERRO_INT = FRLogLevel.ERROR.intValue(); protected static final int ERRO_INT = FRLogLevel.ERROR.intValue();
@ -132,8 +131,7 @@ public class DesignerLogHandler {
private UIMenuItem clear; private UIMenuItem clear;
private LogHandlerArea() { private LogHandlerArea() {
jTextArea = new JTextPane(); jTextArea = initLogJTextArea();
this.setLayout(FRGUIPaneFactory.createBorderLayout()); this.setLayout(FRGUIPaneFactory.createBorderLayout());
UIScrollPane js = new UIScrollPane(jTextArea); UIScrollPane js = new UIScrollPane(jTextArea);
this.add(js, BorderLayout.CENTER); this.add(js, BorderLayout.CENTER);
@ -158,9 +156,9 @@ public class DesignerLogHandler {
clear.setIcon(BaseUtils.readIcon("/com/fr/design/images/log/clear.png")); clear.setIcon(BaseUtils.readIcon("/com/fr/design/images/log/clear.png"));
popup.add(clear); popup.add(clear);
selectAll.setAccelerator(KeyStroke.getKeyStroke('A', InputEvent.CTRL_MASK)); selectAll.setAccelerator(KeyStroke.getKeyStroke('A', DEFAULT_MODIFIER));
copy.setAccelerator(KeyStroke.getKeyStroke('C', InputEvent.CTRL_MASK)); copy.setAccelerator(KeyStroke.getKeyStroke('C', DEFAULT_MODIFIER));
clear.setAccelerator(KeyStroke.getKeyStroke('L', InputEvent.CTRL_MASK)); clear.setAccelerator(KeyStroke.getKeyStroke('L', DEFAULT_MODIFIER));
jTextArea.addMouseListener(new MouseAdapter() { jTextArea.addMouseListener(new MouseAdapter() {
// check for right click // check for right click
@ -188,6 +186,23 @@ public class DesignerLogHandler {
}); });
} }
private JTextPane initLogJTextArea() {
JTextPane resultPane = new JTextPane();
InputMap inputMap = resultPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER), DefaultEditorKit.copyAction);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, DEFAULT_MODIFIER), DefaultEditorKit.selectAllAction);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_L, DEFAULT_MODIFIER), "clear");
ActionMap actionMap = resultPane.getActionMap();
actionMap.put("clear", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
resultPane.setText("");
caption.clearMessage();
DesignerLogImpl.getInstance().clear();
}
});
return resultPane;
}
public void printStackTrace(LogRecordTimeProvider logRecordTime) { public void printStackTrace(LogRecordTimeProvider logRecordTime) {
LogRecord logRecord = logRecordTime.getLogRecord(); LogRecord logRecord = logRecordTime.getLogRecord();
Date date = logRecordTime.getDate(); Date date = logRecordTime.getDate();
@ -297,6 +312,4 @@ public class DesignerLogHandler {
}; };
} }
} }

20
designer_base/src/com/fr/design/menu/KeySetUtils.java

@ -12,6 +12,8 @@ import javax.swing.*;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.util.Locale; import java.util.Locale;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
/** /**
* Created by IntelliJ IDEA. * Created by IntelliJ IDEA.
* Author : daisy * Author : daisy
@ -36,7 +38,7 @@ public class KeySetUtils {
@Override @Override
public KeyStroke getKeyStroke() { public KeyStroke getKeyStroke() {
return KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_MASK); return KeyStroke.getKeyStroke(KeyEvent.VK_O, DEFAULT_MODIFIER);
} }
}; };
@ -71,7 +73,7 @@ public class KeySetUtils {
@Override @Override
public KeyStroke getKeyStroke() { public KeyStroke getKeyStroke() {
return KeyStroke.getKeyStroke(KeyEvent.VK_W, KeyEvent.CTRL_MASK); return KeyStroke.getKeyStroke(KeyEvent.VK_W, DEFAULT_MODIFIER);
} }
}; };
@ -88,7 +90,7 @@ public class KeySetUtils {
@Override @Override
public KeyStroke getKeyStroke() { public KeyStroke getKeyStroke() {
return KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK); return KeyStroke.getKeyStroke(KeyEvent.VK_S, DEFAULT_MODIFIER);
} }
}; };
@ -122,7 +124,7 @@ public class KeySetUtils {
@Override @Override
public KeyStroke getKeyStroke() { public KeyStroke getKeyStroke() {
return KeyStroke.getKeyStroke(KeyEvent.VK_Z, KeyEvent.CTRL_MASK); return KeyStroke.getKeyStroke(KeyEvent.VK_Z, DEFAULT_MODIFIER);
} }
}; };
@ -139,7 +141,7 @@ public class KeySetUtils {
@Override @Override
public KeyStroke getKeyStroke() { public KeyStroke getKeyStroke() {
return KeyStroke.getKeyStroke(KeyEvent.VK_Y, KeyEvent.CTRL_MASK); return KeyStroke.getKeyStroke(KeyEvent.VK_Y, DEFAULT_MODIFIER);
} }
}; };
@ -156,7 +158,7 @@ public class KeySetUtils {
@Override @Override
public KeyStroke getKeyStroke() { public KeyStroke getKeyStroke() {
return KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.CTRL_MASK); return KeyStroke.getKeyStroke(KeyEvent.VK_E, DEFAULT_MODIFIER);
} }
}; };
@ -353,7 +355,7 @@ public class KeySetUtils {
@Override @Override
public KeyStroke getKeyStroke() { public KeyStroke getKeyStroke() {
return KeyStroke.getKeyStroke(KeyEvent.VK_M, KeyEvent.CTRL_MASK); return KeyStroke.getKeyStroke(KeyEvent.VK_M, DEFAULT_MODIFIER);
} }
}; };
@ -370,7 +372,7 @@ public class KeySetUtils {
@Override @Override
public KeyStroke getKeyStroke() { public KeyStroke getKeyStroke() {
return KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.CTRL_MASK); return KeyStroke.getKeyStroke(KeyEvent.VK_E, DEFAULT_MODIFIER);
} }
}; };
@ -387,7 +389,7 @@ public class KeySetUtils {
@Override @Override
public KeyStroke getKeyStroke() { public KeyStroke getKeyStroke() {
return KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.CTRL_MASK); return KeyStroke.getKeyStroke(KeyEvent.VK_E, DEFAULT_MODIFIER);
} }
}; };

3
designer_base/src/com/fr/design/roleAuthority/UIRoleTreeUI.java

@ -1,5 +1,6 @@
package com.fr.design.roleAuthority; package com.fr.design.roleAuthority;
import com.fr.common.inputevent.InputEventBaseOnOS;
import com.fr.design.gui.itree.UITreeUI; import com.fr.design.gui.itree.UITreeUI;
import javax.swing.tree.TreePath; import javax.swing.tree.TreePath;
@ -15,7 +16,7 @@ import java.awt.event.MouseEvent;
public class UIRoleTreeUI extends UITreeUI { public class UIRoleTreeUI extends UITreeUI {
protected void selectPathForEvent(TreePath path, MouseEvent event) { /* Adjust from the anchor point. */ protected void selectPathForEvent(TreePath path, MouseEvent event) { /* Adjust from the anchor point. */
if (event.isControlDown() && tree.isPathSelected(path)) { if (InputEventBaseOnOS.isControlDown(event) && tree.isPathSelected(path)) {
tree.removeSelectionPath(path); tree.removeSelectionPath(path);
} else if (event.isShiftDown()) { } else if (event.isShiftDown()) {
tree.setAnchorSelectionPath(null); tree.setAnchorSelectionPath(null);

4
designer_form/src/com/fr/design/designer/beans/actions/CopyAction.java

@ -8,6 +8,8 @@ import javax.swing.*;
import java.awt.event.InputEvent; import java.awt.event.InputEvent;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
public class CopyAction extends FormEditAction { public class CopyAction extends FormEditAction {
public CopyAction(FormDesigner t) { public CopyAction(FormDesigner t) {
@ -15,7 +17,7 @@ public class CopyAction extends FormEditAction {
this.setName(Inter.getLocText("M_Edit-Copy")); this.setName(Inter.getLocText("M_Edit-Copy"));
this.setMnemonic('C'); this.setMnemonic('C');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png")); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK)); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER));
} }
@Override @Override

4
designer_form/src/com/fr/design/designer/beans/actions/CutAction.java

@ -9,6 +9,8 @@ import com.fr.base.BaseUtils;
import com.fr.general.Inter; import com.fr.general.Inter;
import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormDesigner;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
public class CutAction extends FormEditAction { public class CutAction extends FormEditAction {
public CutAction(FormDesigner t) { public CutAction(FormDesigner t) {
@ -16,7 +18,7 @@ public class CutAction extends FormEditAction {
this.setName(Inter.getLocText("M_Edit-Cut")); this.setName(Inter.getLocText("M_Edit-Cut"));
this.setMnemonic('T'); this.setMnemonic('T');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/cut.png")); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/cut.png"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK)); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER));
} }
@Override @Override

4
designer_form/src/com/fr/design/designer/beans/actions/PasteAction.java

@ -9,6 +9,8 @@ import com.fr.base.BaseUtils;
import com.fr.general.Inter; import com.fr.general.Inter;
import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormDesigner;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
public class PasteAction extends FormEditAction { public class PasteAction extends FormEditAction {
public PasteAction(FormDesigner t) { public PasteAction(FormDesigner t) {
@ -16,7 +18,7 @@ public class PasteAction extends FormEditAction {
this.setName(Inter.getLocText("M_Edit-Paste")); this.setName(Inter.getLocText("M_Edit-Paste"));
this.setMnemonic('P'); this.setMnemonic('P');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/paste.png")); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/paste.png"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK)); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, DEFAULT_MODIFIER));
} }
@Override @Override

5
designer_form/src/com/fr/design/designer/beans/models/SelectionModel.java

@ -1,5 +1,6 @@
package com.fr.design.designer.beans.models; package com.fr.design.designer.beans.models;
import com.fr.common.inputevent.InputEventBaseOnOS;
import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.LayoutAdapter; import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.beans.events.DesignerEvent;
@ -61,7 +62,7 @@ public class SelectionModel {
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void selectACreatorAtMouseEvent(MouseEvent e) { public void selectACreatorAtMouseEvent(MouseEvent e) {
if (!e.isControlDown() && !e.isShiftDown()) { if (!InputEventBaseOnOS.isControlDown(e) && !e.isShiftDown()) {
// 如果Ctrl或者Shift键盘没有按下,则清除已经选择的组件 // 如果Ctrl或者Shift键盘没有按下,则清除已经选择的组件
selection.reset(); selection.reset();
} }
@ -372,7 +373,7 @@ public class SelectionModel {
public Direction getDirectionAt(MouseEvent e) { public Direction getDirectionAt(MouseEvent e) {
Direction dir; Direction dir;
if (e.isControlDown() || e.isShiftDown()) { if (InputEventBaseOnOS.isControlDown(e) || e.isShiftDown()) {
XCreator creator = designer.getComponentAt(e.getX(), e.getY(), selection.getSelectedCreators()); XCreator creator = designer.getComponentAt(e.getX(), e.getY(), selection.getSelectedCreators());
if (creator != designer.getRootComponent() && selection.addedable(creator)) { if (creator != designer.getRootComponent() && selection.addedable(creator)) {
return Location.add; return Location.add;

4
designer_form/src/com/fr/design/mainframe/actions/NewFormAction.java

@ -14,6 +14,8 @@ import java.awt.event.ActionEvent;
import java.awt.event.InputEvent; import java.awt.event.InputEvent;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
public class NewFormAction extends UpdateAction { public class NewFormAction extends UpdateAction {
public NewFormAction() { public NewFormAction() {
@ -48,7 +50,7 @@ public class NewFormAction extends UpdateAction {
@Override @Override
public KeyStroke getKeyStroke() { public KeyStroke getKeyStroke() {
return KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK); return KeyStroke.getKeyStroke(KeyEvent.VK_F, DEFAULT_MODIFIER);
} }
}; };
} }

479
designer_form/src/com/fr/design/mainframe/widget/editors/DataTableConfigPane.java

@ -21,250 +21,255 @@ import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.ArrayList; import java.util.ArrayList;
import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER;
public class DataTableConfigPane extends JComponent implements PropertyChangeListener { public class DataTableConfigPane extends JComponent implements PropertyChangeListener {
private DataEditingTable table; private DataEditingTable table;
public DataTableConfigPane() { public DataTableConfigPane() {
table = new DataEditingTable(); table = new DataEditingTable();
JScrollPane scrollPane = new JScrollPane(table); JScrollPane scrollPane = new JScrollPane(table);
this.setLayout(new DataTableLayout()); this.setLayout(new DataTableLayout());
this.add(scrollPane, BorderLayout.CENTER); this.add(scrollPane, BorderLayout.CENTER);
} }
public void populate(DataTableConfig config) { public void populate(DataTableConfig config) {
table.populate(config); table.populate(config);
} }
public DataTableConfig update() { public DataTableConfig update() {
return table.update(); return table.update();
} }
class DataTableLayout extends BorderLayout { class DataTableLayout extends BorderLayout {
public void layoutContainer(Container target) { public void layoutContainer(Container target) {
super.layoutContainer(target); super.layoutContainer(target);
table.doLayout(); table.doLayout();
} }
} }
class DataEditingTable extends JTable { class DataEditingTable extends JTable {
private DataTableConfig config; private DataTableConfig config;
private BeanTableModel model; private BeanTableModel model;
private TableColumnModelListener modeListener; private TableColumnModelListener modeListener;
public DataEditingTable() { public DataEditingTable() {
this.setBorder(BorderFactory.createLineBorder(new Color(210, 210, 210), 1)); this.setBorder(BorderFactory.createLineBorder(new Color(210, 210, 210), 1));
this.setColumnSelectionAllowed(true); this.setColumnSelectionAllowed(true);
this.setRowSelectionAllowed(true); this.setRowSelectionAllowed(true);
MouseAdapterListener l = new MouseAdapterListener(this); MouseAdapterListener l = new MouseAdapterListener(this);
this.addMouseListener(l); this.addMouseListener(l);
this.addMouseMotionListener(l); this.addMouseMotionListener(l);
model = new BeanTableModel(); model = new BeanTableModel();
modeListener = new TableColumnModelListener() { modeListener = new TableColumnModelListener() {
@Override @Override
public void columnAdded(TableColumnModelEvent e) { public void columnAdded(TableColumnModelEvent e) {
} }
@Override @Override
public void columnMarginChanged(ChangeEvent e) { public void columnMarginChanged(ChangeEvent e) {
DataTableConfigPane.this.propertyChange(); DataTableConfigPane.this.propertyChange();
} }
@Override @Override
public void columnMoved(TableColumnModelEvent e) { public void columnMoved(TableColumnModelEvent e) {
DataTableConfigPane.this.propertyChange(); DataTableConfigPane.this.propertyChange();
} }
@Override @Override
public void columnRemoved(TableColumnModelEvent e) { public void columnRemoved(TableColumnModelEvent e) {
} }
@Override @Override
public void columnSelectionChanged(ListSelectionEvent e) { public void columnSelectionChanged(ListSelectionEvent e) {
} }
}; };
} }
public TableCellRenderer getCellRenderer(int row, int column) { public TableCellRenderer getCellRenderer(int row, int column) {
TableCellRenderer renderer = super.getCellRenderer(row, column); TableCellRenderer renderer = super.getCellRenderer(row, column);
if (renderer instanceof UILabel) { if (renderer instanceof UILabel) {
((UILabel) renderer).setHorizontalAlignment(UILabel.CENTER); ((UILabel) renderer).setHorizontalAlignment(UILabel.CENTER);
} }
return renderer; return renderer;
} }
public void populate(DataTableConfig config) { public void populate(DataTableConfig config) {
this.getTableHeader().getColumnModel().removeColumnModelListener(modeListener); this.getTableHeader().getColumnModel().removeColumnModelListener(modeListener);
if (config == null) { if (config == null) {
config = DataTableConfig.DEFAULT_TABLE_DATA_CONFIG; config = DataTableConfig.DEFAULT_TABLE_DATA_CONFIG;
} }
this.config = config; this.config = config;
model = new BeanTableModel(); model = new BeanTableModel();
this.setModel(model); this.setModel(model);
this.setRowHeight(0, config.getRowHeight()); this.setRowHeight(0, config.getRowHeight());
for (int i = 0; i < config.getColumnCount(); i++) { for (int i = 0; i < config.getColumnCount(); i++) {
this.getColumn(this.getColumnName(i)).setPreferredWidth(config.getColumnWidth(i)); this.getColumn(this.getColumnName(i)).setPreferredWidth(config.getColumnWidth(i));
} }
this.getTableHeader().getColumnModel().addColumnModelListener(modeListener); this.getTableHeader().getColumnModel().addColumnModelListener(modeListener);
this.doLayout(); this.doLayout();
this.repaint(); this.repaint();
} }
public DataTableConfig update() { public DataTableConfig update() {
config.setRowHeight(this.getRowHeight(0)); config.setRowHeight(this.getRowHeight(0));
model = new BeanTableModel(); model = new BeanTableModel();
String[] columns = new String[this.getColumnCount()]; String[] columns = new String[this.getColumnCount()];
for (int i = 0; i < this.getColumnCount(); i++) { for (int i = 0; i < this.getColumnCount(); i++) {
config.setColumnWidth(i, this.getColumn(this.getColumnName(i)).getWidth()); config.setColumnWidth(i, this.getColumn(this.getColumnName(i)).getWidth());
columns[i] = this.getColumnName(i); columns[i] = this.getColumnName(i);
} }
config.setColumns(columns); config.setColumns(columns);
return config; return config;
} }
public class BeanTableModel extends AbstractTableModel { public class BeanTableModel extends AbstractTableModel {
@Override @Override
public int getColumnCount() { public int getColumnCount() {
return config.getColumnCount(); return config.getColumnCount();
} }
@Override @Override
public int getRowCount() { public int getRowCount() {
return 1; return 1;
} }
@Override @Override
public String getColumnName(int column) { public String getColumnName(int column) {
return config.getColumnName(column); return config.getColumnName(column);
} }
@Override @Override
public Object getValueAt(int rowIndex, int columnIndex) { public Object getValueAt(int rowIndex, int columnIndex) {
return config.getTableDataName() + "." + config.getColumnName(columnIndex); return config.getTableDataName() + "." + config.getColumnName(columnIndex);
} }
} }
class MouseAdapterListener extends MouseAdapter { class MouseAdapterListener extends MouseAdapter {
private JTable table; private final static int DIS = 30;
int oldY = 0; private final static int SMALL_DIS = 3;
int newY = 0; private JTable table;
int row = 0; int oldY = 0;
int oldHeight = 0; int newY = 0;
boolean drag = false; int row = 0;
int increase = 0; int oldHeight = 0;
JPopupMenu popupMenu; boolean drag = false;
int increase = 0;
public MouseAdapterListener(JTable table) { JPopupMenu popupMenu;
this.table = table;
popupMenu = new JPopupMenu(); public MouseAdapterListener(JTable table) {
this.table = table;
popupMenu.add(new CutAction()); popupMenu = new JPopupMenu();
popupMenu.add(new CutAction());
popupMenu.add(new CutAction()); popupMenu.add(new CutAction());
popupMenu.add(new CutAction()); popupMenu.add(new CutAction());
} popupMenu.add(new CutAction());
popupMenu.add(new CutAction());
class CutAction extends UpdateAction { }
/** class CutAction extends UpdateAction {
* Constructor
*/ /**
public CutAction() { * Constructor
this.setName(Inter.getLocText("M_Edit-Cut")); */
this.setMnemonic('T'); public CutAction() {
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/cut.png")); this.setName(Inter.getLocText("M_Edit-Cut"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.CTRL_MASK)); this.setMnemonic('T');
} this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/cut.png"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER));
@Override }
public void actionPerformed(ActionEvent e) {
int row = table.getSelectedRow(); @Override
int column = table.getSelectedColumn(); public void actionPerformed(ActionEvent e) {
table.getColumnModel().removeColumn(table.getColumn(table.getColumnName(column))); int row = table.getSelectedRow();
DataTableConfigPane.this.propertyChange(); int column = table.getSelectedColumn();
} table.getColumnModel().removeColumn(table.getColumn(table.getColumnName(column)));
} DataTableConfigPane.this.propertyChange();
}
public void mouseMoved(MouseEvent e) { }
int onRow = table.rowAtPoint(e.getPoint());
public void mouseMoved(MouseEvent e) {
int height = 0; int onRow = table.rowAtPoint(e.getPoint());
for (int i = 0; i <= onRow; i++) {
height = height + table.getRowHeight(i); int height = 0;
} for (int i = 0; i <= onRow; i++) {
height = height + table.getRowHeight(i);
if (height - e.getY() < 3) { }
drag = true;
table.setCursor(new Cursor(Cursor.N_RESIZE_CURSOR)); if (height - e.getY() < SMALL_DIS) {
} else { drag = true;
drag = false; table.setCursor(new Cursor(Cursor.N_RESIZE_CURSOR));
table.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); } else {
} drag = false;
table.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
} }
private void trigger_popup(MouseEvent e) { }
popupMenu.show(table, e.getX(), e.getY()); private void trigger_popup(MouseEvent e) {
}
popupMenu.show(table, e.getX(), e.getY());
public void mouseDragged(MouseEvent e) { }
if (drag) {
int value = oldHeight + e.getY() - oldY; public void mouseDragged(MouseEvent e) {
if (value < 30) if (drag) {
table.setRowHeight(row, 30); int value = oldHeight + e.getY() - oldY;
else if (value < DIS) {
table.setRowHeight(row, oldHeight + e.getY() - oldY); table.setRowHeight(row, DIS);
DataTableConfigPane.this.propertyChange(); } else {
} table.setRowHeight(row, oldHeight + e.getY() - oldY);
} }
DataTableConfigPane.this.propertyChange();
public void mousePressed(MouseEvent e) { }
oldY = e.getY(); }
row = table.rowAtPoint(e.getPoint());
oldHeight = table.getRowHeight(row); public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) { oldY = e.getY();
trigger_popup(e); row = table.rowAtPoint(e.getPoint());
} oldHeight = table.getRowHeight(row);
} if (e.getButton() == MouseEvent.BUTTON3) {
trigger_popup(e);
public void mouseReleased(MouseEvent e) { }
newY = e.getY(); }
table.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
} public void mouseReleased(MouseEvent e) {
} newY = e.getY();
} table.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
private ArrayList<PropertyChangeListener> changetList = new ArrayList<PropertyChangeListener>(); }
}
public void addpropertyChangeListener(PropertyChangeListener l) {
changetList.add(l); private ArrayList<PropertyChangeListener> changetList = new ArrayList<PropertyChangeListener>();
}
public void addpropertyChangeListener(PropertyChangeListener l) {
@Override changetList.add(l);
public void propertyChange() { }
for (PropertyChangeListener l : changetList) {
l.propertyChange(); @Override
} public void propertyChange() {
} for (PropertyChangeListener l : changetList) {
l.propertyChange();
}
}
@Override @Override
public void propertyChange(Object mark) { public void propertyChange(Object mark) {
} }
@Override @Override
public void propertyChange(Object[] marks) { public void propertyChange(Object[] marks) {
} }
} }
Loading…
Cancel
Save