blob: 0ed02dc049ef8216bdcb16c280cbfe613c325749 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
<meta name="copyright" content="Copyright (c) IBM Corporation and others 2002, 2006. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
<LINK REL="STYLESHEET" HREF="../../book.css" TYPE="text/css">
<title>FolderInfoPropertyPage Class After Editing</title>
</head>
<body bgcolor="#ffffff">
<h1>FolderInfoPropertyPage Class After Editing</h1>
<p>
<pre><samp>
package samples.ui.propertypages;
import org.eclipse.rse.files.ui.propertypages.SystemAbstractRemoteFilePropertyPageExtensionAction;
import org.eclipse.rse.services.clientserver.messages.SystemMessageException;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile;
import org.eclipse.rse.ui.SystemWidgetHelpers;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import samples.RSESamplesPlugin;
/**
* A sample property page for a remote object, which in this case is scoped via the
* extension point xml to only apply to folder objects.
*/
public class FolderInfoPropertyPage
extends SystemAbstractRemoteFilePropertyPageExtensionAction
implements SelectionListener
{
// gui widgets...
private Label sizeLabel, filesLabel, foldersLabel;
private Button stopButton;
// state...
private int totalSize = 0;
private int totalFolders = 0;
private int totalFiles = 0;
private boolean stopped = false;
private Thread workerThread;
private Runnable guiUpdater;
/**
* Constructor for FolderInfoPropertyPage.
*/
public FolderInfoPropertyPage()
{
super();
}
// --------------------------
// Parent method overrides...
// --------------------------
/* (non-Javadoc)
* @see org.eclipse.rse.files.ui.propertypages.SystemAbstractRemoteFilePropertyPageExtensionAction#createContentArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createContentArea(Composite parent)
{
Composite composite = SystemWidgetHelpers.createComposite(parent, 2);
// draw the gui
sizeLabel = SystemWidgetHelpers.createLabeledLabel(composite,
RSESamplesPlugin.getResourceString("pp.size.label"), //$NON-NLS-1$
RSESamplesPlugin.getResourceString("pp.size.tooltip"), //$NON-NLS-1$
false);
filesLabel = SystemWidgetHelpers.createLabeledLabel(composite,
RSESamplesPlugin.getResourceString("pp.files.label"), //$NON-NLS-1$
RSESamplesPlugin.getResourceString("pp.files.tooltip"), //$NON-NLS-1$
false);
foldersLabel = SystemWidgetHelpers.createLabeledLabel(composite,
RSESamplesPlugin.getResourceString("pp.folders.label"), //$NON-NLS-1$
RSESamplesPlugin.getResourceString("pp.folders.tooltip"), //$NON-NLS-1$
false);
stopButton = SystemWidgetHelpers.createPushButton(composite, null,
RSESamplesPlugin.getResourceString("pp.stopButton.label"), //$NON-NLS-1$
RSESamplesPlugin.getResourceString("pp.stopButton.tooltip") //$NON-NLS-1$
);
stopButton.addSelectionListener(this);
setValid(false); // Disable OK button until thread is done
// show "Processing..." message
setMessage(RSESamplesPlugin.getPluginMessage("RSSG1002")); //$NON-NLS-1$
// create instance of Runnable to allow asynchronous GUI updates from background thread
guiUpdater = new RunnableGUIClass();
// spawn a thread to calculate the information
workerThread = new RunnableClass(getRemoteFile());
workerThread.start();
return composite;
}
/**
* Intercept from PreferencePage. Called when user presses Cancel button.
* We stop the background thread.
* @see org.eclipse.jface.preference.PreferencePage#performCancel()
*/
public boolean performCancel()
{
killThread();
return true;
}
/**
* Intercept from DialogPage. Called when dialog going away.
* If the user presses the X to close this dialog, we
* need to stop that background thread.
*/
public void dispose()
{
killThread();
super.dispose();
}
/**
* Private method to kill our background thread.
* Control doesn't return until it ends.
*/
private void killThread()
{
if (!stopped && workerThread.isAlive())
{
stopped = true;
try {
workerThread.join(); // wait for thread to end
} catch (InterruptedException exc) {}
}
}
// -------------------------------------------
// Methods from SelectionListener interface...
// -------------------------------------------
/**
* From SelectionListener
* @see SelectionListener#widgetSelected(SelectionEvent)
*/
public void widgetSelected(SelectionEvent event)
{
if (event.getSource() == stopButton)
{
stopped = true;
stopButton.setEnabled(false);
}
}
/**
* From SelectionListener
* @see SelectionListener#widgetDefaultSelected(SelectionEvent)
*/
public void widgetDefaultSelected(SelectionEvent event)
{
}
// ----------------
// Inner classes...
// ----------------
/**
* Inner class encapsulating the background work to be done, so it may be executed
* in background thread.
*/
private class RunnableClass extends Thread
{
IRemoteFile inputFolder;
RunnableClass(IRemoteFile inputFolder)
{
this.inputFolder = inputFolder;
}
public void run()
{
if (stopped)
return;
walkFolder(inputFolder);
updateGUI();
if (!stopped)
{
stopped = true;
updateGUI();
}
}
/**
* Recursively walk a folder, updating the running tallies.
* Update the GUI after processing each subfolder.
*/
private void walkFolder(IRemoteFile currFolder)
{
try
{
IRemoteFile[] folders = currFolder.getParentRemoteFileSubSystem().listFoldersAndFiles( currFolder, null);
if ((folders != null) && (folders.length>0))
{
for (int idx=0; !stopped && (idx&lt;folders.length); idx++)
{
// is this a folder?
if (folders[idx].isDirectory())
{
++totalFolders;
walkFolder(folders[idx]);
updateGUI();
}
// is this a file?
else
{
++totalFiles;
totalSize += folders[idx].getLength();
}
}
}
}
catch (SystemMessageException e)
{
}
} // end of walkFolder method
} // end of inner class
/**
* Inner class encapsulating the GUI work to be done from the
* background thread.
*/
private class RunnableGUIClass implements Runnable
{
public void run()
{
if (stopButton.isDisposed())
return;
if (!stopped)
{
sizeLabel.setText(Integer.toString(totalSize));
filesLabel.setText(Integer.toString(totalFiles));
foldersLabel.setText(Integer.toString(totalFolders));
}
else if (stopped)
{
setValid(true); // re-enable OK button
stopButton.setEnabled(false); // disable Stop button
clearMessage(); // clear "Processing..." message
}
}
}
/**
* Update the GUI with the current status
*/
private void updateGUI()
{
Display.getDefault().asyncExec(guiUpdater);
}
}
</samp></pre>
</p>
</body>
</html>