Merge origin/master

Conflicts:
	src/com/jpexs/decompiler/flash/gui/proxy/ProxyFrame.java
This commit is contained in:
Jindra Petřík
2014-11-18 06:46:57 +01:00
24 changed files with 356 additions and 336 deletions
@@ -214,7 +214,8 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis
if (e == null) {
return;
}
synchronized (iconPanel) {
boolean draw2 = false;
synchronized (ImagePanel.class) {
lastMouseEvent = e;
boolean handCursor = false;
DepthState newStateUnderCursor = null;
@@ -272,12 +273,13 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis
}
if (newStateUnderCursor != stateUnderCursor) {
stateUnderCursor = newStateUnderCursor;
if (draw) {
drawFrame();
}
draw2 = true;
}
}
}
if (draw2) {
drawFrame();
}
}
private void showSelectedName() {
@@ -46,7 +46,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
+2 -2
View File
@@ -589,7 +589,7 @@ public class Main {
case SAVE:
case SAVEAS:
if (swf.file != null) {
ext = Path.getExtension(swf.file);
ext = Path.getExtension(swf.file);
}
break;
case EXE:
@@ -1256,7 +1256,7 @@ public class Main {
checkForUpdates();
return null;
}
}.execute();
}.execute();
}
}
}
@@ -73,37 +73,14 @@ import com.jpexs.decompiler.flash.importers.ImageImporter;
import com.jpexs.decompiler.flash.importers.ShapeImporter;
import com.jpexs.decompiler.flash.tags.ABCContainerTag;
import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag;
import com.jpexs.decompiler.flash.tags.DefineBitsJPEG2Tag;
import com.jpexs.decompiler.flash.tags.DefineBitsJPEG3Tag;
import com.jpexs.decompiler.flash.tags.DefineBitsJPEG4Tag;
import com.jpexs.decompiler.flash.tags.DefineBitsLossless2Tag;
import com.jpexs.decompiler.flash.tags.DefineBitsLosslessTag;
import com.jpexs.decompiler.flash.tags.DefineBitsTag;
import com.jpexs.decompiler.flash.tags.DefineButton2Tag;
import com.jpexs.decompiler.flash.tags.DefineButtonTag;
import com.jpexs.decompiler.flash.tags.DefineEditTextTag;
import com.jpexs.decompiler.flash.tags.DefineFont2Tag;
import com.jpexs.decompiler.flash.tags.DefineFont3Tag;
import com.jpexs.decompiler.flash.tags.DefineFont4Tag;
import com.jpexs.decompiler.flash.tags.DefineFontTag;
import com.jpexs.decompiler.flash.tags.DefineMorphShape2Tag;
import com.jpexs.decompiler.flash.tags.DefineMorphShapeTag;
import com.jpexs.decompiler.flash.tags.DefineShape2Tag;
import com.jpexs.decompiler.flash.tags.DefineShape3Tag;
import com.jpexs.decompiler.flash.tags.DefineShape4Tag;
import com.jpexs.decompiler.flash.tags.DefineShapeTag;
import com.jpexs.decompiler.flash.tags.DefineSoundTag;
import com.jpexs.decompiler.flash.tags.DefineSpriteTag;
import com.jpexs.decompiler.flash.tags.DefineText2Tag;
import com.jpexs.decompiler.flash.tags.DefineTextTag;
import com.jpexs.decompiler.flash.tags.JPEGTablesTag;
import com.jpexs.decompiler.flash.tags.SymbolClassTag;
import com.jpexs.decompiler.flash.tags.Tag;
import com.jpexs.decompiler.flash.tags.base.ASMSource;
import com.jpexs.decompiler.flash.tags.base.BoundedTag;
import com.jpexs.decompiler.flash.tags.base.ButtonTag;
import com.jpexs.decompiler.flash.tags.base.CharacterTag;
import com.jpexs.decompiler.flash.tags.base.Container;
import com.jpexs.decompiler.flash.tags.base.ContainerItem;
import com.jpexs.decompiler.flash.tags.base.DrawableTag;
import com.jpexs.decompiler.flash.tags.base.FontTag;
@@ -594,12 +571,6 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec
for (SWF swf : newSwfs) {
for (Tag t : swf.tags) {
if (t instanceof JPEGTablesTag) {
swf.jtt = (JPEGTablesTag) t;
}
}
if (Configuration.autoRenameIdentifiers.get()) {
try {
swf.deobfuscateIdentifiers(RenameType.TYPENUMBER);
@@ -1075,21 +1046,21 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec
}
}
public void gotoFrame(int frame){
public void gotoFrame(int frame) {
TreeItem treeItem = (TreeItem) tagTree.getLastSelectedPathComponent();
if (treeItem == null) {
return;
}
if(treeItem instanceof Timelined){
Timelined t = (Timelined)treeItem;
if (treeItem instanceof Timelined) {
Timelined t = (Timelined) treeItem;
Timeline tim = t.getTimeline();
Frame f = ((TagTreeModel)tagTree.getModel()).getFrame(treeItem.getSwf(), t, frame);
if(f!=null){
Frame f = ((TagTreeModel) tagTree.getModel()).getFrame(treeItem.getSwf(), t, frame);
if (f != null) {
setTagTreeSelectedNode(f);
}
}
}
public void gotoDocumentClass(SWF swf) {
if (swf == null) {
return;
@@ -283,7 +283,7 @@ public class PreviewPanel extends JSplitPane implements ActionListener {
flashPlayPanel.add(bottomPanel, BorderLayout.SOUTH);*/
JPanel flashPlayPanel2 = new JPanel(new BorderLayout());
flashPlayPanel2.add(flashPlayPanel, BorderLayout.CENTER);
flashPlayPanel2.add(new PlayerControls(mainPanel,flashPanel), BorderLayout.SOUTH);
flashPlayPanel2.add(new PlayerControls(mainPanel, flashPanel), BorderLayout.SOUTH);
leftComponent = flashPlayPanel2;
} else {
JPanel swtPanel = new JPanel(new BorderLayout());
@@ -303,7 +303,7 @@ public class PreviewPanel extends JSplitPane implements ActionListener {
JPanel previewCnt = new JPanel(new BorderLayout());
imagePanel = new ImagePanel();
previewCnt.add(imagePanel, BorderLayout.CENTER);
previewCnt.add(imagePlayControls = new PlayerControls(mainPanel,imagePanel), BorderLayout.SOUTH);
previewCnt.add(imagePlayControls = new PlayerControls(mainPanel, imagePanel), BorderLayout.SOUTH);
imagePlayControls.setMedia(imagePanel);
previewPanel.add(previewCnt, BorderLayout.CENTER);
JLabel prevIntLabel = new HeaderLabel(mainPanel.translate("swfpreview.internal"));
@@ -512,26 +512,25 @@ public class PreviewPanel extends JSplitPane implements ActionListener {
if (tagObj instanceof DefineSoundTag) {
frameCount = 1;
}
if(tagObj instanceof DefineSpriteTag){
frameCount = ((DefineSpriteTag)tagObj).frameCount;
if (tagObj instanceof DefineSpriteTag) {
frameCount = ((DefineSpriteTag) tagObj).frameCount;
}
byte[] data;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
SWFOutputStream sos2 = new SWFOutputStream(baos, SWF.DEFAULT_VERSION);
RECT outrect = new RECT(swf.displayRect);
if (tagObj instanceof FontTag) {
outrect.Xmin=0;
outrect.Ymin=0;
outrect.Xmax = FontTag.PREVIEWSIZE*20;
outrect.Ymax = FontTag.PREVIEWSIZE*20;
outrect.Xmin = 0;
outrect.Ymin = 0;
outrect.Xmax = FontTag.PREVIEWSIZE * 20;
outrect.Ymax = FontTag.PREVIEWSIZE * 20;
}
int width = outrect.getWidth();
int height = outrect.getHeight();
sos2.writeRECT(outrect);
sos2.writeUI8(0);
sos2.writeUI8(frameRate);
@@ -605,18 +604,17 @@ public class PreviewPanel extends JSplitPane implements ActionListener {
new ShowFrameTag(swf).writeTag(sos2);
} else {
boolean isSprite=false;
if(tagObj instanceof DefineSpriteTag){
boolean isSprite = false;
if (tagObj instanceof DefineSpriteTag) {
isSprite = true;
}
int chtId = 0;
if (tagObj instanceof CharacterTag) {
chtId = ((CharacterTag) tagObj).getCharacterId();
}
if (tagObj instanceof DefineBitsTag) {
JPEGTablesTag jtt = swf.jtt;
JPEGTablesTag jtt = swf.getJtt();
if (jtt != null) {
jtt.writeTag(sos2);
}
@@ -625,7 +623,7 @@ public class PreviewPanel extends JSplitPane implements ActionListener {
Set<Integer> needed = new HashSet<>();
((Tag) tagObj).getNeededCharactersDeep(needed);
for (int n : needed) {
if(isSprite && chtId == n){
if (isSprite && chtId == n) {
continue;
}
classicTag(swf.characters.get(n)).writeTag(sos2);
@@ -634,8 +632,6 @@ public class PreviewPanel extends JSplitPane implements ActionListener {
classicTag((Tag) tagObj).writeTag(sos2);
MATRIX mat = new MATRIX();
mat.hasRotate = false;
mat.hasScale = false;
@@ -653,8 +649,8 @@ public class PreviewPanel extends JSplitPane implements ActionListener {
}
if (tagObj instanceof FontTag) {
FontTag ft=(FontTag)classicTag((Tag)tagObj);
FontTag ft = (FontTag) classicTag((Tag) tagObj);
int countGlyphsTotal = ft.getGlyphShapeTable().size();
int countGlyphs = Math.min(SHAPERECORD.MAX_CHARACTERS_IN_FONT_PREVIEW, countGlyphsTotal);
int fontId = ft.getFontId();
@@ -664,34 +660,34 @@ public class PreviewPanel extends JSplitPane implements ActionListener {
int y = 0;
int firstGlyphIndex = fontPageNum * SHAPERECORD.MAX_CHARACTERS_IN_FONT_PREVIEW;
countGlyphs = Math.min(SHAPERECORD.MAX_CHARACTERS_IN_FONT_PREVIEW, countGlyphsTotal - firstGlyphIndex);
List<SHAPE> shapes=ft.getGlyphShapeTable();
List<SHAPE> shapes = ft.getGlyphShapeTable();
int maxw = 0;
for (int f = firstGlyphIndex; f < firstGlyphIndex + countGlyphs; f++) {
for (int f = firstGlyphIndex; f < firstGlyphIndex + countGlyphs; f++) {
RECT b = shapes.get(f).getBounds();
if(b.Xmin == Integer.MAX_VALUE){
if (b.Xmin == Integer.MAX_VALUE) {
continue;
}
if(b.Ymin == Integer.MAX_VALUE){
if (b.Ymin == Integer.MAX_VALUE) {
continue;
}
int w=(int)(b.getWidth()/ft.getDivider());
if(w>maxw){
int w = (int) (b.getWidth() / ft.getDivider());
if (w > maxw) {
maxw = w;
}
}
x++;
}
x = 0;
int BORDER = 3*20;
int textHeight = height / rows;
while(maxw*textHeight/1024.0 > width/cols-2*BORDER){
int BORDER = 3 * 20;
int textHeight = height / rows;
while (maxw * textHeight / 1024.0 > width / cols - 2 * BORDER) {
textHeight--;
}
MATRIX tmat=new MATRIX();
MATRIX tmat = new MATRIX();
for (int f = firstGlyphIndex; f < firstGlyphIndex + countGlyphs; f++) {
if (x >= cols) {
x = 0;
@@ -699,41 +695,39 @@ public class PreviewPanel extends JSplitPane implements ActionListener {
}
List<TEXTRECORD> rec = new ArrayList<>();
TEXTRECORD tr = new TEXTRECORD();
RECT b = shapes.get(f).getBounds();
int xmin = b.Xmin == Integer.MAX_VALUE?0:(int)(b.Xmin/ft.getDivider());
xmin *= textHeight/1024.0;
int ymin = b.Ymin == Integer.MAX_VALUE?0:(int)(b.Ymin/ft.getDivider());
ymin *= textHeight/1024.0;
int w=(int)(b.getWidth()/ft.getDivider());
w *= textHeight/1024.0;
int h=(int)(b.getHeight()/ft.getDivider());
h *= textHeight/1024.0;
int xmin = b.Xmin == Integer.MAX_VALUE ? 0 : (int) (b.Xmin / ft.getDivider());
xmin *= textHeight / 1024.0;
int ymin = b.Ymin == Integer.MAX_VALUE ? 0 : (int) (b.Ymin / ft.getDivider());
ymin *= textHeight / 1024.0;
int w = (int) (b.getWidth() / ft.getDivider());
w *= textHeight / 1024.0;
int h = (int) (b.getHeight() / ft.getDivider());
h *= textHeight / 1024.0;
tr.fontId = fontId;
tr.styleFlagsHasFont = true;
tr.textHeight = textHeight;
tr.xOffset=-xmin;
tr.yOffset=0;
tr.styleFlagsHasXOffset=true;
tr.styleFlagsHasYOffset=true;
tr.xOffset = -xmin;
tr.yOffset = 0;
tr.styleFlagsHasXOffset = true;
tr.styleFlagsHasYOffset = true;
tr.glyphEntries = new GLYPHENTRY[1];
tr.styleFlagsHasColor = true;
tr.textColor = new RGB(0, 0, 0);
tr.glyphEntries[0] = new GLYPHENTRY();
double ga=ft.getGlyphAdvance(f);
int cw=ga==-1?w:(int)(ga/ft.getDivider()*textHeight/1024.0);
double ga = ft.getGlyphAdvance(f);
int cw = ga == -1 ? w : (int) (ga / ft.getDivider() * textHeight / 1024.0);
tr.glyphEntries[0].glyphAdvance = 0;
tr.glyphEntries[0].glyphIndex = f;
rec.add(tr);
tmat.translateX = x * width/ cols + width/ cols/2-w/2;
rec.add(tr);
tmat.translateX = x * width / cols + width / cols / 2 - w / 2;
tmat.translateY = y * height / rows + height / rows / 2;
new DefineTextTag(swf, 999 + f, new RECT(0, cw, ymin, ymin+h), new MATRIX(), rec).writeTag(sos2);
new DefineTextTag(swf, 999 + f, new RECT(0, cw, ymin, ymin + h), new MATRIX(), rec).writeTag(sos2);
new PlaceObject2Tag(swf, false, false, false, true, false, true, true, false, 1 + f, 999 + f, tmat, null, 0, null, 0, null).writeTag(sos2);
x++;
}
@@ -882,25 +876,24 @@ public class PreviewPanel extends JSplitPane implements ActionListener {
new ShowFrameTag(swf).writeTag(sos2);
first = false;
}
} else if(tagObj instanceof DefineSpriteTag){
DefineSpriteTag s=(DefineSpriteTag)tagObj;
} else if (tagObj instanceof DefineSpriteTag) {
DefineSpriteTag s = (DefineSpriteTag) tagObj;
Tag lastTag = null;
for(Tag t:s.subTags){
if(t instanceof EndTag){
for (Tag t : s.subTags) {
if (t instanceof EndTag) {
break;
} else if(t instanceof PlaceObjectTypeTag){
PlaceObjectTypeTag pt=(PlaceObjectTypeTag)t;
} else if (t instanceof PlaceObjectTypeTag) {
PlaceObjectTypeTag pt = (PlaceObjectTypeTag) t;
MATRIX m = pt.getMatrix();
MATRIX m2 = new Matrix(m).preConcatenate(new Matrix(mat)).toMATRIX();
pt.writeTagWithMatrix(sos2, m2);
lastTag = t;
}
else{
} else {
t.writeTag(sos2);
lastTag = t;
}
}
if(!s.subTags.isEmpty() && (lastTag!=null)&&(!(lastTag instanceof ShowFrameTag))){
if (!s.subTags.isEmpty() && (lastTag != null) && (!(lastTag instanceof ShowFrameTag))) {
new ShowFrameTag(swf).writeTag(sos2);
}
} else {
@@ -923,7 +916,7 @@ public class PreviewPanel extends JSplitPane implements ActionListener {
fos.flush();
}
if (flashPanel != null) {
flashPanel.displaySWF(tempFile.getAbsolutePath(), backgroundColor, frameRate);
flashPanel.displaySWF(tempFile.getAbsolutePath(), backgroundColor, frameRate);
}
showFlashViewerPanel();
} catch (IOException | ActionParseException ex) {
+2 -2
View File
@@ -579,8 +579,8 @@ public class View {
return false;
}
public static JTable autoResizeColWidth(final JTable table, final TableModel model) {
public static JTable autoResizeColWidth(final JTable table, final TableModel model) {
View.execInEventDispatch(new Runnable() {
@Override
public void run() {
@@ -65,7 +65,6 @@ import com.jpexs.decompiler.graph.CompilationException;
import com.jpexs.helpers.CancellableWorker;
import com.jpexs.helpers.Helper;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.FlowLayout;
import java.awt.Font;
@@ -105,12 +104,7 @@ import javax.swing.JToggleButton;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.BevelBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.text.Highlighter;
import javax.swing.tree.TreePath;
import jsyntaxpane.DefaultSyntaxKit;
@@ -224,8 +218,6 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Se
return false;
}
public void setAbc(ABC abc) {
this.abc = abc;
updateConstList();
@@ -100,10 +100,10 @@ public class FlashPlayerPanel extends Panel implements Closeable, MediaDisplay {
@Override
public synchronized int getTotalFrames() {
if(flash==null){
if (flash == null) {
return 0;
}
if(flash.getReadyState() == 4){
if (flash.getReadyState() == 4) {
return flash.getTotalFrames();
}
return 0;
@@ -176,7 +176,7 @@ public class FlashPlayerPanel extends Panel implements Closeable, MediaDisplay {
if (bgColor != null) {
setBackground(bgColor);
}
flash.setMovie(flashName);
flash.setMovie(flashName);
//play
stopped = false;
@@ -184,7 +184,7 @@ public class FlashPlayerPanel extends Panel implements Closeable, MediaDisplay {
@Override
public void close() throws IOException {
}
@Override
@@ -93,20 +93,21 @@ public class PlayerControls extends JPanel implements ActionListener {
public static final int ZOOM_DECADE_STEPS = 10;
public static final double ZOOM_MULTIPLIER = Math.pow(10, 1.0 / ZOOM_DECADE_STEPS);
private static String underline(String s){
return "<html><font color=\"#000099\"><u>"+s+"</u></font></html>";
private static String underline(String s) {
return "<html><font color=\"#000099\"><u>" + s + "</u></font></html>";
}
private static Font underlinedFont=null;
private static Font notUnderlinedFont=null;
static{
private static Font underlinedFont = null;
private static Font notUnderlinedFont = null;
static {
notUnderlinedFont = new JLabel().getFont();
Map<TextAttribute, Integer> fontAttributes = new HashMap<TextAttribute, Integer>();
Map<TextAttribute, Integer> fontAttributes = new HashMap<>();
fontAttributes.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
underlinedFont= notUnderlinedFont.deriveFont(fontAttributes);
underlinedFont = notUnderlinedFont.deriveFont(fontAttributes);
}
public PlayerControls(final MainPanel mainPanel,MediaDisplay display) {
public PlayerControls(final MainPanel mainPanel, MediaDisplay display) {
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
@@ -160,22 +161,22 @@ public class PlayerControls extends JPanel implements ActionListener {
playbackControls = new JPanel();
this.display = display;
JPanel controlPanel = new JPanel(new BorderLayout());
frameLabel = new JLabel("0",SwingConstants.RIGHT);
frameLabel = new JLabel("0", SwingConstants.RIGHT);
frameLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
frameLabel.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
}
});
Dimension min=new Dimension(frameLabel.getFontMetrics(notUnderlinedFont).stringWidth("000"),frameLabel.getPreferredSize().height);
Dimension min = new Dimension(frameLabel.getFontMetrics(notUnderlinedFont).stringWidth("000"), frameLabel.getPreferredSize().height);
frameLabel.setMinimumSize(min);
frameLabel.setPreferredSize(min);
frameLabel.addMouseListener(new MouseAdapter() {
frameLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
@@ -186,31 +187,27 @@ public class PlayerControls extends JPanel implements ActionListener {
public void mouseExited(MouseEvent e) {
frameLabel.setFont(notUnderlinedFont);
}
@Override
public void mouseClicked(MouseEvent e) {
int gotoFrame = PlayerControls.this.display.getCurrentFrame();
if(gotoFrame>0){
if (gotoFrame > 0) {
mainPanel.gotoFrame(gotoFrame);
}
}
});
timeLabel = new JLabel("(00:00.00)");
timeLabel = new JLabel("(00:00.00)");
totalTimeLabel = new JLabel("(00:00.00)");
totalFrameLabel = new JLabel("0");
JPanel currentPanel=new JPanel(new FlowLayout());
JPanel currentPanel = new JPanel(new FlowLayout());
currentPanel.add(frameLabel);
currentPanel.add(timeLabel);
JPanel totalPanel=new JPanel(new FlowLayout());
JPanel totalPanel = new JPanel(new FlowLayout());
totalPanel.add(totalFrameLabel);
totalPanel.add(totalTimeLabel);
controlPanel.add(currentPanel, BorderLayout.WEST);
controlPanel.add(totalPanel, BorderLayout.EAST);
playbackControls.setLayout(new BoxLayout(playbackControls, BoxLayout.Y_AXIS));
@@ -302,11 +299,11 @@ public class PlayerControls extends JPanel implements ActionListener {
progress.setValue(currentFrame);
progress.setIndeterminate(false);
}
frameLabel.setText((""+(currentFrame+1)));
totalFrameLabel.setText(""+totalFrames);
if (frameRate != 0) {
timeLabel.setText("("+formatMs((currentFrame * 1000) / frameRate)+")");
totalTimeLabel.setText("("+formatMs(((totalFrames - 1) * 1000) / frameRate)+")");
frameLabel.setText(("" + (currentFrame + 1)));
totalFrameLabel.setText("" + totalFrames);
if (frameRate != 0) {
timeLabel.setText("(" + formatMs((currentFrame * 1000) / frameRate) + ")");
totalTimeLabel.setText("(" + formatMs(((totalFrames - 1) * 1000) / frameRate) + ")");
}
if (totalFrames <= 1 && playbackControls.isVisible()) {
playbackControls.setVisible(false);
@@ -24,11 +24,9 @@ import com.jpexs.decompiler.flash.gui.AppStrings;
import com.jpexs.decompiler.flash.gui.GuiAbortRetryIgnoreHandler;
import com.jpexs.decompiler.flash.gui.Main;
import com.jpexs.decompiler.flash.gui.MainFrame;
import com.jpexs.decompiler.flash.gui.SaveFileMode;
import com.jpexs.decompiler.flash.gui.View;
import com.jpexs.decompiler.flash.helpers.SWFDecompilerPlugin;
import com.jpexs.helpers.Helper;
import com.jpexs.helpers.Path;
import com.jpexs.proxy.CatchedListener;
import com.jpexs.proxy.ReplacedListener;
import com.jpexs.proxy.Replacement;
@@ -48,48 +46,35 @@ import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Comparator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BoxLayout;
import javax.swing.DefaultRowSorter;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.RowSorter;
import javax.swing.SwingConstants;
import javax.swing.event.TableModelListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import org.pushingpixels.substance.api.renderers.SubstanceDefaultTableCellRenderer;
/**
* Frame with Proxy
@@ -107,8 +92,7 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe
static final String ACTION_SAVEAS = "SAVEAS";
static final String ACTION_REPLACE = "REPLACE";
private JTable replacementsTable;
private JTable replacementsTable;
private JButton switchButton = new JButton(translate("proxy.start"));
private boolean started = false;
private JTextField portField = new JTextField("55555");
@@ -134,60 +118,60 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe
public void setPort(int port) {
portField.setText(Integer.toString(port));
}
private static class SizeItem implements Comparable<SizeItem>{
private static class SizeItem implements Comparable<SizeItem> {
String file;
public SizeItem(String file){
public SizeItem(String file) {
this.file = file;
}
@Override
public String toString() {
return Helper.byteCountStr(new File(file).length(), false);
}
}
@Override
public int compareTo(SizeItem o) {
return (int)(new File(file).length() - new File(o.file).length());
public int compareTo(SizeItem o) {
return (int) (new File(file).length() - new File(o.file).length());
}
}
DefaultTableModel tableModel;
private SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
private SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
List<Replacement> reps;
/**
* Constructor
*
* @param mainFrame
*/
public ProxyFrame(final MainFrame mainFrame) {
final String[] columnNames=new String[]{
final String[] columnNames = new String[]{
translate("column.accessed"),
translate("column.size"),
translate("column.url")};
translate("column.url")};
reps = Configuration.getReplacements();
Object data[][] = new Object[reps.size()][3];
for(int i=0;i<reps.size();i++){
for (int i = 0; i < reps.size(); i++) {
Replacement r = reps.get(i);
data[i][0] = r.lastAccess == null?"":format.format(r.lastAccess.getTime());
data[i][0] = r.lastAccess == null ? "" : format.format(r.lastAccess.getTime());
data[i][1] = new SizeItem(r.targetFile);
data[i][2] = r.urlPattern;
}
tableModel = new DefaultTableModel(data, columnNames){
tableModel = new DefaultTableModel(data, columnNames) {
@Override
public Class<?> getColumnClass(int columnIndex) {
Class classes[] = new Class[]{String.class,SizeItem.class,String.class};
Class classes[] = new Class[]{String.class, SizeItem.class, String.class};
return classes[columnIndex];
}
@@ -195,38 +179,29 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe
public boolean isCellEditable(int row, int column) {
return false;
}
};
};
replacementsTable = new JTable(tableModel);
DefaultTableCellRenderer tcr=new DefaultTableCellRenderer();
DefaultTableCellRenderer tcr = new DefaultTableCellRenderer();
tcr.setHorizontalAlignment(SwingConstants.RIGHT);
replacementsTable.setDefaultRenderer(String.class, new DefaultTableCellRenderer());
replacementsTable.setDefaultRenderer(SizeItem.class, tcr);
replacementsTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
replacementsTable.setDefaultRenderer(SizeItem.class, tcr);
replacementsTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
replacementsTable.setRowSelectionAllowed(true);
DefaultTableColumnModel colModel = (DefaultTableColumnModel) replacementsTable.getColumnModel();
colModel.getColumn(0).setMaxWidth(100);
colModel.getColumn(1).setMaxWidth(200);
replacementsTable.setAutoCreateRowSorter(true);
replacementsTable.setAutoCreateRowSorter(false);
replacementsTable.addMouseListener(this);
replacementsTable.setFont(new Font("Monospaced", Font.PLAIN, 12));
switchButton.addActionListener(this);
@@ -265,7 +240,6 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe
buttonsPanel21.add(removeButton);
//JPanel buttonsPanel22 = new JPanel(new FlowLayout());
JButton copyUrlButton = new JButton(translate("copy.url"));
copyUrlButton.setActionCommand(ACTION_COPYURL);
copyUrlButton.addActionListener(this);
@@ -326,13 +300,12 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe
}
private void open() {
if (replacementsTable.getSelectedRow()>-1){
if (replacementsTable.getSelectedRow() > -1) {
Replacement r = reps.get(replacementsTable.getRowSorter().convertRowIndexToModel(replacementsTable.getSelectedRow()));
Main.openFile(r.targetFile, r.urlPattern);
}
}
private String selectExportDir() {
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File(Configuration.lastExportDir.get()));
@@ -346,7 +319,7 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe
}
return null;
}
/**
* Method handling actions from buttons
*
@@ -354,28 +327,28 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe
*/
@Override
public void actionPerformed(ActionEvent e) {
int sel[] = replacementsTable.getSelectedRows();
for(int i=0;i<sel.length;i++){
int sel[] = replacementsTable.getSelectedRows();
for (int i = 0; i < sel.length; i++) {
sel[i] = replacementsTable.getRowSorter().convertRowIndexToModel(sel[i]);
}
switch (e.getActionCommand()) {
case ACTION_OPEN:
open();
break;
case ACTION_SAVEAS:
if (sel.length == 1) {
case ACTION_SAVEAS:
if (sel.length == 1) {
Replacement r = reps.get(sel[0]);
JFileChooser fc = new JFileChooser();
fc.setCurrentDirectory(new File(Configuration.lastSaveDir.get()));
String n=r.urlPattern;
if(n.contains("?")){
n = n.substring(0,n.indexOf("?"));
String n = r.urlPattern;
if (n.contains("?")) {
n = n.substring(0, n.indexOf('?'));
}
if(n.contains("/")){
n=n.substring(n.lastIndexOf("/"));
if (n.contains("/")) {
n = n.substring(n.lastIndexOf('/'));
}
n = Helper.makeFileName(n);
fc.setSelectedFile(new File(Configuration.lastSaveDir.get(),n));
fc.setSelectedFile(new File(Configuration.lastSaveDir.get(), n));
String ext = ".swf";
final String extension = ext;
FileFilter swfFilter = new FileFilter() {
@@ -390,7 +363,7 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe
}
};
fc.setFileFilter(swfFilter);
fc.setAcceptAllFileFilterUsed(true);
fc.setAcceptAllFileFilterUsed(true);
JFrame f = new JFrame();
View.setWindowIcon(f);
if (fc.showSaveDialog(f) == JFileChooser.APPROVE_OPTION) {
@@ -398,60 +371,60 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe
try {
Files.copy(new File(r.targetFile).toPath(), file.toPath(), REPLACE_EXISTING);
} catch (IOException ex) {
View.showMessageDialog(this, translate("error.save.as")+"\r\n"+ex.getLocalizedMessage(), AppStrings.translate("error"), JOptionPane.ERROR_MESSAGE);
View.showMessageDialog(this, translate("error.save.as") + "\r\n" + ex.getLocalizedMessage(), AppStrings.translate("error"), JOptionPane.ERROR_MESSAGE);
}
}
}else{
GuiAbortRetryIgnoreHandler handler=new GuiAbortRetryIgnoreHandler();
} else {
GuiAbortRetryIgnoreHandler handler = new GuiAbortRetryIgnoreHandler();
File exportDir = new File(selectExportDir());
for(int s:sel){
for (int s : sel) {
final Replacement r = reps.get(s);
String n=r.urlPattern;
if(n.contains("?")){
n = n.substring(0,n.indexOf("?"));
String n = r.urlPattern;
if (n.contains("?")) {
n = n.substring(0, n.indexOf('?'));
}
if(n.contains("/")){
n=n.substring(n.lastIndexOf("/"));
if (n.contains("/")) {
n = n.substring(n.lastIndexOf('/'));
}
n = Helper.makeFileName(n);
int c = 2;
String n2=n;
while(new File(exportDir,n2).exists()){
if(n.contains(".")){
n2 = n.substring(0,n.lastIndexOf("."))+c+n.substring(n.lastIndexOf("."));
String n2 = n;
while (new File(exportDir, n2).exists()) {
if (n.contains(".")) {
n2 = n.substring(0, n.lastIndexOf('.')) + c + n.substring(n.lastIndexOf('.'));
c++;
}else{
} else {
n2 = n + c + ".swf";
c++;
}
}
final File outfile = new File(exportDir,n2);
final File outfile = new File(exportDir, n2);
try {
new RetryTask(new RunnableIOEx() {
@Override
public void run() throws IOException {
Files.copy(new File(r.targetFile).toPath(), outfile.toPath(), REPLACE_EXISTING);
public void run() throws IOException {
Files.copy(new File(r.targetFile).toPath(), outfile.toPath(), REPLACE_EXISTING);
}
}, handler).run();
}, handler).run();
} catch (IOException ex) {
break;
}
}
}
break;
case ACTION_REPLACE:
if (sel.length>0) {
case ACTION_REPLACE:
if (sel.length > 0) {
Replacement r = reps.get(sel[0]);
JFileChooser fc = new JFileChooser();
fc.setCurrentDirectory(new File(Configuration.lastOpenDir.get()));
String n=r.urlPattern;
if(n.contains("?")){
n = n.substring(0,n.indexOf("?"));
String n = r.urlPattern;
if (n.contains("?")) {
n = n.substring(0, n.indexOf('?'));
}
if (n.contains("/")) {
n = n.substring(n.lastIndexOf('/'));
}
if(n.contains("/")){
n=n.substring(n.lastIndexOf("/"));
}
String ext = ".swf";
final String extension = ext;
FileFilter swfFilter = new FileFilter() {
@@ -466,48 +439,48 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe
}
};
fc.setFileFilter(swfFilter);
fc.setAcceptAllFileFilterUsed(true);
fc.setAcceptAllFileFilterUsed(true);
JFrame f = new JFrame();
View.setWindowIcon(f);
if (fc.showOpenDialog(f) == JFileChooser.APPROVE_OPTION) {
File file = Helper.fixDialogFile(fc.getSelectedFile());
try {
Files.copy(file.toPath(),new File(r.targetFile).toPath(), REPLACE_EXISTING);
Files.copy(file.toPath(), new File(r.targetFile).toPath(), REPLACE_EXISTING);
tableModel.fireTableCellUpdated(sel[0], 1/*size*/);
} catch (IOException ex) {
View.showMessageDialog(f, translate("error.replace")+"\r\n"+ex.getLocalizedMessage(), AppStrings.translate("error"), JOptionPane.ERROR_MESSAGE);
View.showMessageDialog(f, translate("error.replace") + "\r\n" + ex.getLocalizedMessage(), AppStrings.translate("error"), JOptionPane.ERROR_MESSAGE);
}
}
}
break;
case ACTION_COPYURL:
String copyText="";
for (int sc:sel) {
case ACTION_COPYURL:
String copyText = "";
for (int sc : sel) {
Replacement r = reps.get(sc);
if(!copyText.isEmpty()){
copyText += System.lineSeparator();
}
if (!copyText.isEmpty()) {
copyText += System.lineSeparator();
}
copyText += r.urlPattern;
}
if(!copyText.isEmpty()){
if (!copyText.isEmpty()) {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection stringSelection = new StringSelection(copyText);
clipboard.setContents(stringSelection, null);
}
break;
case ACTION_RENAME:
if (sel.length>0) {
if (sel.length > 0) {
Replacement r = reps.get(sel[0]);
String s = View.showInputDialog("URL", r.urlPattern);
if (s != null) {
r.urlPattern = s;
tableModel.setValueAt(s, sel[0], 2/*url*/);
tableModel.setValueAt(s, sel[0], 2/*url*/);
}
}
break;
case ACTION_CLEAR:
for (Replacement r:reps) {
for (Replacement r : reps) {
File f;
try {
f = (new File(Main.tempFile(r.targetFile)));
@@ -518,21 +491,21 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe
Logger.getLogger(ProxyFrame.class.getName()).log(Level.SEVERE, null, ex);
}
}
tableModel = new DefaultTableModel(0,3);
tableModel = new DefaultTableModel(0, 3);
replacementsTable.setModel(tableModel);
reps.clear();
break;
case ACTION_REMOVE:
Arrays.sort(sel);
for(int i=sel.length-1;i>=0;i--){
for (int i = sel.length - 1; i >= 0; i--) {
tableModel.removeRow(sel[i]);
Replacement r = reps.remove(sel[i]);
File f = (new File(r.targetFile));
if (f.exists()) {
f.delete();
}
}
}
}
break;
case ACTION_SWITCH_STATE:
Main.switchProxy();
@@ -659,8 +632,8 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe
byte[] result = null;
boolean cont = false;
for(Replacement r:reps){
if(r.matches(url)){
for (Replacement r : reps) {
if (r.matches(url)) {
cont = true;
break;
}
@@ -687,7 +660,7 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe
r.lastAccess = Calendar.getInstance();
reps.add(r);
tableModel.addRow(new Object[]{
r.lastAccess == null?"":format.format(r.lastAccess.getTime()),
r.lastAccess == null ? "" : format.format(r.lastAccess.getTime()),
new SizeItem(r.targetFile),
r.urlPattern
});
@@ -726,7 +699,7 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe
@Override
public void replaced(Replacement replacement, String url, String contentType) {
int index = reps.indexOf(replacement);
tableModel.setValueAt(replacement.lastAccess == null?"":format.format(replacement.lastAccess.getTime()), index, 0);
tableModel.setValueAt(replacement.lastAccess == null ? "" : format.format(replacement.lastAccess.getTime()), index, 0);
tableModel.setValueAt(new SizeItem(replacement.targetFile), index, 1);
tableModel.setValueAt(replacement.urlPattern, index, 2);
}
@@ -305,8 +305,8 @@ public class TagTreeModel implements TreeModel {
return null;
}
public TreeItem getFolderNode(SWF swf,String folderType) {
public TreeItem getFolderNode(SWF swf, String folderType) {
int childCount = getChildCount(swf);
for (int i = 0; i < childCount; i++) {
TreeItem child = getChild(swf, i);
@@ -320,48 +320,46 @@ public class TagTreeModel implements TreeModel {
return null;
}
private Frame searchForFrame(Object parent,SWF swf,Timelined t, int frame){
private Frame searchForFrame(Object parent, SWF swf, Timelined t, int frame) {
int childCount = getChildCount(parent);
Frame lastVisibleFrame = null;
for (int i = 0; i < childCount; i++) {
TreeItem child = getChild(parent, i);
if((child instanceof DefineSpriteTag)&& child==t){
Frame si=searchForFrame(child, swf, t,frame);
if(si!=null){
if ((child instanceof DefineSpriteTag) && child == t) {
Frame si = searchForFrame(child, swf, t, frame);
if (si != null) {
return si;
}
}
if(child instanceof Frame){
Frame f = (Frame)child;
if(f.frame<=frame){
if (child instanceof Frame) {
Frame f = (Frame) child;
if (f.frame <= frame) {
lastVisibleFrame = f;
}
}
if (child instanceof FolderItem) {
FolderItem folder = (FolderItem) child;
if (folder.getName().equals(FOLDER_FRAMES) && t==swf) {
Frame si=searchForFrame(folder, swf, t,frame);
if(si!=null){
if (folder.getName().equals(FOLDER_FRAMES) && t == swf) {
Frame si = searchForFrame(folder, swf, t, frame);
if (si != null) {
return si;
}
}
if(folder.getName().equals(FOLDER_SPRITES)){
Frame si=searchForFrame(folder, swf, t,frame);
if(si!=null){
if (folder.getName().equals(FOLDER_SPRITES)) {
Frame si = searchForFrame(folder, swf, t, frame);
if (si != null) {
return si;
}
}
}
}
}
return lastVisibleFrame;
}
public Frame getFrame(SWF swf,Timelined t, int frame) {
return searchForFrame(swf, swf, t,frame);
public Frame getFrame(SWF swf, Timelined t, int frame) {
return searchForFrame(swf, swf, t, frame);
}
private List<TreeItem> searchTag(TreeItem obj, TreeItem parent, List<TreeItem> path) {
List<TreeItem> ret = null;