⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 browsermdiframe.java

📁 Java Bytecode Editor 是一个 JAVA 的字节码反汇编和修改器。它可以很方便的修改已经编译成 Class 文件的 JAVA 文件。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:

	private void updateTitle() {

		if (workspaceFile == null) {
			setTitle(BrowserApplication.APPLICATION_TITLE);
			if (actionSaveWorkspaceAs != null) {
				actionSaveWorkspaceAs.setEnabled(false);
			}
		} else {
			setTitle(BrowserApplication.APPLICATION_TITLE + " ["
					+ workspaceFile.getName() + "]");
		}
	}

	private JToolBar buildToolbar() {

		JToolBar toolBar = new JToolBar();
		toolBar.add(actionOpenClassFile).setIcon(ICON_OPEN_CLASS_FILE_LARGE);
		//toolBar.add(actionBrowseClasspath).setIcon(ICON_BROWSE_CLASSPATH_LARGE);
		toolBar.addSeparator();
		// toolBar.add(actionOpenWorkspace).setIcon(ICON_OPEN_WORKSPACE_LARGE);
		// toolBar.add(actionSaveWorkspace).setIcon(ICON_SAVE_WORKSPACE_LARGE);
		// toolBar.addSeparator();
		toolBar.add(actionBackward).setIcon(ICON_BACKWARD_LARGE);
		toolBar.add(actionForward).setIcon(ICON_FORWARD_LARGE);
		toolBar.addSeparator();
		toolBar.add(actionReload).setIcon(ICON_RELOAD_LARGE);
		toolBar.addSeparator();
		toolBar.add(actionVerifyClass).setIcon(ICON_VERIFY_LARGE);
		toolBar.addSeparator();
		toolBar.add(actionRevertClass).setIcon(ICON_REVERT_LARGE);
		//toolBar.addSeparator();
		//toolBar.add(actionShowHomepage).setIcon(ICON_WEB_LARGE);

		toolBar.setFloatable(false);

		return toolBar;
	}

	private void repaintNow() {

		JComponent contentPane = (JComponent) getContentPane();
		contentPane.paintImmediately(0, 0, contentPane.getWidth(), contentPane
				.getHeight());
		JMenuBar menuBar = getJMenuBar();
		menuBar.paintImmediately(0, 0, menuBar.getWidth(), menuBar.getHeight());
	}

	private void loadSettings() {

		Preferences preferences = Preferences.userNodeForPackage(getClass());

		workspaceChooserPath = preferences.get(SETTINGS_WORKSPACE_CHOOSER_PATH,
				workspaceChooserPath);
		classesChooserPath = preferences.get(SETTINGS_CLASSES_CHOOSER_PATH,
				classesChooserPath);
		recentMenu.read(preferences);
	}

	private void saveSettings() {

		Preferences preferences = Preferences.userNodeForPackage(getClass());
		preferences.put(SETTINGS_WORKSPACE_CHOOSER_PATH, workspaceChooserPath);
		preferences.put(SETTINGS_CLASSES_CHOOSER_PATH, classesChooserPath);
		recentMenu.save(preferences);
	}
/*
	private void doSaveWorkspace(boolean saveAs) {

		config.setMDIConfig(createMDIConfig());
		if (workspaceFile != null && !saveAs) {
			saveWorkspaceToFile(workspaceFile);
			return;
		}

		JFileChooser fileChooser = getWorkspaceFileChooser();
		int result = fileChooser.showSaveDialog(this);
		if (result == JFileChooser.APPROVE_OPTION) {
			File selectedFile = fileChooser.getSelectedFile();
			if (!selectedFile.getName().toLowerCase().endsWith(
					"." + BrowserApplication.WORKSPACE_FILE_SUFFIX)) {
				selectedFile = new File(selectedFile.getPath() + "."
						+ BrowserApplication.WORKSPACE_FILE_SUFFIX);
			}
			if (selectedFile.exists()
					&& GUIHelper.showOptionDialog(this, "The file "
							+ selectedFile.getPath()
							+ "\nexists. Do you want to overwrite this file?",
							GUIHelper.YES_NO_OPTIONS,
							JOptionPane.QUESTION_MESSAGE) != 0) {
				return;
			}
			saveWorkspaceToFile(selectedFile);
			workspaceFile = selectedFile;
			updateTitle();
			workspaceChooserPath = fileChooser.getCurrentDirectory()
					.getAbsolutePath();
		}
	}
*/
	private void saveWorkspaceToFile(File file) {

		try {
			FileOutputStream fos = new FileOutputStream(file);
			XMLEncoder encoder = new XMLEncoder(fos);
			encoder.writeObject(config);
			encoder.close();
			recentMenu.addRecentWorkspace(file);
		} catch (FileNotFoundException e) {
			GUIHelper.showMessage(this, "An error occured while saving to "
					+ file.getPath(), JOptionPane.ERROR_MESSAGE);
		}
		GUIHelper.showMessage(this, "Workspace saved to " + file.getPath(),
				JOptionPane.INFORMATION_MESSAGE);
		actionSaveWorkspaceAs.setEnabled(true);
	}

	private void doNewWorkspace() {

		closeAllFrames();
		workspaceFile = null;
		config = new BrowserConfig();
		config.addRuntimeLib();
		if (classpathBrowser != null) {
			classpathBrowser.setClasspathComponent(config);
		}
		updateTitle();
	}

	/**
	 * Open a workspace file.
	 * 
	 * @param file
	 *            the file.
	 */
	public void openWorkspace(File file) {

		repaintNow();
		setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
		closeAllFrames();
		try {
			FileInputStream fos = new FileInputStream(file);
			XMLDecoder decoder = new XMLDecoder(fos);
			config = (BrowserConfig) decoder.readObject();
			readMDIConfig(config.getMDIConfig());
			decoder.close();
			recentMenu.addRecentWorkspace(file);
			if (classpathBrowser != null) {
				classpathBrowser.setClasspathComponent(config);
			}
		} catch (FileNotFoundException e) {
			GUIHelper.showMessage(this, "An error occured while reading "
					+ file.getPath(), JOptionPane.ERROR_MESSAGE);
		} finally {
			setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		}
		workspaceFile = file;
		updateTitle();
		actionSaveWorkspaceAs.setEnabled(true);
	}

	/*
	private void doOpenWorkspace() {

		JFileChooser fileChooser = getWorkspaceFileChooser();
		int result = fileChooser.showOpenDialog(this);
		if (result == JFileChooser.APPROVE_OPTION) {
			File selectedFile = fileChooser.getSelectedFile();
			openWorkspace(selectedFile);
			workspaceChooserPath = fileChooser.getCurrentDirectory()
					.getAbsolutePath();
		}
	}
*/
	private void doOpenClassFile() {

		JFileChooser fileChooser = getClassesFileChooser();
		int result = fileChooser.showOpenDialog(this);
		if (result == JFileChooser.APPROVE_OPTION) {
			repaintNow();
			setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
			File file = fileChooser.getSelectedFile();
			classesChooserPath = fileChooser.getCurrentDirectory()
					.getAbsolutePath();

			BrowserInternalFrame frame;
			if (file.getPath().toLowerCase().endsWith(".class")) {
				frame = openClassFromFile(file);
			} else {
				frame = openClassFromJar(file);
			}

			if (frame != null) {
				try {
					frame.setMaximum(true);
				} catch (PropertyVetoException ex) {
				}
			}
			setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		}
	}

	private BrowserInternalFrame openClassFromJar(File file) {

		ClasspathArchiveEntry entry = new ClasspathArchiveEntry();
		entry.setFileName(file.getPath());
		if (jarBrowser == null) {
			jarBrowser = new ClasspathBrowser(this, null,
					"Classes in selected JAR file:", false);
		}
		jarBrowser.clear();
		jarBrowser.setClasspathComponent(entry);
		jarBrowser.setVisible(true);
		String selectedClassName = jarBrowser.getSelectedClassName();
		if (selectedClassName == null) {
			return null;
		}

		String fileName = file.getPath() + "!" + selectedClassName + ".class";

		BrowserInternalFrame frame = new BrowserInternalFrame(desktopManager,
				new WindowState(fileName));
		ClassFile classFile = frame.getClassFile();
		if (classFile != null) {
			config.addClasspathArchive(file.getPath());
		}

		return frame;
	}

	private void doBrowseClasspath() {

		if (classpathBrowser == null) {
			classpathBrowser = new ClasspathBrowser(this, config,
					"Configured classpath:", true);
		}
		classpathBrowser.setVisible(true);
		String selectedClassName = classpathBrowser.getSelectedClassName();
		if (selectedClassName == null) {
			return;
		}

		FindResult findResult = config.findClass(selectedClassName);
		if (findResult == null) {
			GUIHelper.showMessage(this, "Error loading " + selectedClassName,
					JOptionPane.ERROR_MESSAGE);
			return;
		}

		repaintNow();
		setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
		BrowserInternalFrame frame = new BrowserInternalFrame(desktopManager,
				new WindowState(findResult.getFileName()));
		try {
			frame.setMaximum(true);
		} catch (PropertyVetoException ex) {
		}
		setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));

	}

	private void doSetupClasspath() {
		if (classpathSetupDialog == null) {
			classpathSetupDialog = new ClasspathSetupDialog(this);

		}
		classpathSetupDialog.setVisible(true);
	}

	private void doBackward() {
		BrowserInternalFrame frame = (BrowserInternalFrame) desktopPane
				.getSelectedFrame();
		if (frame != null) {
			frame.getBrowserComponent().getHistory().historyBackward();
		}
	}

	private void doForward() {
		BrowserInternalFrame frame = (BrowserInternalFrame) desktopPane
				.getSelectedFrame();
		if (frame != null) {
			frame.getBrowserComponent().getHistory().historyForward();
		}
	}

	/*
	 * Public, since it is called after modifying the calss file
	 */
	public void doReload() {
		BrowserInternalFrame frame = (BrowserInternalFrame) desktopPane
				.getSelectedFrame();
		if (frame != null) {
			TreePath selectionPath = frame.getBrowserComponent().getTreePane()
					.getTree().getSelectionPath();
			try {
				BrowserTreeNode categoryNode2 = (BrowserTreeNode) selectionPath
						.getPathComponent(2);
				String categoryName = categoryNode2.getUserObject().toString();
				frame.reload(categoryName);

			} catch (Exception e) {
				try {
					BrowserTreeNode categoryNode2 = (BrowserTreeNode) selectionPath
							.getPathComponent(1);
					String categoryName = categoryNode2.getUserObject()
							.toString();
					frame.reload(categoryName);
				} catch (Exception e2) {
					frame.reload("");
				}
			}

		}
	}

	private void doVerify() {
		BrowserInternalFrame frame = (BrowserInternalFrame) desktopPane
				.getSelectedFrame();

		String fileName = frame.getFileName();
		VerifierDisplay vd = new VerifierDisplay(this, fileName);

		vd.setVisible(true);
	}

	/*
	private JFileChooser getWorkspaceFileChooser() {

		if (workspaceFileChooser == null) {
			workspaceFileChooser = new JFileChooser(workspaceChooserPath);
			workspaceFileChooser.setDialogTitle("Choose workspace file");
			workspaceFileChooser.setFileFilter(new BasicFileFilter(
					BrowserApplication.WORKSPACE_FILE_SUFFIX,
					"jclasslib workspace files"));
		}

		return workspaceFileChooser;
	}*/

	private JFileChooser getClassesFileChooser() {

		if (classesFileChooser == null) {
			classesFileChooser = new JFileChooser(classesChooserPath);
			classesFileChooser.setDialogTitle("Choose class file or jar file");
			classesFileChooser.addChoosableFileFilter(new BasicFileFilter(
					"class", "class files"));
			classesFileChooser.addChoosableFileFilter(new BasicFileFilter(
					"jar", "jar files"));
			classesFileChooser.setFileFilter(new BasicFileFilter(new String[] {
					"class", "jar" }, "class files and jar files"));
		}

		return classesFileChooser;
	}

	private void doShowURL(String urlSpec) {

		String commandLine;
		if (System.getProperty("os.name").startsWith("Windows")) {
			commandLine = "rundll32.exe url.dll,FileProtocolHandler " + urlSpec;
		} else {
			commandLine = "netscape " + urlSpec;
		}
		try {
			Runtime.getRuntime().exec(commandLine);
		} catch (IOException ex) {
		}
	}
	
	void removeTempFiles() {
		for (String fileName: tempFiles) {
			new File(fileName).delete();
		}
		
	}

	private void doAbout() {
		new BrowserAboutDialog(this).setVisible(true);
	}

	private class DefaultAction extends AbstractAction {

		private DefaultAction(String name, Icon icon) {
			super(name, icon);
		}

		public void actionPerformed(ActionEvent ev) {

			if (this == actionOpenClassFile) {
				doOpenClassFile();
			} else if (this == actionBrowseClasspath) {
				doBrowseClasspath();
			} else if (this == actionSetupClasspath) {
				doSetupClasspath();
			} else if (this == actionNewWorkspace) {
				doNewWorkspace();
			} else if (this == actionQuit) {

				doQuit();
			} else if (this == actionBackward) {
				doBackward();
			} else if (this == actionForward) {
				doForward();
			} else if (this == actionReload) {
				doReload();
			} else if (this == actionShowHomepage) {
				doShowURL("http://www.cs.ioc.ee/~ando/jbe/");
			} else if (this == actionShowHelp) {
				try {
					doShowURL(new File("doc/help.html").getCanonicalFile()
							.toURL().toExternalForm());
				} catch (IOException e) {
				}
			} else if (this == actionAbout) {
				doAbout();
			} else if (this == actionVerifyClass) {
				doVerify();
			}else if (this == actionRevertClass) {
				BrowserInternalFrame frame = (BrowserInternalFrame) desktopPane
				.getSelectedFrame();
				try {
					FileUtils.copy(new File(frame.getBackupFile()), new File(frame.getFileName()));
					doReload();
				} catch (IOException e) {
					e.printStackTrace();
				}
				
			}
		}

	}

	public class UndoAction extends AbstractAction {
		UndoAction(String name, Icon icon) {
			super(name, icon);
		}

		public void actionPerformed(ActionEvent arg0) {
			BrowserInternalFrame frame = (BrowserInternalFrame) desktopPane
					.getSelectedFrame();
			CodeEditPane cep = frame.getBrowserComponent().getDetailPane()
					.getAttributeDetailPane().getCodeAttributeDetailPane()
					.getCodeEditPane();
			TreePath treePath = frame.getBrowserComponent().getTreePane()
					.getTree().getSelectionPath();
			String methodIndex = Integer.toString(((BrowserTreeNode) treePath
					.getParentPath().getLastPathComponent()).getIndex());
			((CodeEditArea) cep.getEditPanes().get(methodIndex)).doUndo();

		}

	}

	public class RedoAction extends AbstractAction {
		RedoAction(String name, Icon icon) {
			super(name, icon);
		}

		public void actionPerformed(ActionEvent arg0) {
			BrowserInternalFrame frame = (BrowserInternalFrame) desktopPane
					.getSelectedFrame();
			CodeEditPane cep = frame.getBrowserComponent().getDetailPane()
					.getAttributeDetailPane().getCodeAttributeDetailPane()
					.getCodeEditPane();
			TreePath treePath = frame.getBrowserComponent().getTreePane()
					.getTree().getSelectionPath();
			String methodIndex = Integer.toString(((BrowserTreeNode) treePath
					.getParentPath().getLastPathComponent()).getIndex());
			((CodeEditArea) cep.getEditPanes().get(methodIndex)).doRedo();

		}

	}

	public Action getActionVerify() {
		return actionVerifyClass;
	}

	public Action getActionRevert() {
		return actionRevertClass;
	}

	public void addTempFile(String backupFile) {
		tempFiles.add(backupFile);
		
	}


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -