/* * AppleCommander - An Apple ][ image utility. * Copyright (C) 2002 by Robert Greene * robgreene at users.sourceforge.net * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.webcodepro.applecommander.ui.swt; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import com.webcodepro.applecommander.storage.FormattedDisk; import com.webcodepro.applecommander.storage.FormattedDisk.DiskUsage; import com.webcodepro.applecommander.ui.UiBundle; import com.webcodepro.applecommander.util.TextBundle; /** * Build the Disk Map tab for the Disk Window. *
* Date created: Nov 17, 2002 9:27:44 PM
* @author Rob Greene
*/
public class DiskMapTab {
private FormattedDisk disk;
private TextBundle textBundle = UiBundle.getInstance();
// used locally - not shared between windows; hopefully will
// not be a resource drain!
private Color freeFill;
private Color usedFill;
private Color black;
private Color gray;
/**
* Construct the DiskMapTab.
*/
public DiskMapTab(CTabFolder tabFolder, FormattedDisk disk) {
this.disk = disk;
// these items are reused; need to dispose of them when done!
freeFill = new Color(tabFolder.getDisplay(), 100,200,100);
usedFill = new Color(tabFolder.getDisplay(), 200,100,100);
black = new Color(tabFolder.getDisplay(), 0,0,0);
gray = new Color(tabFolder.getDisplay(), 50,50,50);
createDiskMapTab(tabFolder);
}
/**
* Create the DISK MAP tab.
*/
protected void createDiskMapTab(CTabFolder tabFolder) {
CTabItem item = new CTabItem(tabFolder, SWT.NULL);
if (disk.getLogicalDiskNumber() > 0) {
item.setText(textBundle.get("DiskMapTab.MultipleTabsTitle") + disk.getLogicalDiskNumber()); //$NON-NLS-1$
} else {
item.setText(textBundle.get("DiskMapTab.SingleTabTitle")); //$NON-NLS-1$
}
Canvas canvas = new Canvas(tabFolder, SWT.NULL);
GridLayout grid = new GridLayout(2, false);
canvas.setLayout(grid);
item.setControl(canvas);
String[] labels = disk.getBitmapLabels();
// ROW #1 - title
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan = 2;
data.heightHint = 20;
Label title = new Label(canvas, SWT.LEFT);
StringBuffer buf = new StringBuffer();
if (labels.length == 1) {
buf.append(textBundle.format("DiskMapTab.BlockDecriptiveLabel", //$NON-NLS-1$
labels[0].toLowerCase()));
} else {
buf.append(textBundle.format("DiskMapTab.TrackAndSectorDecriptiveLabel", //$NON-NLS-1$
new Object[] {
labels[0].toLowerCase(),
labels[1].toLowerCase() }));
}
title.setText(buf.toString());
title.setLayoutData(data);
// ROW #2 - blank and horizontal ruler
data = new GridData();
data.heightHint = 20;
data.widthHint = 20;
Composite blank = new Composite(canvas, SWT.NULL);
blank.setLayoutData(data);
data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
data.heightHint = 20;
Canvas ruler = new Canvas(canvas, SWT.NULL);
ruler.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent event) {
paintHorizontalRuler(event);
}
});
ruler.setLayoutData(data);
// ROW #3 - vertical ruler and map
data = new GridData(GridData.VERTICAL_ALIGN_FILL);
data.widthHint = 20;
ruler = new Canvas(canvas, SWT.NULL);
ruler.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent event) {
paintVerticalRuler(event);
}
});
ruler.setLayoutData(data);
data = new GridData(GridData.FILL_BOTH);
data.grabExcessHorizontalSpace = true;
data.grabExcessVerticalSpace = true;
Canvas map = new Canvas(canvas, SWT.BORDER);
map.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent event) {
paintMap(event);
}
});
map.setLayoutData(data);
// ROW #5
data = new GridData(GridData.FILL_HORIZONTAL);
data.heightHint = 20;
data.horizontalSpan = 2;
Canvas legend = new Canvas(canvas, SWT.NULL);
legend.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent event) {
paintLegend(event);
}
});
legend.setLayoutData(data);
}
/**
* Dispose of resources.
*/
public void dispose() {
freeFill.dispose();
usedFill.dispose();
black.dispose();
gray.dispose();
}
/**
* Handle paint requests for horizontal ruler.
*/
protected void paintHorizontalRuler(PaintEvent event) {
// FIXME - not i18n safe!!
String label = (disk.getBitmapLabels()[0] + "s").toUpperCase(); //$NON-NLS-1$
Canvas canvas = (Canvas) event.widget;
Rectangle area = canvas.getClientArea();
event.gc.drawLine(area.x, area.y + area.height/2, area.x + area.width, area.y + area.height/2);
Point size = event.gc.textExtent(label);
event.gc.drawString(label, area.x + area.width/2 - size.x, area.y + area.height/2 - size.y/2);
}
/**
* Handle paint requests for vertical ruler.
*/
protected void paintVerticalRuler(PaintEvent event) {
// FIXME - not i18n safe!!
String label = (disk.getBitmapLabels()[0] + "s").toUpperCase(); //$NON-NLS-1$
if (disk.getBitmapLabels().length == 2) {
label = (disk.getBitmapLabels()[1] + "s").toUpperCase(); //$NON-NLS-1$
}
StringBuffer buf = new StringBuffer();
for (int i=0; i