NSTableView align resize columns - macos

I need to create a NSTableView with 3 columns and these columns have to fit the space like this form 20% 60% 20%. I set the constraints in the interface builder but no success. The result is always the same. The 3 columns are shown but in the same size as in the IB, and if i resize the window the table resizes too but the columns keep with the original size.
How can i resize the columns proportionally to tableview size?
How can i align one column always to the right?
Need help please. My project is for OS X, not iPhone.
Thanks in advance.

I'm not sure what constraints you tried to set, but table columns are not views, so they don't participate in auto layout.
There's no automatic support for what you're trying to achieve. NSTableView can be set to distribute a change of width equally among its columns (setting columnAutoresizingStyle to NSTableViewUniformColumnAutoresizingStyle), but that doesn't maintain the proportions like you want.
I think you want to set the table view so that it doesn't resize its columns. Then you would monitor it for any changes in its frame and adjust the column widths yourself.
You can set the column autoresizing style of the table view in IB.
To monitor the frame, you can either use a subclass of NSTableView and override -setFrameSize: or you can have some controller observe the NSViewFrameDidChangeNotification notification from the table view. Either way, you'd want to calculate 20% and 60% of the width. You probably want to round or truncate to an integer. Also, you should use percentages only for two of the three columns. For the third, subtract the width you computed for the first two from the table view's width. That's the easiest way to be sure they all add up.
For each column, check if the width you calculated is different from its current width and, if so, set its width.

Related

Tableau cannot horizontally scroll in worksheets

I am using Tableau for data visualization and generating lists that can be exported to Excel.
However, when the amount of columns get too big, I cannot see all my columns in the view (They are there though). The problem is that there doesn't seem to be a horizontal scrollbar. I can scroll vertically through my rows, but I haven't found a way to do this horizontally to look through my columns, the same way you would do at the data source tab.
If anyone could help me to figure out how to achieve this that would be awesome! I am using Tableau Desktop version 2018.3 on a Mac.
Edit: The problem also seems to be on Windows and is not related to the maximum amount of columns or the view mode.
Example image of the described problem
You are not getting scrollbar because you are viewing it on a worksheet. Try putting it on the dashboard and set dashboard size to fixed and increase width to accommodate all columns.
now you will get horizontal scrollbar for sure
thanks
Besides updating the horizontal row/column label limit #Bernardo mentioned here:
You'll need to make sure you've have selected "Standard" from the display option list at the top of the screen. That options prevent Tableau from fitting everything into the height, width or view of your current display.
Tableau shows a horizontal scroll bar for measures, but not for dimensions. When only dimensions are included on either the Columns or Rows shelf, the lower horizontal scroll bar will not display. Dimensions are treated as headers for measure aggregations and do not generate a horizontal scroll bar when they exceed the width of the view.
To change the Table Layout and increase the number of columns and rows in your table, go to:
Analysis > Table Layout > Advanced
Set each of the Maximum values to 16, which is the limit allowed.

Stacked table column widths

You can use a GeneXus HTML table to layout text blocks and attributes. If I add a second table to contain some other information that I want to conditionally display, quite often, the first cell is a different width to the first cells of the table stacked above it.
How do you make all the columns/cells the same width so that stacked tables display with their contents correctly aligned?
This is for GeneXus Web in Evo 2 & 3.
Thanks
Put a value in the width property of the client table first cell.
So, put the same value in the width property of the password table first cell.
Remember that the width value must be enough for both tables. In your case, the biggest textblock is the "Client Name". So, choose a width enough for that.
Best regards.
If you don't set a width, HTML will assume the minimum width required to accommodate the content. If you don't want it to be set automatically when when the page is displayed, you have to decide on a width.
In your case, you have to put the same width value for a cell (any cell) in the first column of both tables.

SlickGrid: 2 questions: 1) change the orientation of column labels and 2) display d3.js elements inside cells

New to SlickGrid here, and have a couple questions:
1) Is it possible to change the orientation of the column labels? I would like to display a grid without horizontal scrolling, and the data can easily fit if I limit the width of each column. However is I do that, I dont have enough space for my column labels. So I am wondering if - like in excel - I could change the orientation of the column labels (to say 45 degreees vs. horizontal)? If not, any other suggestion?
2) Is it possible to display D3.js type elements (shapes etc) inside cells? If not, are there options to display things such as color coded stop-lights type things?
As you might have guessed, I am building a dashboard that pulls data from a summary table in a DB, and need visual eye candy. It's probably all doable in D3.js, but I'm looking for a faster way to implement, and a data grid appears appropriate.

jqgrid automated columns width

I have a table where I show some columns depending on users choice stored in database.
What I want is:
If all columns width is shorter than table width, expand columns to use the entire table width.
If all columns width is longer than table width, make columns narrower so no horizontal scrollbar appears.
If I manually change a column width within the table (using the vertical line next to the column header), I need the other columns to autoresize so the full width is 100% (not longer nor narrower) of table width.
I've been using the parameters autowidth, shrinkToFit and forceFit, but when full width is ok, then if I resize a column manually a horizontal scrollbar appears. I cannot find the correct combination of those parameters so the table behaves like that.
Any idea on how to put those values to get my aim?
Thank you very much-

How do I autosize the column in SlickGrid?

I want slickgrid to autosize the columns based on the widest content or header text - whichever is wider. In simpler terms, I want it to simulate the default behavior of regular HTML tables when it comes to column sizing. How can I do it in slickgrid?
When constructing your options, you can use forceFitColumns: true
var options = {
enableCellNavigation: true,
forceFitColumns: true
};
This will make the columns fill the entire width of your grid div.
The OP is looking for columns to grow to match their content. grid.autosizeColumns() grows the cells to fit the parent container, which is not the same thing.
I have added this feature, and it is about as manual as you might imagine. You loop through the displayed cells and measure each one, saving the widest cell and using that width to set the width of your column. SlickGrid gives you good access to the cells in the viewport, so that works nicely.
The measurement algorithm is your big decision. You may put the content off screen and measure it, as #jay suggests. This works, but it is the slowest method, as it requires a repaint to insert, and a repaint when you remove. There may be ways to optimize. The solution I went with is to measure the width of every letter in the alphabet, as well as other typographic characters we come across, and sum them to generate a width. Yes, this sounds absurd. It has many constraints: The font size must be the same, it doesn't support images, there can't be any line returns, and more. If you can live with the constraints though, you can calculate sizes for a huge grid viewport in <5ms, because the character widths are only measured once.
After you get the sizes of the columns, you assign them to your columns using grid.setColumns().
Slickgrid will not support column auto size based on data.You need to write a plugin or fork the slickgrid core to modify.
Here is the link I have created a plugin to handle slickgrid auto size
https://github.com/naresh-n/slickgrid-column-data-autosize
I added this after the grid is drawn and it works fine.
$(window).resize(function() {
var cols = grid.getColumns();
grid.setColumns(cols);
})
You should be able to call the autosizeColumns() method of the grid object.
grid.autosizeColumns();
Make this simple adjustment to Naresh's https://github.com/naresh-n/slickgrid-column-data-autosize, on the init function:
Add $container.ready(resizeAllColumns); to the init function.
This ensures the columns autoresize on initial load
Insert the text into an off-screen element and retrieve the width of the element. This is what excanvas does to measure text. Use this to set the width of the column since it's expecting a pixel value.

Resources