Home » Eclipse Projects » Standard Widget Toolkit (SWT) » [SOLVED] Setting images of different widths to TableItem(Images inside a TableItem are scaled to equal dimensions)
[SOLVED] Setting images of different widths to TableItem [message #634782] |
Sat, 23 October 2010 14:02 |
Albert Pikus Messages: 70 Registered: October 2009 |
Member |
|
|
Hi,
I wonder if it is possible to set images of different widths to a TableItem.
I have a Table that has two columns; TableItems of the first column should host images 50 pixels wide, while the items of the second one should host images 16 pixels wide. But once the first image is set, all the other images are scaled to have the same width as the first one and thus appear malformed.
Javadoc on TableItem doesn't mention this problem, but I have found an article ( http://book.javanb.com/swt-the-standard-widget-toolkit/ch09l ev1sec2.html) stating "The First Image Defines the Size of All Images in the Control".
Is there any workaround for this limitation to be bypassed, or is setting images of different widths to TableItem entirely impossible?
Thank you for your answers, best regards,
Albert
[Updated on: Thu, 04 November 2010 08:37] Report message to a moderator
|
|
| |
Re: Setting images of different widths to TableItem [message #635041 is a reply to message #634783] |
Mon, 25 October 2010 13:58 |
Grant Gayed Messages: 2150 Registered: July 2009 |
Senior Member |
|
|
For info on owner draw see
http://www.eclipse.org/articles/article.php?file=Article-Cus tomDrawingTableAndTreeItems/index.html .
In the absence of using owner draw, "The First Image Defines the Size of All
Images in the Control" is correct, due to native platform behaviour.
Grant
"Tom Schindl" <tom.schindl@bestsolution.at> wrote in message
news:i9urqv$727$1@news.eclipse.org...
> you need to use owner draw.
>
> tom
>
> Am 23.10.10 16:02, schrieb Albert:
>> Hi,
>>
>> I wonder if it is possible to set images of different widths to a
>> TableItem.
>>
>> I have a Table that has two columns; TableItems of the first column
>> should host images 50 pixels wide, while the items of the second one
>> should host images 16 pixels wide. But once the first image is set, all
>> the other images are scaled to have the same width as the first one and
>> thus appear malformed.
>>
>> Javadoc on TableItem doesn't mention this problem, but I have found an
>> article
>> ( http://book.javanb.com/swt-the-standard-widget-toolkit/ch09l ev1sec2.html)
>> stating "The First Image Defines the Size of All Images in the Control".
>>
>> Is there any workaround for this limitation to be bypassed, or is
>> setting images of different widths to TableItem entirely impossible?
>>
>>
>> Thank you for your answers, best regards,
>>
>> Albert
>>
>
|
|
|
Re: Setting images of different widths to TableItem [message #636166 is a reply to message #635041] |
Fri, 29 October 2010 14:05 |
Albert Pikus Messages: 70 Registered: October 2009 |
Member |
|
|
Thank you both for your answers, I'll take a look at owner draw.
Best regards,
Albert
Grant Gayed wrote on Mon, 25 October 2010 09:58 | For info on owner draw see
http://www.eclipse.org/articles/article.php?file=Article-Cus tomDrawingTableAndTreeItems/index.html .
In the absence of using owner draw, "The First Image Defines the Size of All
Images in the Control" is correct, due to native platform behaviour.
Grant
"Tom Schindl" <tom.schindl@bestsolution.at> wrote in message
news:i9urqv$727$1@news.eclipse.org...
> you need to use owner draw.
>
> tom
>
> Am 23.10.10 16:02, schrieb Albert:
>> Hi,
>>
>> I wonder if it is possible to set images of different widths to a
>> TableItem.
>>
>> I have a Table that has two columns; TableItems of the first column
>> should host images 50 pixels wide, while the items of the second one
>> should host images 16 pixels wide. But once the first image is set, all
>> the other images are scaled to have the same width as the first one and
>> thus appear malformed.
>>
>> Javadoc on TableItem doesn't mention this problem, but I have found an
>> article
>> ( http://book.javanb.com/swt-the-standard-widget-toolkit/ch09l ev1sec2.html)
>> stating "The First Image Defines the Size of All Images in the Control".
>>
>> Is there any workaround for this limitation to be bypassed, or is
>> setting images of different widths to TableItem entirely impossible?
>>
>>
>> Thank you for your answers, best regards,
>>
>> Albert
>>
>
|
|
|
|
Re: Setting images of different widths to TableItem [message #636718 is a reply to message #634782] |
Tue, 02 November 2010 14:37 |
Albert Pikus Messages: 70 Registered: October 2009 |
Member |
|
|
Hi,
I managed to retain proper image widths using PaintItem event, but this results in strange behavior inside a listener listening for SWT.MouseDown events.
Namely, I would like to achieve the following:
I have a table with four columns and I want the first column to have images 48 px wide. Second column doesn't have images and the third and fourth column have images of size 10 x 10 px that should change when a cell in third or fourth column is clicked (I want to simulate checkbox with an image, because of a poor performance of TableEditor).
But now, when a cell in the third or fourth column is clicked, I get the second image next to the old one. Inside my MouseListener, before the cell is clicked, TableItem.getImage(atColumnIndex) returns null, although the image is there, set by using PaintItem.
Besides, I'm getting data into the table from an external source and I don't know how to use PaintItem in order to set correct image inside the third and fourth column depending on a boolean value.
Any help would be appreciated,
Albert
[Updated on: Tue, 02 November 2010 15:07] Report message to a moderator
|
|
|
Re: Setting images of different widths to TableItem [message #636741 is a reply to message #636718] |
Tue, 02 November 2010 15:59 |
Grant Gayed Messages: 2150 Registered: July 2009 |
Senior Member |
|
|
If you're painting the item contents then you shouldn't need to
get/setImage() on any items since you're drawing them. Is it possible that
you're initially doing this properly, but then when a third/fourth-column
cell is clicked you're setting the image into the item and then drawing a
second one beside it? It's difficult to make a better guess than this
without seeing any of your code, or ideally a runnable snippet with template
http://www.eclipse.org/swt/faq.php#whatisasnippet .
Grant
"Albert" <albert.pikus@gmail.com> wrote in message
news:iap7hb$8he$1@news.eclipse.org...
> Hi,
>
> I managed to retain proper image widths using PaintItem event, but this
> results in strange behavior inside a listener listening for SWT.MouseDown
> events.
>
> Namely, I would like to achieve the following:
>
> I have a table with four columns and I wish that first column has 48 px
> wide images. Second column doesn't have images and the third and fourth
> column have images of size 10 x 10 px that should change when a cell in
> third or fourth column is clicked (I want to simulate checkbox with an
> image, because of a poor performance of TableEditor).
>
> But now, when cells in the third or fourth columns are clicked, I get the
> second image next to the old one. Inside my MouseListener, before the cell
> is clicked, TableItem.getImage(i) returns null, although the image is
> there, set by using PaintItem.
>
> Besides, I'm getting data into the table from an external source and I
> don't know how to use PaintItem in order to set correct image inside the
> third and fourth column depending on what boolean value data has.
>
>
> Any help would be appreciated,
>
> Albert
>
|
|
|
Re: Setting images of different widths to TableItem [message #636875 is a reply to message #636741] |
Wed, 03 November 2010 08:26 |
Albert Pikus Messages: 70 Registered: October 2009 |
Member |
|
|
Hi,
to simplify things, suppose I have a Table with two columns, the first one with images 48 px wide and the second one with images 10 px wide, representing boolean state. Images inside the second column change when cells from a second column are clicked, while the images from the first column don't change.
The first problem with using PaintEvent is filling the Table: how can I fill the second column with correct images (according to some boolean value that each object (represented as TableItem) has) when painting them? If I don't paint them, this is simple to achieve, since I'm using TableItem.setImage(atColumnIndex) when creating TableItems.
The second problem is changing images inside second column on MouseDown event (simulating check box behavior). How can I set appropriate image when a cell inside the second column is clicked if images were painted and I can't use TableItem.setImage(atColumnIndex)?
Here is the snippet that demonstrates what I want to achieve, without using PaintEvent. But this of course results in the second column images to be stretched to 48 px, which is the whole problem:
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
public class DetectClickedCell
{
public static void main(String[] args)
{
final Display display = new Display();
Shell shell = new Shell(display);
final Table table = new Table(shell, SWT.BORDER | SWT.V_SCROLL | SWT.FULL_SELECTION| SWT.MULTI);
table.setHeaderVisible(true);
table.setLinesVisible(true);
final int rowCount = 64, columnCount = 2;
final int FIRST_IMAGE_WIDTH = 48;
final int CHECK_WIDTH = 10;
// Default image for first table column, dimensions 48 x 10 px
final Image firstImage = getImage(display, 0xFF0000, FIRST_IMAGE_WIDTH);
// Image representing checked item state, dimensions 10 x 10 px, second column
final Image checked = getImage(display, 0xFF, CHECK_WIDTH);
// Image representing unchecked item state, dimensions 10 x 10 px, second column
final Image unChecked = getImage(display, 0xFF00, CHECK_WIDTH);
Image images[] = {checked, unChecked};
for (int i = 0; i < columnCount; i++)
{
TableColumn column = new TableColumn(table, SWT.NONE);
column.setText("Column " + i);
}
for (int i = 0; i < rowCount; i++)
{
TableItem item = new TableItem(table, SWT.NONE);
for (int j = 0; j < columnCount; j++)
{
if (j == 0)
{
item.setText(j, "Item " + i + "-" + j);
// Comment the following line in order to display
// second column images with correct width
item.setImage(j, firstImage);
}
else
{
int state = (int)Math.round(Math.random());
item.setImage(j, images[state]);
int[] data = {state};
item.setData(data);
}
}
}
for (int i = 0; i < columnCount; i++)
{
table.getColumn(i).pack();
}
Point size = table.computeSize(SWT.DEFAULT, 200);
table.setSize(size);
shell.pack();
table.addListener(SWT.MouseDown, new Listener()
{
public void handleEvent(Event event)
{
Rectangle clientArea = table.getClientArea();
Point pt = new Point(event.x, event.y);
int index = table.getTopIndex();
while (index < table.getItemCount())
{
boolean visible = false;
TableItem item = table.getItem(index);
for (int i = 0; i < columnCount; i++)
{
Rectangle itemRectangle = item.getBounds(i);
if (itemRectangle != null && itemRectangle.contains(pt))
{
int[] oldData = (int[]) item.getData();
int[] newData = new int[1];
if (i == columnCount - 1)
{
// If a cell inside the last column is clicked,
// change image on click
if (oldData[0] == 1)
{
item.setImage(i, checked);
newData[0] = 0;
}
else
{
item.setImage(i, unChecked);
newData[0] = 1;
}
}
item.setData(newData);
}
if (!visible && itemRectangle.intersects(clientArea))
{
visible = true;
}
}
if (!visible)
{
return;
}
index++;
}
}
});
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}
public static Image getImage(Display display, int color, int width)
{
PaletteData palette = new PaletteData(0xFF , 0xFF00 , 0xFF0000);
ImageData imageData = new ImageData(width, 10, 24, palette);
for (int x = 0; x < width; x++)
{
for (int y = 0; y < 10; y++)
{
imageData.setPixel(x, y, color);
}
}
return new Image(display,imageData);
}
}
Best regards,
Albert
[Updated on: Wed, 03 November 2010 08:49] Report message to a moderator
|
|
| | | |
Goto Forum:
Current Time: Thu Sep 26 01:29:07 GMT 2024
Powered by FUDForum. Page generated in 0.04791 seconds
|