From 0710522405a016dcaa22aa6ac9248b0390848f9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Sun, 3 Mar 2013 08:04:40 +0100 Subject: [PATCH] AS3: sorting traits list --- .../decompiler/flash/abc/gui/ABCPanel.java | 23 +++- .../flash/abc/gui/IconListRenderer.java | 16 ++- .../decompiler/flash/abc/gui/TraitsList.java | 28 ++++- .../flash/abc/gui/TraitsListItem.java | 103 ++++++++++++++++++ .../flash/abc/gui/TraitsListModel.java | 57 ++++++---- .../decompiler/flash/gui/graphics/sort16.png | Bin 0 -> 506 bytes 6 files changed, 188 insertions(+), 39 deletions(-) create mode 100644 trunk/src/com/jpexs/decompiler/flash/abc/gui/TraitsListItem.java create mode 100644 trunk/src/com/jpexs/decompiler/flash/gui/graphics/sort16.png diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/gui/ABCPanel.java b/trunk/src/com/jpexs/decompiler/flash/abc/gui/ABCPanel.java index 9ad44abd8..249341f74 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/gui/ABCPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/gui/ABCPanel.java @@ -23,6 +23,8 @@ import com.jpexs.decompiler.flash.gui.View; import com.jpexs.decompiler.flash.tags.DoABCTag; import java.awt.BorderLayout; import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; import java.awt.Font; import java.awt.event.*; import java.util.ArrayList; @@ -212,12 +214,21 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener { navigator.setABC(list, abc); - navPanel = new JPanel(new BorderLayout()); - JLabel traitsLabel = new JLabel("Traits"); - navPanel.add(traitsLabel, BorderLayout.NORTH); + navPanel = new JPanel(new BorderLayout()); + JPanel navIconsPanel=new JPanel(); + navIconsPanel.setLayout(new BoxLayout(navIconsPanel, BoxLayout.X_AXIS)); + final JToggleButton sortButton=new JToggleButton(View.getIcon("sort16")); + navIconsPanel.add(sortButton); + navPanel.add(navIconsPanel,BorderLayout.SOUTH); + navPanel.add(new JScrollPane(navigator), BorderLayout.CENTER); + sortButton.addActionListener(new ActionListener() { - traitsLabel.setBorder(new BevelBorder(BevelBorder.RAISED)); - //navPanel.add(new JScrollPane(navigator), BorderLayout.CENTER); + @Override + public void actionPerformed(ActionEvent e) { + navigator.setSorted(sortButton.isSelected()); + navigator.updateUI(); + } + }); Main.startWork("Building script tree..."); @@ -262,7 +273,7 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener { splitPaneTreeVSNavigator.setResizeWeight(0.5); splitPaneTreeVSNavigator.setContinuousLayout(true); tabbedPane = new JTabbedPane(); - tabbedPane.addTab("Traits", new JScrollPane(navigator)); + tabbedPane.addTab("Traits", navPanel); //tabbedPane.setTabPlacement(JTabbedPane.BOTTOM); //pan2.add(tabbedPane, BorderLayout.CENTER); diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/gui/IconListRenderer.java b/trunk/src/com/jpexs/decompiler/flash/abc/gui/IconListRenderer.java index cd8445efb..517537073 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/gui/IconListRenderer.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/gui/IconListRenderer.java @@ -52,22 +52,20 @@ public class IconListRenderer // Get icon to use for the list item value - String modifiersRegex = "(public |static |final |override |private |protected |package )*"; - if ((" " + value.toString()).contains(" const ")) { + TraitsListItem tli=(TraitsListItem)value; + + if (tli.getType()==TraitsListItem.Type.CONST) { label.setIcon(constIcon); } - if ((" " + value.toString()).contains(" var ")) { + if (tli.getType()==TraitsListItem.Type.VAR) { label.setIcon(variableIcon); } - if ((" " + value.toString()).contains(" function ")) { + if (tli.getType()==TraitsListItem.Type.METHOD) { label.setIcon(functionIcon); } - if (value.toString().equals(TraitsListModel.STR_CLASS_INITIALIZER)) { + if (tli.getType()==TraitsListItem.Type.INITIALIZER) { label.setIcon(functionIcon); - } - if (value.toString().equals(TraitsListModel.STR_INSTANCE_INITIALIZER)) { - label.setIcon(functionIcon); - } + } return label; } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/gui/TraitsList.java b/trunk/src/com/jpexs/decompiler/flash/abc/gui/TraitsList.java index 4fb6e6444..714493987 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/gui/TraitsList.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/gui/TraitsList.java @@ -30,6 +30,19 @@ public class TraitsList extends JList implements ListSelectionListener { List abcTags; int classIndex = -1; private ABCPanel abcPanel; + + private boolean sorted=false; + + public void setSorted(boolean sorted) { + if(getModel() instanceof TraitsListModel){ + ((TraitsListModel)getModel()).setSorted(sorted); + } + this.sorted=sorted; + } + + + + public int getClassIndex() { return classIndex; @@ -54,16 +67,21 @@ public class TraitsList extends JList implements ListSelectionListener { setModel(new DefaultListModel()); } else { if (abc != null) { - setModel(new TraitsListModel(abcTags, abc, classIndex)); + setModel(new TraitsListModel(abcTags, abc, classIndex,sorted)); } } } + + private int lastSelected=-1; + @Override public void valueChanged(ListSelectionEvent e) { - - int index = getSelectedIndex(); - - abcPanel.decompiledTextArea.gotoTrait(index); + if(getSelectedIndex()==lastSelected){ + return; + } + lastSelected=getSelectedIndex(); + TraitsListItem sel = (TraitsListItem)getSelectedValue(); + abcPanel.decompiledTextArea.gotoTrait(sel==null?-1:sel.getGlobalTraitId()); } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/gui/TraitsListItem.java b/trunk/src/com/jpexs/decompiler/flash/abc/gui/TraitsListItem.java new file mode 100644 index 000000000..cdd65a7ae --- /dev/null +++ b/trunk/src/com/jpexs/decompiler/flash/abc/gui/TraitsListItem.java @@ -0,0 +1,103 @@ +package com.jpexs.decompiler.flash.abc.gui; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; +import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; +import com.jpexs.decompiler.flash.tags.DoABCTag; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author JPEXS + */ +public class TraitsListItem { + private Type type; + private boolean isStatic; + private List abcTags; + private ABC abc; + private int classIndex; + private int index; + public static final String STR_INSTANCE_INITIALIZER = "instance initializer"; + public static final String STR_CLASS_INITIALIZER = "class initializer"; + + + public TraitsListItem(Type type, int index, boolean isStatic, List abcTags, ABC abc, int classIndex) { + this.type = type; + this.index=index; + this.isStatic = isStatic; + this.abcTags = abcTags; + this.abc = abc; + this.classIndex = classIndex; + } + + public int getGlobalTraitId(){ + if(type == Type.INITIALIZER){ + if(!isStatic){ + return abc.class_info[classIndex].static_traits.traits.length+abc.instance_info[classIndex].instance_traits.traits.length; + }else{ + return abc.class_info[classIndex].static_traits.traits.length+abc.instance_info[classIndex].instance_traits.traits.length+1; + } + } + if(isStatic){ + return index; + }else{ + return abc.class_info[classIndex].static_traits.traits.length+index; + } + } + + public String toStringName(){ + if ((type!= Type.INITIALIZER) && isStatic) { + return abc.class_info[classIndex].static_traits.traits[index].getName(abc).getName(abc.constants, new ArrayList()); + } else if ((type!= Type.INITIALIZER) && (!isStatic)) { + return abc.instance_info[classIndex].instance_traits.traits[index].getName(abc).getName(abc.constants, new ArrayList()); + } else if (!isStatic) { + return "__"+STR_INSTANCE_INITIALIZER; + } else { + return "__"+STR_CLASS_INITIALIZER; + } + } + + @Override + public String toString() { + if ((type!= Type.INITIALIZER) && isStatic) { + return abc.class_info[classIndex].static_traits.traits[index].convertHeader("", abcTags, abc, true, false, classIndex, false, new ArrayList()); + } else if ((type!= Type.INITIALIZER) && (!isStatic)) { + return abc.instance_info[classIndex].instance_traits.traits[index].convertHeader("", abcTags, abc, false, false, classIndex, false, new ArrayList()); + } else if (!isStatic) { + return STR_INSTANCE_INITIALIZER; + } else { + return STR_CLASS_INITIALIZER; + } + } + + public Type getType() { + return type; + } + + public boolean isStatic(){ + return isStatic; + } + + public enum Type { + METHOD, + VAR, + CONST, + INITIALIZER; + + public static Type getTypeForTrait(Trait t){ + if(t instanceof TraitMethodGetterSetter){ + return METHOD; + } + if(t instanceof TraitSlotConst){ + if(((TraitSlotConst)t).isConst()){ + return CONST; + }else{ + return VAR; + } + } + return null; + } + } +} diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/gui/TraitsListModel.java b/trunk/src/com/jpexs/decompiler/flash/abc/gui/TraitsListModel.java index 9267aa094..c659f179a 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/gui/TraitsListModel.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/gui/TraitsListModel.java @@ -19,41 +19,60 @@ package com.jpexs.decompiler.flash.abc.gui; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.tags.DoABCTag; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import javax.swing.ListModel; import javax.swing.event.ListDataListener; public class TraitsListModel implements ListModel { - ABC abc; - int classIndex; - public static final String STR_INSTANCE_INITIALIZER = "instance initializer"; - public static final String STR_CLASS_INITIALIZER = "class initializer"; + private List items; private List abcTags; + private ABC abc; + private int classIndex; - public TraitsListModel(List abcTags, ABC abc, int classIndex) { - this.abc = abc; + public void setSorted(boolean sorted) { + if (sorted) { + Collections.sort(items, new Comparator() { + @Override + public int compare(TraitsListItem o1, TraitsListItem o2) { + return o1.toStringName().compareTo(o2.toStringName()); + } + }); + } else { + reset(); + } + } + + private void reset() { + items = new ArrayList(); + for (int t = 0; t < abc.class_info[classIndex].static_traits.traits.length; t++) { + items.add(new TraitsListItem(TraitsListItem.Type.getTypeForTrait(abc.class_info[classIndex].static_traits.traits[t]), t, true, abcTags, abc, classIndex)); + } + for (int t = 0; t < abc.instance_info[classIndex].instance_traits.traits.length; t++) { + items.add(new TraitsListItem(TraitsListItem.Type.getTypeForTrait(abc.instance_info[classIndex].instance_traits.traits[t]), t, false, abcTags, abc, classIndex)); + } + items.add(new TraitsListItem(TraitsListItem.Type.INITIALIZER, 0, false, abcTags, abc, classIndex)); + items.add(new TraitsListItem(TraitsListItem.Type.INITIALIZER, 0, true, abcTags, abc, classIndex)); + } + + public TraitsListModel(List abcTags, ABC abc, int classIndex,boolean sorted) { this.abcTags = abcTags; + this.abc = abc; this.classIndex = classIndex; + reset(); + if(sorted){ + setSorted(true); + } } public int getSize() { - int cnt = abc.class_info[classIndex].static_traits.traits.length + abc.instance_info[classIndex].instance_traits.traits.length; - //if(abc.instance_info[classIndex].iinit_index!=0) cnt++; - cnt += 2; - return cnt; + return items.size(); } public Object getElementAt(int index) { - if (index < abc.class_info[classIndex].static_traits.traits.length) { - return abc.class_info[classIndex].static_traits.traits[index].convertHeader("", abcTags, abc, true, false, classIndex, false, new ArrayList()); - } else if (index < abc.class_info[classIndex].static_traits.traits.length + abc.instance_info[classIndex].instance_traits.traits.length) { - return abc.instance_info[classIndex].instance_traits.traits[index - abc.class_info[classIndex].static_traits.traits.length].convertHeader("", abcTags, abc, false, false, classIndex, false, new ArrayList()); - } else if (index == abc.class_info[classIndex].static_traits.traits.length + abc.instance_info[classIndex].instance_traits.traits.length) { - return STR_INSTANCE_INITIALIZER; - } else { - return STR_CLASS_INITIALIZER; - } + return items.get(index); } public void addListDataListener(ListDataListener l) { diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/graphics/sort16.png b/trunk/src/com/jpexs/decompiler/flash/gui/graphics/sort16.png new file mode 100644 index 0000000000000000000000000000000000000000..c3746d8fc31a95ca592a575b6562b07a808b4580 GIT binary patch literal 506 zcmVar+caDT2yilUV;BI`?Ee1!dqJQ9Jzu_j zIRd23fWQ}<0pEW8Lk)wtxVQ$Ojjvc)S(gC~N&$vL!pDyv{{s!0ip_w(fB(bTEYZ=? zxj-{$~Js0gQL=-tB;Hz>nWZVSpq)Ve;h38$b*{KfeP& z%`!?#O2@IefRlw$5~uTkn%BF!y1p+iE^f!ACS%@1>|p@X47AxnPfu?~Z*OlUHqD+5 zH?DE9F)>6>dvF!S3&dy!fqU0K2mkxeu;|0vUvYSy4P*xx8X7LeW{7(DX-ycL5kvqr w9{^JNZ{EDw29tR3;DIzKMt~{QfdLNy033wT!KCPr-2eap07*qoM6N<$g60X>-~a#s literal 0 HcmV?d00001