/* Copyright 2004-2014 Jim Voris * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.qumasoft.guitools.qwin.operation; import com.qumasoft.guitools.qwin.AbstractFileTableModel; import com.qumasoft.guitools.qwin.ProjectTreeControl; import com.qumasoft.guitools.qwin.QWinFrame; import com.qumasoft.guitools.qwin.QWinUtility; import com.qumasoft.qvcslib.MergedInfoInterface; import com.qumasoft.qvcslib.TimerManager; import com.qumasoft.qvcslib.UserLocationProperties; import com.qumasoft.qvcslib.Utility; import java.awt.Rectangle; import java.util.List; import java.util.TimerTask; import java.util.logging.Level; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.tree.DefaultMutableTreeNode; /** * Show in containing directory operation. * @author Jim Voris */ public class OperationShowInContainingDirectory extends OperationBaseClass { /** * Create a show in containing directory operation. * @param fileTable the file table. * @param serverName the server name. * @param projectName the project name. * @param viewName the view name. * @param userLocationProperties user location properties. */ public OperationShowInContainingDirectory(JTable fileTable, final String serverName, final String projectName, final String viewName, UserLocationProperties userLocationProperties) { super(fileTable, serverName, projectName, viewName, userLocationProperties); } @Override public void executeOperation() { if (getFileTable() != null) { if (getFileTable().getSelectedRowCount() == 1) { try { // Get the selected files... List mergedInfoArray = getSelectedFiles(); MergedInfoInterface mergedInfo = (MergedInfoInterface) mergedInfoArray.get(0); showContainingDirectory(mergedInfo); } catch (Exception e) { QWinUtility.logProblem(Level.WARNING, "OperationShowInContainingDirectory caught exception: " + e.getClass().toString() + " " + e.getLocalizedMessage()); QWinUtility.logProblem(Level.WARNING, Utility.expandStackTraceToString(e)); } } } } private void showContainingDirectory(final MergedInfoInterface mergedInfo) { // Put this on the swing thread. Runnable worker = new Runnable() { @Override public void run() { try { // Navigate to the containing directory... final String appendedPath = mergedInfo.getArchiveDirManager().getAppendedPath(); final String projectName = mergedInfo.getArchiveDirManager().getProjectName(); final String serverName = QWinFrame.getQWinFrame().getServerName(); final String viewName = mergedInfo.getArchiveDirManager().getViewName(); DefaultMutableTreeNode directoryNode = QWinFrame.getQWinFrame().getTreeModel().findContainingDirectoryTreeNode(serverName, projectName, viewName, appendedPath); ProjectTreeControl.getInstance().selectNode(directoryNode); QWinFrame.getQWinFrame().getRightFilePane().getModel().fireTableDataChanged(); // And re-select the file that had been selected. We have // to delay the work here so that it occurs after the delayed // refresh... so we queue this to run after the refresh should // have happened. TimerTask notifyTask = new TimerTask() { @Override public void run() { // Run this on the swing thread. Runnable swingTask = new Runnable() { @Override public void run() { try { // And select the item in the file list. AbstractFileTableModel abstractFileTableModel = QWinFrame.getQWinFrame().getRightFilePane().getModel(); int rowCount = abstractFileTableModel.getRowCount(); int fileIndex = 0; for (int i = 0; i < rowCount; i++) { MergedInfoInterface rowMergedInfo = abstractFileTableModel.getMergedInfo(i); if ((0 == rowMergedInfo.getShortWorkfileName().compareTo(mergedInfo.getShortWorkfileName())) && (0 == rowMergedInfo.getArchiveDirManager().getAppendedPath().compareTo(mergedInfo.getArchiveDirManager() .getAppendedPath()))) { fileIndex = i; break; } } QWinFrame.getQWinFrame().getFileTable().getSelectionModel().setSelectionInterval(fileIndex, fileIndex); // Now we need to make sure the file is actually visible... JTable fileTable = QWinFrame.getQWinFrame().getFileTable(); Rectangle visibleRectangle = fileTable.getVisibleRect(); Rectangle selectedRectangle = fileTable.getCellRect(fileIndex, 0, true); // Test to see if the selected file is visible. if ((selectedRectangle.y > (visibleRectangle.y + visibleRectangle.height)) || (selectedRectangle.y < visibleRectangle.y)) { int centerY = visibleRectangle.y + visibleRectangle.height / 2; if (centerY < selectedRectangle.y) { // Need to scroll up selectedRectangle.y = selectedRectangle.y - visibleRectangle.y + centerY; } else { // Need to scroll down selectedRectangle.y = selectedRectangle.y + visibleRectangle.y - centerY; } fileTable.scrollRectToVisible(selectedRectangle); } } catch (Exception e) { QWinUtility.logProblem(Level.WARNING, "OperationShowInContainingDirectory timer task caught exception: " + e.getClass().toString() + " " + e.getLocalizedMessage()); QWinUtility.logProblem(Level.WARNING, Utility.expandStackTraceToString(e)); } } }; SwingUtilities.invokeLater(swingTask); } }; TimerManager.getInstance().getTimer().schedule(notifyTask, QWinFrame.REFRESH_DELAY + QWinFrame.REFRESH_DELAY / 2); } catch (Exception e) { QWinUtility.logProblem(Level.WARNING, "OperationShowInContainingDirectory worker caught exception: " + e.getClass().toString() + " " + e.getLocalizedMessage()); QWinUtility.logProblem(Level.WARNING, Utility.expandStackTraceToString(e)); } } }; // Put all this on the swing thread. SwingUtilities.invokeLater(worker); } }